Synthetic commit for tag v_2_9_7 v_2_9_7
authorFabian Keil <fk@fabiankeil.de>
Wed, 27 Mar 2002 15:30:26 +0000 (15:30 +0000)
committerFabian Keil <fk@fabiankeil.de>
Wed, 27 Mar 2002 15:30:26 +0000 (15:30 +0000)
180 files changed:
.gitignore [deleted file]
AUTHORS [deleted file]
ChangeLog [deleted file]
GNUmakefile.in [deleted file]
Junkbuster Status.URL [new file with mode: 0644]
LICENSE [deleted file]
Makefile [deleted file]
Makefile.in [new file with mode: 0644]
README [deleted file]
acconfig.h
actionlist.h
actions.c
actions.h
actionsfile [moved from default.action with 76% similarity, mode: 0755]
advanced.action [deleted file]
amiga.c
amiga.h
basic.action [deleted file]
cgi.c
cgi.h
cgiedit.c [deleted file]
cgiedit.h [deleted file]
cgisimple.c [deleted file]
cgisimple.h [deleted file]
config
config.guess [deleted file]
config.h.in [new file with mode: 0644]
config.h.win
config.h.win32threads.win
config.sub [deleted file]
configure [new file with mode: 0755]
configure.in
console_junkbuster.dsp [moved from vc_console.dsp with 83% similarity, mode: 0755]
contrib.sh [deleted file]
cygwin.h
deanimate.c
deanimate.h
default.filter [deleted file]
doc/.gitignore [deleted file]
doc/STANDARDS.txt [new file with mode: 0644]
doc/USER_DOC_IS_WIDELY_OBSOLETED [new file with mode: 0644]
doc/changes.txt [new file with mode: 0644]
doc/fb.gif [moved from doc/obsolete/fb.gif with 100% similarity]
doc/gpl.html
doc/ijbfaq.html [moved from doc/obsolete/ijbfaq.html with 97% similarity]
doc/ijbman.html [moved from doc/obsolete/ijbman.html with 97% similarity]
doc/pcrs.3 [deleted file]
doc/source/.gitignore [deleted file]
doc/source/developer-manual.sgml [deleted file]
doc/source/faq.sgml [deleted file]
doc/source/ldp.dsl [deleted file]
doc/source/user-manual.sgml [deleted file]
doc/text/developer-manual.txt [deleted file]
doc/text/faq.txt [deleted file]
doc/text/user-manual.txt [deleted file]
doc/top.gif [moved from doc/obsolete/top.gif with 100% similarity]
doc/webserver/.gitignore [deleted file]
doc/webserver/.htaccess [deleted file]
doc/webserver/README.txt
doc/webserver/config/.htaccess [deleted file]
doc/webserver/config/index.php [deleted file]
doc/webserver/default_page.php [deleted file]
doc/webserver/developer-manual.html [new file with mode: 0644]
doc/webserver/documentation-guidelines.html [new file with mode: 0644]
doc/webserver/faq.html [new file with mode: 0644]
doc/webserver/index.html
doc/webserver/p_doc.css [deleted file]
doc/webserver/p_web.css [deleted file]
doc/webserver/redirect.php
doc/webserver/robots.txt [deleted file]
doc/webserver/swa.css [new file with mode: 0644]
doc/webserver/testplan.html [new file with mode: 0644]
doc/webserver/user-manual.html [new file with mode: 0644]
encode.c
encode.h
errlog.c
errlog.h
filters.c
filters.h
gateway.c
gateway.h
icons/denyrule.ico [new file with mode: 0644]
icons/icon1.ico [new file with mode: 0644]
icons/idle.ico
icons/junkbust.ico [new file with mode: 0644]
icons/os2.ico [deleted file]
icons/os20.ico [deleted file]
icons/os21.ico [deleted file]
icons/os22.ico [deleted file]
icons/os23.ico [deleted file]
icons/os24.ico [deleted file]
icons/os25.ico [deleted file]
icons/os26.ico [deleted file]
icons/os27.ico [deleted file]
icons/os28.ico [deleted file]
icons/privoxy.ico [deleted file]
install-sh [deleted file]
intermediate.action [deleted file]
jbsockets.c
jbsockets.h
jcc.c
jcc.h
junkbuster-rh.spec [new file with mode: 0644]
junkbuster-suse.spec [new file with mode: 0644]
junkbuster.1 [new file with mode: 0644]
junkbuster.init [new file with mode: 0644]
junkbuster.init.suse [new file with mode: 0644]
junkbuster.logrotate [moved from privoxy.logrotate with 56% similarity]
junkbuster.monthly [moved from privoxy.monthly with 87% similarity]
junkbuster.weekly [moved from privoxy.weekly with 84% similarity]
killpopup.c
killpopup.h
list.c
list.h
loadcfg.c
loadcfg.h
loaders.c
loaders.h
miscutil.c
miscutil.h
parsers.c
parsers.h
pcre/config.h
pcre/pcre.in
pcre/pcreposix.c
pcrs.c
pcrs.h
privoxy-rh.spec [deleted file]
privoxy-suse.spec [deleted file]
privoxy.1 [deleted file]
privoxy.init [deleted file]
privoxy.init.suse [deleted file]
project.h
re_filterfile [new file with mode: 0644]
showargs.c [new file with mode: 0644]
showargs.h [new file with mode: 0644]
ssplit.c
ssplit.h
templates/blocked
templates/blocked-compact
templates/cgi-error-404 [deleted file]
templates/cgi-error-bad-param [deleted file]
templates/cgi-error-disabled [deleted file]
templates/cgi-error-file [deleted file]
templates/cgi-error-modified [deleted file]
templates/cgi-error-parse [deleted file]
templates/connect-failed
templates/default
templates/edit-actions-add-url-form [deleted file]
templates/edit-actions-for-url [deleted file]
templates/edit-actions-for-url-filter [deleted file]
templates/edit-actions-list [deleted file]
templates/edit-actions-list-section [deleted file]
templates/edit-actions-list-url [deleted file]
templates/edit-actions-remove-url-form [deleted file]
templates/edit-actions-url-form [deleted file]
templates/no-such-domain
templates/show-request [deleted file]
templates/show-status
templates/show-status-file
templates/show-url-info
templates/show-version [deleted file]
templates/toggle [deleted file]
templates/toggle-mini [deleted file]
templates/untrusted
testdrive.status [deleted file]
urlmatch.c [deleted file]
urlmatch.h [deleted file]
vc_junkbuster.dsp [moved from vc_privoxy.dsp with 81% similarity]
vc_junkbuster.dsw [moved from vc_privoxy.dsw with 82% similarity]
w32.rc
w32log.c
w32log.h
w32res.h
w32rulesdlg.c [new file with mode: 0644]
w32rulesdlg.h [new file with mode: 0644]
w32taskbar.c
w32taskbar.h
win32.c
win32.h

diff --git a/.gitignore b/.gitignore
deleted file mode 100644 (file)
index 9ea1fd2..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-# CVS default ignores begin
-tags
-TAGS
-.make.state
-.nse_depinfo
-*~
-#*
-.#*
-,*
-_$*
-*$
-*.old
-*.bak
-*.BAK
-*.orig
-*.rej
-.del-*
-*.a
-*.olb
-*.o
-*.obj
-*.so
-*.exe
-*.Z
-*.elc
-*.ln
-core
-# CVS default ignores end
-*.txt
-GNUmakefile
-Makefile
-configure
-config.cache
-config.h
-config.h.in
-config.log
-config.status
-jarfile
-junkbstr.txt
-junkbuster
-junkbuster.log
-logfile
-permissionsfile
-privoxy
-privoxy.exe
-re_filterfile
-vc_debug
-vc_debug_winthr
-vc_junkbuster.ncb
-vc_junkbuster.opt
-vc_junkbuster.plg
-vc_release
-vc_release_winthr
-w32.aps
-w32.res
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644 (file)
index 9bece11..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,53 +0,0 @@
-              Authors of Privoxy v2.9.x and 3.x
-===========================================================================
-
-Current Project developers:
-
- Stefan Waldherr
- Andreas Oesterhelt
- Jon Foster
-
- Markus Breitenbach
- Thomas Steudten
-
-Current Project Contributors (in alphabetical order):
-
- David Schmidt (OS/2, Mac OSX ports)
- Gabriel L. Somlo
- Hal Burgiss (docs)
- Haroon Rafique
- John Venvertloh
- Joerg Strohmayer
- Rodney Stromlund
- Rodrigo Barbosa (RPM specfiles)
- Sarantis Paskalis
- Shamim Mohamed
-
-Originally developed by:
-
- Junkbusters Corp.
- Anonymous Coders
-
-Thanks to the many people who have tested Privoxy, reported bugs,
-or made suggestions. These include (in alphabetical order):
-
- Aaron Hamid
- Alexander Lazic  (FreeBSD patch)
- Andrew J. Caines
- Bart Schelstraete
- Clifford Caoile
- Darren Wiebe
- Gabor Liptak
- Guy
- Ken Arromdee
- Magnus Holmgren
- Paul Lieverse
- Peter E
- Reiner Buehl
-
-If we've missed you off this list, please let us know!
-
-Privoxy team. http://www.privoxy.org/
-ijbswa-developers@lists.sourceforge.net
-
-
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644 (file)
index e16c454..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,202 +0,0 @@
---------------------------------------------------------------------
-ChangeLog for Internet JunkBuster
---------------------------------------------------------------------
-
-*** Version 2.9.13 Beta *** 
-
-- *NEWS*: The project has been renamed to Privoxy! The new name is 
-reflected throughout (file locations, etc).
-- ijb.action is now default.action. re_filterfile is now 
-default.filter.
-- http://i.j.b/ is now http://p.p/
-- The 'logo' option for replacing ad iamges is removed now. 'Pattern' 
-(checkerboard) is now the default.
-
-
-*** Version 2.9.12 Beta *** 
-
-- **READ**: The default listening PORT is NOW 8118!!! Changed from 
-8000 due to conflict with NAS (Network Audio Server, whatever that 
-is.)
-- More CGI actions editor fixes and improvements.
-- Win32 command line fix ups.
-- re_filterfile now has modular sections that can be activated on a 
-per site basis. Some new goodies there too.
-- +filter now takes arguments to match FILTER sections in re_filterfile
-for even more flexibility. 
-- Added a new image blocker option: +image-blocker{pattern}, which 
-displays a checkerboard patthern and scales better than the logo.
-- PNG images will be used in place of GIF for JB built-in images
-if configured with --enable-no-gif.
-- Clean up compiler warnings (mostly).
-- Improved handling of failed DNS lookups & diagnostics for failed bind
-to listen socket
-- Made --no-daemon mode log to tty instead of logfile.
-- Various spec file and init script cleanups and improvements (Redhat and
-SuSE).
-- CGI Editor works on OS/2 now.
-- Fix restart failure where sockets were in TIME_WAIT.
-- Fixes for actions cgi editor, make sure we have right file.
-- A --pidfile command line option now, in addition to --help, 
---version, --no-daemon, --user and configfile. --no-daemon replaces
-the former -d option and _DEBUG define. --user will drop privileges 
-to the specified user.
-- Signal handling cleanups (*nix).
-- CGI actions editor improvements and fixes.
-- Error handling improvements, especially out of memory.
-- Default re_filterfile fix that caused spurious IJB logos 
-(instead of 'blank').
-- configure.in threading fixes for Solaris.
-- Various other minor fixes.
-
-
-*** Version 2.9.11 Beta Changes ***
-
-- Add "session" cookie concept where cookies exist for the life 
-of that browser session only (ie never goes to disk). 
-- Checks for correct header length.
-- Fix user:pass@host.domain.com auth bug.
-- Better signal handling on *nix.
-- Fix CFLAGS hard-coded in configure.in
-- Fix threading bug re: gethostbyname() that caused random 
-URLs to fail in some cases.
-
-
-*** Version 2.9.11 Alpha Changes ***
-
-- A web-based editor for the actions file is included (go to http://i.j.b/).
-- Web-based toggle IJB on/off support.
-- Cookie handling has changed - the new +no-cookies-keep feature is now the
-default.
-- actionsfile is renamed to ijb.action.
-- junkbstr.txt is now config.txt on Win32.
-- Support for running IJB as a UNIX daemon process has improved.
-- Unix daemon now returns error code on failed start.
-- Timestamps in logfile and jarfile now.
-- Fix for the Netscape bug reintroduced in 2.9.9.
-- make should now abort if gmake (GNU make) not present.
-- Many other minor bugfixes
-- Start a ChangeLog :)
-
-
-
-*** Version 2.9.3 pre-Alpha Changes ***
-
-- Amiga support (completely untested by me - I don't have an Amiga)
-- "tinygif 3" support (redirects blocked images to a specified URL, so
-the browser doesn't have to load and cache many copies of the same
-image).
-- one case where there were both local and global "referrer" variables
-(yuck!) clarified by renaming the local one to "refer".
-- Fixed some places where close() was used instead of close_socket().
-Thanks to Jörg Strohmayer (joergs at users.sourceforge.net) for these.
-- Temporary hack to get FORCE_LOAD to work with IE.  I just lowercased the
-FORCE_LOAD_PREFIX.  Needs fixing properly.
-- Most URLs hardcoded into JunkBuster were changed to go through a script
-e.g. http://ijbswa.sourceforge.net/redirect.php?v=2.9.3&to=faq
-The only other URLs left are the GNU GPL:
-  http://www.fsf.org/copyleft/gpl.html
-and the home page:
-  http://ijbswa.sourceforge.net/
-... and various URLs which will be intercepted by JunkBuster anyway.
-TODO: Still need to do something with the URLs in JunkBuster Corp's 
-copyright/trademark notice on the bottom of the show-proxy-args page.
-- PCRE or GNU Regex is now a #define option.
-
-
-*** Version 2.9.2 pre-Alpha Changes ***
-
-- Andreas applied the latest version of the FORCE patch.
-
-
-*** Version 2.9.1 pre-Alpha Changes ***
-
-- in parsers.c, fixed two #ifdef FORCE to #ifdef FORCE_LOAD
-(BTW: I think FORCE is precise enough, since loading remote
-data is the whole purpose of a proxy..)
-- Set the FORCE_PREFIX (back) to 'IJB-FORCE-LOAD-'. While 'noijb.'
-is more elegant and looks like a hostname in the URL, it doesn't
-make clear to the inexperienced user that the proxy is bypassed. It
-also has a higher name collision risk.
-- Filled in the function header templates for my functions in
-parsers.c (again). They obviously got lost in our current
-patch war ;-)
-- Cut the credit for the Â§-referrer-option from the config file,
-that Stefan had placed there.
-- Improved the re_filterfile 
-
-
-*** Version 2.9.0 pre-Alpha Changes ***
-
--  Now use PCRE, not GNU REGEX.  I have not yet had chance to check the
-syntax of the block/image/cookie file to ensure that they match what
-is expected - however they seem to work.
--  Replaced "configure" script with one generated by "autoconf".  Also 
-use a header "config.h" (was ijbconfig.h in my previous release) for 
-the #defines.  "config.h" is now generated with "autoheader" from 
-"acconfig.h" and "configure.in".  (Note that to install you do not
-need autoconf or autoheader - just run "./configure".)
-To see command-line options, run "./configure --help".
-This is my first ever autoconf script, so it has some rough edges
-(how PCRE is handled is the roughest).
--  Error logging code replaced with new module errlog.c, based on the
-one from JunkBusterMT (but with the threading code removed).
--  Most of Rodney's 0.21 and 0.21A patches applied. (Marked *).  I did not
-apply all of these, since I had already independently done conditional
-popup file, conditional image file, and integration of popup code.
-- ACL, Jar and trust files conditionally compiled.
-- New source file headers.
-- Various cosmetic changes.  (But I have not consistently ordered the 
-config files - I think that's worthwhile, but it's 1am and I want to
-get this released!)
-- RCS tags on .h files.
--  RCS tags are const char[] rather than const char *.  (Saves 4 bytes
-per tag ;-)
-- VC++ project files renamed to vc_junkbuster.*.
-- show-proxy-args now shows status of all conditionals, not just REGEX
-- Various functions moved around.  Most notably all the system-specific
-sockets code which was spread between jcc.c, bind.c, and connect.c,
-has been moved to "jbsockets.c".  The non-system-specific code from
-connect.c and socks4.c has been movet to "gateway.c".  Also, the
-config file loader and the global variables it writes to have been
-moved to "loadcfg.c".  (Maybe this should go into loaders.c?)
-And candidate for the "worst filename ever" award is "miscutil.c",
-which contains, well, miscellaneous utility functions like zalloc.
-(Suggestions for a better name for this file are welcome!)
-- Loaders now use a common function to read a line and skip comments,
-and this function also stores the proxy_args.
-- Added ./junkbuster --help     (Not for Win32 GUI)
-- Added ./junkbuster --version  (Not for Win32 GUI)
-- Win32 resources are now all marked as "U.S. English", rather than
-being a mix of "U.S. English", "U.K. English" and "Irish English".
-- Version number changes to 2.9.0
-
-
-
-----------------------------------------------------------------------
-Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-               Privoxy team. http://www.privoxy.org/
-
-               Based on the Internet Junkbuster originally written
-               by and Copyright (C) 1997 Anonymous Coders and 
-               Junkbusters Corporation.  http://www.junkbusters.com
-
-               This program is free software; you can redistribute it 
-               and/or modify it under the terms of the GNU General
-               Public License as published by the Free Software
-               Foundation; either version 2 of the License, or (at
-               your option) any later version.
-
-               This program is distributed in the hope that it will
-               be useful, but WITHOUT ANY WARRANTY; without even the
-               implied warranty of MERCHANTABILITY or FITNESS FOR A
-               PARTICULAR PURPOSE.  See the GNU General Public
-               License for more details.
-
-               The GNU General Public License should be included with
-               this file.  If not, you can view it at
-               http://www.gnu.org/copyleft/gpl.html
-               or write to the Free Software Foundation, Inc., 59
-               Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-
diff --git a/GNUmakefile.in b/GNUmakefile.in
deleted file mode 100644 (file)
index 7726cc7..0000000
+++ /dev/null
@@ -1,945 +0,0 @@
-# Note:  Makefile is built automatically from Makefile.in
-#
-# $Id: GNUmakefile.in,v 1.36 2002/03/27 14:58:08 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-
-#############################################################################
-# Version number (for RPM)
-#############################################################################
-
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_POINT = @VERSION_POINT@
-CODE_STATUS   = @CODE_STATUS@
-VERSION       = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_POINT)
-# will automatically be postfixed with -$(RPM_PACKAGEV) in the SPECfile
-RPM_VERSION   = $(VERSION)
-RPM_PACKAGEV  = @VERSION_RPM_PACKAGE@
-
-
-#############################################################################
-# Directories for "make install"
-#############################################################################
-
-DEST        = @sysconfdir@/privoxy
-SBIN_DEST   = @sbindir@
-MAN_DEST    = @mandir@
-
-
-#############################################################################
-# Build tools
-#############################################################################
-
-PROGRAM    = privoxy@EXEEXT@
-CC         = @CC@
-ECHO       = echo
-GZIP_PROG  = gzip
-INSTALL    = cp -f
-LD         = @CC@
-RM         = rm -f
-STRIP_PROG = strip
-SED       = sed
-CAT        = cat
-RPM        = rpm
-MV        = mv
-TAR        = tar
-MAKE       = make
-LN         = ln
-WDUMP      = @WDUMP@ -dump
-JADEBIN    = @JADEBIN@
-DB         = $(JADEBIN) -t sgml -ihtml -D.. -d ldpOK.dsl\#html
-DB2HTML    = @DB2HTML@
-DKPREFIX   = @DKPREFIX@
-MAN2HTML   = @MAN2HTML@
-TARGET_OS  = foobar
-
-# Program to do LF->CRLF
-#
-# The sed version should be the most portable, but it doesn't for for me,
-# the other two do.  FIXME.
-#   - Jon
-#DOSFILTER  = $(SED) -e $$'s,$$,\r,'
-#DOSFILTER  = gawk -v ORS='\r\n' '{print $0;}'
-DOSFILTER  = perl -p -e 's/\n/\r\n/'
-
-#############################################################################
-# Setup for make distribution rh and suse for now 
-#############################################################################
-
-TAR_ARCH = /tmp/privoxy-$(RPM_VERSION).tar.gz
-RPM_BASE = @RPM_BASE@
-
-#############################################################################
-# Filenames and libraries
-#############################################################################
-
-C_SRC  = actions.c cgi.c cgiedit.c cgisimple.c deanimate.c encode.c \
-         errlog.c filters.c gateway.c jbsockets.c jcc.c killpopup.c \
-         list.c loadcfg.c loaders.c miscutil.c parsers.c ssplit.c \
-         urlmatch.c
-
-C_OBJS = $(C_SRC:.c=.@OBJEXT@)
-C_HDRS = $(C_SRC:.c=.h) project.h actionlist.h
-
-CONFIG_FILES = config trust \
-               default.action \
-               basic.action intermediate.action advanced.action \
-               default.filter \
-               templates/*
-
-DOC_FILES = AUTHORS LICENSE README ChangeLog doc/text/* privoxy.1
-
-W32_SRC   = @WIN_ONLY@w32log.c w32taskbar.c win32.c
-W32_FILES = @WIN_ONLY@w32.res
-W32_OBJS  = @WIN_ONLY@$(W32_SRC:.c=.@OBJEXT@) $(W32_FILES)
-W32_HDRS  = @WIN_ONLY@w32log.h w32taskbar.h win32.h w32res.h
-W32_LIB   = @WIN_ONLY@-lwsock32 -lcomctl32
-W32_INIS  = @WIN_ONLY@config.txt trust.txt
-
-PCRS_SRC     = @STATIC_PCRS_ONLY@pcrs.c
-PCRS_OBJS    = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.@OBJEXT@)
-PCRS_HDRS    = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.h)
-
-PCRE_SRC     = @STATIC_PCRE_ONLY@pcre/get.c pcre/maketables.c pcre/study.c pcre/pcre.c
-PCRE_OBJS    = @STATIC_PCRE_ONLY@$(PCRE_SRC:.c=.@OBJEXT@)
-PCRE_HDRS    = @STATIC_PCRE_ONLY@pcre/config.h pcre/chartables.c pcre/internal.h pcre/pcre.h
-
-# No REGEX (Either because dynamically linked pcreposix, or no regex at all):
-REGEX_SRC    =
-# GNU REGEX:
-@GNU_REGEX_ONLY@REGEX_SRC    = gnu_regex.c
-# PCRE REGEX:
-@PCRE_REGEX_ONLY@@STATIC_PCRE_ONLY@REGEX_SRC = pcre/pcreposix.c
-
-REGEX_OBJS   = $(REGEX_SRC:.c=.@OBJEXT@)
-REGEX_HDRS   = $(REGEX_SRC:.c=.h)
-
-# Dependencies introduced by #include "project.h".
-PROJECT_H_DEPS = project.h $(REGEX_HDRS) $(PCRS_HDRS) @STATIC_PCRE_ONLY@pcre/pcre.h
-
-# Socket libraries for platforms that need them explicitly defined
-SOCKET_LIB   = @SOCKET_LIB@
-
-# PThreads library, if needed.
-PTHREAD_LIB  = @PTHREAD_ONLY@@PTHREAD_LIB@
-
-SRCS         = $(C_SRC)  $(W32_SRC)  $(PCRS_SRC)  $(PCRE_SRC)  $(REGEX_SRC)
-OBJS         = $(C_OBJS) $(W32_OBJS) $(PCRS_OBJS) $(PCRE_OBJS) $(REGEX_OBJS)
-HDRS         = $(C_HDRS) $(W32_HDRS) $(PCRS_HDRS) $(PCRE_OBJS) $(REGEX_HDRS)
-LIBS         = @LIBS@ $(W32_LIB) $(SOCKET_LIB) $(PTHREAD_LIB)
-
-
-#############################################################################
-# Compiler switches
-#############################################################################
-
-# The flag "-mno-win32" can be used by Cygwin to emulate a un?x type build.
-# The flag "-mwindows -mno-cygwin" will cause Cygwin to use MingW32 for a
-# Win32 GUI build.
-# The flag "-pthread" is required if using Pthreads under Linux (and
-# possibly other OSs).
-SPECIAL_CFLAGS = @SPECIAL_CFLAGS@
-
-# Add your flags here 
-OTHER_CFLAGS =   
-
-CFLAGS = @CFLAGS@ @CPPFLAGS@ $(OTHER_CFLAGS) $(SPECIAL_CFLAGS) -Wall \
-         @STATIC_PCRE_ONLY@ -Ipcre 
-
-LDFLAGS = $(DEBUG_CFLAGS) $(SPECIAL_CFLAGS)
-
-
-#############################################################################
-# Build section.
-#
-# There should NOT be any targets above this line.
-#############################################################################
-all: $(PROGRAM)
-
-
-#############################################################################
-# Phony targets
-#############################################################################
-.PHONY: all inifiles redhat-dist redhat-upload solaris-dist suse-dist \
-suse-upload win-dist tarball-dist dok redhat-dok webserver clean clobber tags \
-install
-
-
-#############################################################################
-# Define this explicitly because Solaris is broken!
-#############################################################################
-%.o: %.c
-       $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
-
-
-#############################################################################
-# Win32 config files
-#############################################################################
-
-inifiles: $(W32_INIS)
-
-config.txt: config
-       $(SED) -e 's!\trustfile trust!trustfile trust.txt!' \
-              -e 's!\jarfile jarfile!jarfile jar.log!' \
-              -e 's!\logfile logfile!logfile privoxy.log!' \
-              -e 's!#Win32-only: !!' \
-              < $< | \
-              $(DOSFILTER) > $@
-       # LF to CRLF in default.action
-       $(DOSFILTER) <default.action >default.action.txt && mv default.action.txt default.action
-       # LF to CRLF in default.filter
-       $(DOSFILTER) <default.filter >default.filter.txt && mv default.filter.txt default.filter
-
-trust.txt: trust
-       $(DOSFILTER) < $< > $@ 
-
-re_filterfile.txt: re_filterfile
-       $(DOSFILTER) < $< > $@ 
-
-
-#############################################################################
-# redhat distribution alpha and x86
-#############################################################################
-
-redhat-dist:
-       for dir in RPMS SRPMS BUILD SOURCES SPECS; do \
-               if [ ! -w $(RPM_BASE)/$$dir ]; then \
-                       $(ECHO) "$(RPM_BASE)/$$dir is not writable for you. Maybe try as root."; \
-                       $(ECHO) "Or add a suitable path to .rpmmacros like."; \
-                       $(ECHO) "%_topdir /home/foo/rpm-build"; \
-                       exit 1; \
-               fi; \
-       done; \
-
-       $(MAKE) clobber
-       if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi
-
-       TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \
-       if $(SED) -e 's/^\(Version:\).*/\1 $(RPM_VERSION)/g' \
-             -e 's/^\(Release:\).*/\1 $(RPM_PACKAGEV)/g' \
-              privoxy-rh.spec > $$TMPFILE ; then \
-      $(MV) -f $$TMPFILE privoxy-rh.spec; \
-   else \
-      $(ECHO) "Could not set version info in specfile."; \
-      exit 1;\
-   fi
-
-       $(TAR) --exclude "CVS" --exclude "privoxy-suse.spec" -czf $(TAR_ARCH) .
-       $(RPM) --clean -ta  $(TAR_ARCH)
-       if [ -f $(TAR_ARCH) ]; then  $(RM) $(TAR_ARCH); fi
-
-#
-# anonymously ncftps the rpms to sourceforge
-#
-redhat-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/SRPMS/privoxy-$(RPM_VERSION)-$(RPM_PACKAGEV).src.rpm
-# better should use `arch` here instead of ix86 to support other platforms too
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/RPMS/*/privoxy-$(RPM_VERSION)-$(RPM_PACKAGEV).*.rpm
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-     # w3m http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-
-#############################################################################
-# sun solaris  distribution
-#############################################################################
-
-solaris-dist:
-       @$(ECHO) ""
-       @$(ECHO) "You have run autoconf && autoheader && ./configure right?"
-       @$(ECHO) ""
-       $(MAKE) $(PROGRAM)
-       $(STRIP_PROG) $(PROGRAM)
-       $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS)
-# add program
-       $(TAR) -C.. -cvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$(PROGRAM)
-# add config files
-       for foo in $(CONFIG_FILES); do \
-               $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -uvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$$foo; \
-       done; 
-# add documentation
-       for foo in $(DOC_FILES); do \
-               $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -uvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$$foo; \
-       done; 
-# and zip the archive
-       $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS)
-       $(GZIP_PROG) privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar
-       @$(ECHO) Distribution with binary created.
-
-# anonymously ncftps the tarball to sourceforge
-solaris-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar.gz
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-
-# use with care
-solaris-clean:
-       $(RM) privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar*
-
-#############################################################################
-# hpux distribution
-#############################################################################
-hpux-dist:
-       @$(ECHO) coming soon. 
-hpux-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# debian distribution
-#############################################################################
-debian-dist:
-       @$(ECHO) coming soon. 
-debian-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# macosx distribution
-#############################################################################
-macosx-dist:
-       @$(ECHO) coming soon. 
-macosx-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# amiga distribution
-#############################################################################
-amiga-dist:
-       @$(ECHO) coming soon. 
-amiga-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# freebsd distribution
-#############################################################################
-freebsd-dist:
-       @$(ECHO) coming soon. 
-freebsd-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# suse distribution. works fine. no need to be root. 
-#############################################################################
-suse-dist:
-       for dir in RPMS SRPMS BUILD SOURCES SPECS; do \
-               if [ ! -w $(RPM_BASE)/$$dir ]; then \
-                       $(ECHO) "$(RPM_BASE)/$$dir is not writable for you. Maybe try as root."; \
-                       $(ECHO) "Or add a suitable path to .rpmmacros like."; \
-                       $(ECHO) "%_topdir /home/foo/rpm-build"; \
-                       exit 1; \
-               fi; \
-       done; \
-
-       $(MAKE) clobber
-       if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi
-
-       TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \
-       if $(SED) -e 's/^\(Version:\).*/\1 $(RPM_VERSIO)/g' \
-             -e 's/^\(Release:\).*/\1 $(RPM_PACKAGEV)/g' \
-              privoxy-suse.spec > $$TMPFILE ; then \
-      $(MV) -f $$TMPFILE privoxy-suse.spec; \
-   else \
-      $(ECHO) "Could not set version info in specfile."; \
-      exit 1;\
-   fi
-
-       $(TAR) --exclude "CVS" --exclude "privoxy-rh.spec" -czf $(TAR_ARCH) .
-       $(RPM) --clean -ta  $(TAR_ARCH)
-       if [ -f $(TAR_ARCH) ]; then  $(RM) $(TAR_ARCH); fi
-
-#
-# anonymously ncftps the rpms to sourceforge
-#
-suse-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/SRPMS/privoxy-suse-$(RPM_VERSION)-$(RPM_PACKAGEV).src.rpm
-# better should use `arch` here instead of ix86 to support other platforms too
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/RPMS/*/privoxy-suse-$(RPM_VERSION)-$(RPM_PACKAGEV).*.rpm
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-
-# handle with care. use with root.
-suse-clean:
-       rpm -e junkbuster-suse || true
-       rm -rf /etc/junkbuster
-       rm -rf /etc/rc.d/junkbuster*
-       rm -rf /var/run/junkbuster.pid 
-       rm -rf /var/log/junkbuster
-       rm -f /etc/init.d/junkbuster
-       rm -f /usr/sbin/junkbuster
-       rm -f /usr/sbin/rcjunkbuster
-       rm -f /usr/share/man/man1/junkbuster.1.gz
-       rpm -e privoxy-suse || true
-       rm -rf /etc/privoxy
-       rm -rf /etc/rc.d/privoxy*
-       rm -rf /var/run/privoxy.pid 
-       rm -rf /var/log/privoxy
-       rm -f /etc/init.d/privoxy
-       rm -f /usr/sbin/privoxy
-       rm -f /usr/sbin/rcprivoxy
-       rm -f /usr/share/man/man1/privoxy.1.gz
-
-#############################################################################
-# Windows distribution
-#############################################################################
-win-dist:
-       $(ECHO) Not implemented.
-
-
-#############################################################################
-# Tarball distribution
-#############################################################################
-tarball-dist: clobber
-       $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS)
-       $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -cvhzf privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz privoxy-$(VERSION)-$(CODE_STATUS)
-       $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS)
-       @$(ECHO) Tarball (without any binary) created.
-
-# anonymously ncftps the tarball to sourceforge
-tarball-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-
-# handle with care
-tarball-clean:
-       $(RM) privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz
-
-#############################################################################
-#
-# Documentation
-#
-# converts doc/source/*.sgml into html, text and man pages
-#
-#############################################################################
-dok: doc/source/ldpOK.dsl man2html-swa
-       mkdir -p doc/text doc/man
-#  user manual
-       rm -rf doc/webserver/user-manual
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl user-manual.sgml && mv user-manual ../webserver
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks user-manual.sgml > tmp.html && lynx -dump tmp.html > ../text/user-manual.txt && rm -rf tmp.html user-manual
-##  developer manual
-       rm -rf doc/webserver/developer-manual
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl developer-manual.sgml && mv developer-manual ../webserver
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks developer-manual.sgml > tmp.html && lynx -dump tmp.html > ../text/developer-manual.txt && rm -rf tmp.html developer-manual
-##  faq
-       rm -rf doc/webserver/faq
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl faq.sgml && mv faq ../webserver
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks faq.sgml > tmp.html && lynx -dump tmp.html > ../text/faq.txt && rm -rf tmp.html faq
-
-man2html-swa:
-       if [ "$(MAN2HTML)" != "false" ]; then \
-               mkdir -p doc/webserver/man-page; \
-               $(ECHO) "<html><head><title>Privoxy|Doc/Man page</title><link rel=\"stylesheet\" type=\"text/css\" href=\"../p_web.css\"></head><body><H2>NAME</H2>" > doc/webserver/man-page/privoxy-man-page.html; \
-               man ./privoxy.1 | $(MAN2HTML) -bare \
-                >> doc/webserver/man-page/privoxy-man-page.html; \
-               $(ECHO) "</body></html>" >> doc/webserver/man-page/privoxy-man-page.html; \
-       fi
-
-redhat-dok: doc/source/ldpOK.dsl man2html
-       mkdir -p doc/text doc/man doc/source/user-manual \
-          doc/source/developer-manual doc/source/faq
-##  user manual
-       rm -rf doc/webserver/user-manual
-       cd doc/source/user-manual && $(DB) ../user-manual.sgml && cd .. &&\
-          mv user-manual ../webserver
-       cd doc/source && $(DB) -V nochunks user-manual.sgml > tmp.html && \
-          $(WDUMP) tmp.html > ../text/user-manual.txt && rm -rf tmp.html \
-          user-manual
-##  developer manual
-       rm -rf doc/webserver/developer-manual
-       cd doc/source/developer-manual && $(DB) ../developer-manual.sgml &&\
-          cd .. && mv developer-manual ../webserver
-       cd doc/source && $(DB) -V nochunks developer-manual.sgml > tmp.html && \
-          $(WDUMP) tmp.html > ../text/developer-manual.txt && rm -rf tmp.html \
-          developer-manual
-##  faq
-       rm -rf doc/webserver/faq
-       cd doc/source/faq && $(DB) ../faq.sgml && cd .. && mv faq ../webserver
-       cd doc/source && $(DB) -V nochunks faq.sgml > tmp.html && $(WDUMP) \
-          tmp.html > ../text/faq.txt && rm -rf tmp.html faq
-
-doc/source/ldpOK.dsl:
-       if [ "$(DKPREFIX)" != "none" ]; then \
-               sed -e "s@/usr/share/sgml/docbook/dsssl-stylesheets@$(DKPREFIX)@g" doc/source/ldp.dsl > doc/source/ldpOK.dsl; \
-       else \
-               cp doc/source/ldp.dsl doc/source/ldpOK.dsl; \
-       fi
-
-man2html:
-       if [ "$(MAN2HTML)" != "false" ]; then \
-               $(MAN2HTML) privoxy.1 |grep -v "^Content-type" > doc/webserver/man-page/privoxy-man-page.html; \
-       fi
-
-#############################################################################
-#
-# Webserver
-#
-# moves dokumentation to webserver
-#
-#############################################################################
-webserver:
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) You have run make dok/redhat-dok before, right?
-       @$(ECHO) Note that this command scps all stuff to the webserver,
-       @$(ECHO) it will not remove obsolete documents.
-       @$(ECHO) -------------------------------------------------------
-       chmod -R a+r doc/webserver
-       find doc/webserver -type d -exec chmod a+rx {} \;
-       cd doc/webserver && scp -Cr . ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-
-#############################################################################
-# Source file dependencies
-#############################################################################
-
-actions.@OBJEXT@:   actions.c   actions.h   config.h $(PROJECT_H_DEPS) errlog.h jcc.h list.h loaders.h miscutil.h actionlist.h
-cgi.@OBJEXT@:       cgi.c       cgi.h       config.h $(PROJECT_H_DEPS) cgiedit.h cgisimple.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
-cgiedit.@OBJEXT@:   cgiedit.c   cgiedit.h   config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
-cgisimple.@OBJEXT@: cgisimple.c cgisimple.h config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
-deanimate.@OBJEXT@: deanimate.c deanimate.h config.h $(PROJECT_H_DEPS)
-encode.@OBJEXT@:    encode.c    encode.h    config.h
-errlog.@OBJEXT@:    errlog.c    errlog.h    config.h $(PROJECT_H_DEPS) @WIN_ONLY@w32log.h
-filters.@OBJEXT@:   filters.c   filters.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jbsockets.h jcc.h loadcfg.h parsers.h ssplit.h cgi.h deanimate.h @WIN_ONLY@win32.h 
-gateway.@OBJEXT@:   gateway.c   gateway.h   config.h $(PROJECT_H_DEPS) errlog.h jbsockets.h jcc.h loadcfg.h
-jbsockets.@OBJEXT@: jbsockets.c jbsockets.h config.h $(PROJECT_H_DEPS) filters.h
-jcc.@OBJEXT@:       jcc.c       jcc.h       config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h killpopup.h loadcfg.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h cgi.h
-killpopup.@OBJEXT@: killpopup.c killpopup.h config.h $(PROJECT_H_DEPS) jcc.h loadcfg.h
-list.@OBJEXT@:      list.c      list.h      config.h $(PROJECT_H_DEPS) list.h miscutil.h
-loadcfg.@OBJEXT@:   loadcfg.c   loadcfg.h   config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h jcc.h killpopup.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h
-loaders.@OBJEXT@:   loaders.c   loaders.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h ssplit.h
-miscutil.@OBJEXT@:  miscutil.c  miscutil.h  config.h
-parsers.@OBJEXT@:   parsers.c   parsers.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h jbsockets.h jcc.h loadcfg.h loaders.h miscutil.h ssplit.h
-ssplit.@OBJEXT@:    ssplit.c    ssplit.h    config.h miscutil.h
-urlmatch.@OBJEXT@:  urlmatch.c  urlmatch.h  config.h $(PROJECT_H_DEPS) errlog.h miscutil.h ssplit.h
-
-# GNU regex
-gnu_regex.@OBJEXT@: gnu_regex.c gnu_regex.h config.h
-
-# PCRS
-pcrs.@OBJEXT@: pcrs.c pcre/pcre.h pcrs.h
-
-# PCRE
-pcre/get.@OBJEXT@:        pcre/get.c        pcre/config.h pcre/internal.h pcre/pcre.h
-pcre/maketables.@OBJEXT@: pcre/maketables.c pcre/config.h pcre/internal.h pcre/pcre.h
-pcre/pcre.@OBJEXT@:       pcre/pcre.c       pcre/config.h pcre/internal.h pcre/pcre.h pcre/chartables.c 
-pcre/pcreposix.@OBJEXT@:  pcre/pcreposix.c  pcre/config.h pcre/internal.h pcre/pcre.h pcre/pcreposix.h
-pcre/study.@OBJEXT@:      pcre/study.c      pcre/config.h pcre/internal.h pcre/pcre.h
-
-# An auxiliary program makes the PCRE default character table source
-
-pcre/chartables.c:   pcre/dftables@EXEEXT@
-               pcre/dftables@EXEEXT@ >pcre/chartables.c
-
-pcre/dftables@EXEEXT@:       pcre/dftables.c pcre/maketables.c pcre/pcre.h pcre/internal.h pcre/config.h
-               $(CC) -o pcre/dftables@EXEEXT@ $(CFLAGS) pcre/dftables.c
-
-# Win32
-w32log.@OBJEXT@: w32log.c errlog.h config.h jcc.h loadcfg.h miscutil.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h w32taskbar.h win32.h
-w32taskbar.@OBJEXT@: w32taskbar.c config.h w32log.h w32taskbar.h
-win32.@OBJEXT@: win32.c config.h jcc.h loadcfg.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h win32.h
-
-w32.res: w32.rc w32res.h icons/ico00001.ico icons/ico00002.ico icons/ico00003.ico icons/ico00004.ico icons/ico00005.ico icons/ico00006.ico icons/ico00007.ico icons/ico00008.ico icons/idle.ico icons/privoxy.ico config.h
-       windres -D__MINGW32__=0.2 -O coff -i $< -o $@
-
-# AmigaOS
-@AMIGAOS_ONLY@OBJS += amiga.o
-@AMIGAOS_ONLY@CFLAGS += -D__AMIGAVERSION__=\"$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)\" -D__AMIGADATE__=\"`date +%d.%m.%Y`\" -W -m68020 -noixemul -fbaserel -msmall-code
-@AMIGAOS_ONLY@LDFLAGS += -m68020 -noixemul -fbaserel
-@AMIGAOS_ONLY@LIBS = -lm /gg/lib/libb/libm020/libnix/swapstack.o
-@AMIGAOS_ONLY@amiga.o: amiga.c amiga.h config.h
-
-
-$(PROGRAM): $(OBJS) $(W32_FILES)
-       $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS)
-
-clean:
-       $(RM) a.out core $(OBJS) $(W32_FILES) $(W32_INIS) $(PROGRAM) junkbuster
-
-clobber: clean
-       $(RM) $(PROGRAM) cscope.* logfile *.pdb *.lib *.exp `find . -name tags` `find . -name TAGS` config.status config.h.in config.log junkbuster.log privoxy.log config.cache *~ *.tar.gz configure
-
-tags: $(SRCS) $(HDRS)
-       etags $(SRCS) $(HDRS)
-
-install: all
-       #
-       # FIXME: This is a dirty hack to have an install target
-       #        that works at least for some setups. This needs
-       #        to be fixed!
-       #
-       $(STRIP_PROG) $(PROGRAM)
-       $(INSTALL) $(PROGRAM) $(SBIN_DEST)
-       mkdir -p $(DEST)/user-manual
-       mkdir -p $(DEST)/templates
-       cp -r doc/webserver/user-manual $(DEST)
-       cp -r templates $(DEST)
-       $(INSTALL) config default.action default.filter trust $(DEST)
-       # FIXME $(ECHO) privoxy.logrotate privoxy.monthly privoxy.weekly
-       # FIXME: Need new manual! $(GZIP_PROG) -c privoxy.1 > $(MAN_DEST)/privoxy.1.gz
-       $(INSTALL) privoxy.init /etc/init.d/privoxy
-
-
-#############################################################################
-
-## Local Variables:
-## tab-width: 3
-## end:
-
-# $Log: GNUmakefile.in,v $
-# Revision 1.36  2002/03/27 14:58:08  swa
-# can be used by mutilple targets
-#
-# Revision 1.35  2002/03/27 14:53:19  swa
-# added solaris-dist
-#
-# Revision 1.34  2002/03/27 10:30:11  swa
-# we want a html man file on the webserver
-#
-# Revision 1.33  2002/03/27 03:05:35  hal9
-# Added man2html target for docs (redhat-dok only for now)
-#
-# Revision 1.32  2002/03/26 22:29:54  swa
-# we have a new homepage!
-#
-# Revision 1.31  2002/03/26 14:00:18  swa
-# fixed make tarball, tarball-dist, tarball-clean
-#
-# Revision 1.30  2002/03/25 12:52:25  swa
-# new targets
-#
-# Revision 1.29  2002/03/24 17:03:55  jongfoster
-# Name change
-#
-# Revision 1.28  2002/03/24 16:19:48  swa
-# configure needs to be generated.
-#
-# Revision 1.27  2002/03/24 16:13:57  swa
-# generated files are a nono in cvs
-#
-# Revision 1.26  2002/03/24 15:36:02  swa
-# did not build.
-#
-# Revision 1.25  2002/03/24 14:31:08  swa
-# remove more crappy files. set RPM
-# release version correctly.
-#
-# Revision 1.24  2002/03/24 14:19:55  swa
-# set rpm package release in configure.in. nowhere else.
-#
-# Revision 1.23  2002/03/24 13:06:49  swa
-# suse-clean now runs fine
-#
-# Revision 1.22  2002/03/24 12:56:21  swa
-# name change related issues.
-#
-# Revision 1.21  2002/03/24 12:43:57  swa
-# name change
-#
-# Revision 1.20  2002/03/24 11:39:17  jongfoster
-# Renaming config files
-#
-# Revision 1.19  2002/03/22 20:53:03  morcego
-# - Ongoing process to change name to JunkbusterNG
-# - configure/configure.in: no change needed
-# - GNUmakefile.in:
-#         - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz
-#         - PROGRAM    = jbng@EXEEXT@
-#         - rh-spec now references as junkbusterng-rh.spec
-#         - redhat-upload: references changed to junkbusterng-* (package names)
-#         - tarball-dist: references changed to JunkbusterNG-distribution-*
-#         - tarball-src: now JunkbusterNG-*
-#         - install: initscript now junkbusterng.init and junkbusterng (when
-#                    installed)
-# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec
-# - junkbusterng.spec:
-#         - References to the expression ijb where changed where possible
-#         - New package name: junkbusterng (all in lower case, acording to
-#           the LSB recomendation)
-#         - Version changed to: 2.9.13
-#         - Release: 1
-#         - Added: junkbuster to obsoletes and conflicts (Not sure this is
-#           right. If it obsoletes, why conflict ? Have to check it later)
-#         - Summary changed: Stefan, please check and aprove it
-#         - Changes description to use the new name
-#         - Sed string was NOT changed. Have to wait to the manpage to
-#           change first
-#         - Keeping the user junkbuster for now. It will require some aditional
-#           changes on the script (scheduled for the next specfile release)
-#         - Added post entry to move the old logfile to the new log directory
-#         - Removing "chkconfig --add" entry (not good to have it automaticaly
-#           added to the startup list).
-#         - Added preun section to stop the service with the old name, as well
-#           as remove it from the startup list
-#         - Removed the chkconfig --del entry from the conditional block on
-#           the preun scriptlet (now handled on the %files section)
-# - junkbuster.init: renamed to junkbusterng.init
-# - junkbusterng.init:
-#         - Changed JB_BIN to jbng
-#         - Created JB_OBIN with the old value of JB_BIN (junkbuster), to
-#           be used where necessary (config dir)
-#
-# Aditional notes:
-# - The config directory is /etc/junkbuster yet. Have to change it on the
-# specfile, after it is changes on the code
-# - The only files that got renamed on the cvs tree were the rh specfile and
-# the init file. Some file references got changes on the makefile and on the
-# rh-spec (as listed above)
-#
-# Revision 1.18  2002/03/21 23:00:00  swa
-# want to autogenerate stuff.
-#
-# Revision 1.17  2002/03/19 19:30:04  morcego
-# - Fixing stylesheet checking on configure. If it is found, no further checks
-#   should be done
-#
-# - configure will now check for db2html or docbook2html (should work now
-#   on SuSe without the docbktls package)
-#
-# Revision 1.16  2002/03/14 22:32:32  hal9
-# Bumped the RPM version.
-#
-# Revision 1.15  2002/03/08 20:00:28  swa
-# some leftovers.
-#
-# Revision 1.14  2002/03/07 18:25:56  swa
-# synced redhat and suse build process
-#
-# Revision 1.13  2002/03/07 17:17:56  oes
-# (Hopefully) fixed for older make versions
-#
-# Revision 1.12  2002/03/07 15:28:27  swa
-# more informative
-#
-# Revision 1.11  2002/03/06 14:33:18  sarantis
-# Use proper temp file, not "abc".
-#
-# Revision 1.10  2002/03/06 14:19:35  sarantis
-# Cleanup PID_FILE_PATH from redhat-dist target
-#
-# Revision 1.9  2002/03/05 17:31:11  morcego
-# Search for docbook.dsl. Should solve portability problems for SuSe.
-#
-# Revision 1.8  2002/03/05 14:07:42  morcego
-# configure now detects rpm topdir, and change GNUmakefile acordingly
-#    (based on sugestion by Sarantis Paskalis)
-#
-# Revision 1.7  2002/03/05 13:43:28  morcego
-# Checking for text browser, so redhat-dok can work.
-#
-# Revision 1.6  2002/03/05 13:10:51  morcego
-# Changes to implement redhat-dok (Hal Burgiss)
-# Changes to make it work on other distros and out-of-the-shelf configurations
-#
-# Revision 1.5  2002/02/27 15:30:39  hal9
-# Reset $(RPM_PACKAGEV) to 1 (was 2)
-#
-# Revision 1.4  2002/01/17 21:44:04  jongfoster
-# Adding urlmatch.[ch]
-#
-# Revision 1.3  2002/01/04 15:26:08  oes
-# Added tarball-src target
-#
-# Revision 1.2  2001/12/30 14:07:31  steudten
-# - Add signal handling (unix)
-# - Add SIGHUP handler (unix)
-# - Add creation of pidfile (unix)
-# - Add action 'top' in rc file (RH)
-# - Add entry 'SIGNALS' to manpage
-# - Add exit message to logfile (unix)
-#
-# Revision 1.1  2001/12/01 11:22:57  jongfoster
-# Renaming Makefile.in to GNUmakefile.in so that non-GNU versions of
-# make break in a more obvious way.
-# Adding .PHONY section.
-#
-# Revision 1.40  2001/12/01 00:24:11  jongfoster
-# Renaming various config files
-# Fixing CR->CRLF under Win32 (I hope)
-#
-# Revision 1.39  2001/11/06 12:07:30  steudten
-# Add --clean for building rpm in target redhat-dist.
-#
-# Revision 1.38  2001/11/05 21:35:23  steudten
-# Complete rewrite for the 'redhat-dist' target.
-# Checks for writeable RPM build directories for calling user.
-# So you must not be root, just set the modes to 1777 to
-# build a RH package.
-# Fix the upload-target to be arch independant.
-# Add target for 'solaris-dist' - coming soon.
-#
-# Revision 1.37  2001/11/01 00:52:04  hal9
-# Redhat-upload stuff per Stefan.
-#
-# Revision 1.36  2001/10/31 19:26:13  swa
-# automate process of uploading new releases
-# to sf.
-#
-# Revision 1.35  2001/10/15 22:14:59  joergs
-# Removed -O2 and -Wall from AmigaOS-only CFLAGS since they are now in
-#  the general CFLAGS already.
-#
-# Revision 1.34  2001/10/15 18:28:06  steudten
-# remove config.cache for target clobber.
-# Cleanup make dist for RH and S.u.S.E.
-#
-# Revision 1.33  2001/10/10 12:43:33  oes
-# Added ugly hack to make install target work at least for some setups.
-#
-# Revision 1.32  2001/10/09 22:38:19  jongfoster
-# Correcting actionsfile filename for Win32 INI build
-#
-# Revision 1.31  2001/09/23 10:13:48  swa
-# upload process established. run make webserver and
-# the documentation is moved to the webserver. documents
-# are now linked correctly.
-#
-# Revision 1.30  2001/09/19 17:55:49  oes
-# Fixed CFLAGS
-#
-# Revision 1.29  2001/09/16 17:34:27  jongfoster
-# Removing showargs.[ch], adding cgi(simple|edit).[ch]
-# Replacing $(OBJEXT) with @OBJEXT@ - this seems to be a common source
-# of build problems.
-#
-# Revision 1.28  2001/09/13 15:19:08  swa
-# we want text files as well.
-#
-# Revision 1.27  2001/09/13 13:11:37  steudten
-#
-# Replace DEBUG_CFLAGS with OTHER_CFLAGS
-#
-# Revision 1.26  2001/09/12 23:44:54  david__schmidt
-# Mac OSX (Darwin) support added.
-#
-# Revision 1.25  2001/09/12 22:55:45  joergs
-# AmigaOS support added.
-#
-# Revision 1.24  2001/09/12 17:28:59  david__schmidt
-#
-# OS/2 port: update autoconf'd support for the platform.
-#
-# Revision 1.23  2001/09/12 16:28:42  swa
-# added "make dok" section to generate html pages from
-# the sgml source documents. note that the we do not want
-# generated stuff in cvs.
-#
-# Revision 1.22  2001/09/10 16:31:23  swa
-# buildroot definition in the specfile fucks up the build
-# process under suse. hence I moved it to the "rpm -ta"
-# command
-#
-# Revision 1.21  2001/09/10 11:12:49  oes
-# Turning on -Wall
-#
-# Revision 1.20  2001/08/02 22:04:29  jongfoster
-# Removing some remaining references to obsolete w32rulesdlg.[ch]
-#
-# Revision 1.19  2001/07/30 22:14:03  jongfoster
-# Removing obsolete w32rulesdlg.c and w32rulesdlg.h
-#
-# Revision 1.18  2001/07/29 17:09:17  jongfoster
-# Major changes to build system in order to fix these bugs:
-# - pthreads under Linux was broken - changed -lpthread to -pthread
-# - Compiling in MinGW32 mode under CygWin now correctly detects
-#   which shared libraries are available
-# - Solaris support (?) (Not tested under Solaris yet)
-#
-# Revision 1.17  2001/07/28 16:44:54  oes
-# Fixed sed LF->CRLF conversion and removed deprecated files
-#
-# Revision 1.16  2001/07/15 19:45:33  jongfoster
-# Added support for linking with POSIX threads library
-#
-# Revision 1.15  2001/07/13 13:48:07  oes
-#  - Moved STATIC #define for pcre to (ac)config.h
-#  - Made -Ipcre depandant on static pcre compilation to
-#    avoid version conflicts
-#  - Included compilation and depandancies for new deanimate.c
-#  - Made changes to the pcre/pcreposix/pcrs build process
-#    as required by the new library autodetection in
-#    configure.in
-#
-# Revision 1.14  2001/07/01 16:27:44  oes
-# Fixed misplaced dependancy
-#
-# Revision 1.13  2001/06/29 13:18:36  oes
-# - added depandancy of filters.o on cgi.h
-#
-# Revision 1.12  2001/06/12 17:15:56  swa
-# fixes, because a clean build on rh6.1 was impossible.
-# GZIP confuses make, %configure confuses rpm, etc.
-#
-# Revision 1.11  2001/06/11 11:26:35  sarantis
-# RPM version should be the same as ijbswa version.  The rpm release is
-# specified in the specfile.
-#
-# Revision 1.10  2001/06/07 17:27:45  swa
-# added suse build section
-#
-# Revision 1.9  2001/06/04 18:31:58  swa
-# files are now prefixed with either `confdir' or `logdir'.
-# `make redhat-dist' replaces both entries confdir and logdir
-# with redhat values
-#
-# Revision 1.8  2001/06/04 10:44:57  swa
-# `make redhatr-dist' now works. Except for the paths
-# in the config file.
-#
-# Revision 1.7  2001/06/03 17:09:09  swa
-# swa for oes: reversed my earlier change
-#
-# Revision 1.6  2001/06/03 17:07:27  swa
-# swa for oes
-#
-# Revision 1.5  2001/06/03 13:57:26  swa
-# compile cgi.c (for andreas' GUI)
-#
-# Revision 1.4  2001/05/31 21:18:45  jongfoster
-# Added files actions.[ch], actionlist.h, list.[ch] to Makefile
-#
-# Revision 1.3  2001/05/29 20:02:48  joergs
-# Changes for AmigaOS added.
-#
-# Revision 1.2  2001/05/17 22:23:23  oes
-#  - Added auto-generation of CRLFs for Win32 config files
-#  - Added comment-prefix to all Win32-only options in the config file
-#    and provided auto stripping of this prefix for the Win32 platform by make
-#
-# Revision 1.1.1.1  2001/05/15 13:59:00  oes
-# Initial import of version 2.9.3 source tree
-#
-#
diff --git a/Junkbuster Status.URL b/Junkbuster Status.URL
new file mode 100644 (file)
index 0000000..6c95de6
Binary files /dev/null and b/Junkbuster Status.URL differ
diff --git a/LICENSE b/LICENSE
deleted file mode 100644 (file)
index 1bcc46f..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,342 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-\f
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-\f
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-\f
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-\f
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-\f
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
-
-
diff --git a/Makefile b/Makefile
deleted file mode 100644 (file)
index c195c8d..0000000
--- a/Makefile
+++ /dev/null
@@ -1,63 +0,0 @@
-# $Id: Makefile,v 1.2 2002/03/24 13:25:42 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# $Log: Makefile,v $
-# Revision 1.2  2002/03/24 13:25:42  swa
-# name change related issues
-#
-# Revision 1.1  2001/12/01 11:24:29  jongfoster
-# Will display a warning if non-GNU make is used
-#
-#
-
-#############################################################################
-
-error: GNUmakefile
-       @echo
-       @echo "ERROR!"
-       @echo "To build this program, you must run ./configure and then run GNU make."
-       @echo
-       @echo "You are not using the GNU version of Make - maybe it's called gmake"
-       @echo "or it's in a different directory?"
-       @echo
-
-GNUmakefile:
-       @echo
-       @echo "ERROR!"
-       @echo "To build this program, you must run ./configure and then run GNU make."
-       @echo
-       @echo "You haven't run ./configure yet."
-       @echo
-       @false
-
-.PHONY: error
-
-#############################################################################
-
-## Local Variables:
-## tab-width: 3
-## end:
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..6dd9a26
--- /dev/null
@@ -0,0 +1,363 @@
+# Note:  Makefile is built automatically from Makefile.in
+#
+# $Id: Makefile.in,v 1.15 2001/07/13 13:48:07 oes Exp $
+#
+# Written by and Copyright (C) 2001 the SourceForge
+# IJBSWA team.  http://ijbswa.sourceforge.net
+#
+# Based on the Internet Junkbuster originally written
+# by and Copyright (C) 1997 Anonymous Coders and 
+# Junkbusters Corporation.  http://www.junkbusters.com
+#
+# This program is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will
+# be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.  See the GNU General Public
+# License for more details.
+#
+# The GNU General Public License should be included with
+# this file.  If not, you can view it at
+# http://www.gnu.org/copyleft/gpl.html
+# or write to the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# $Log: Makefile.in,v $
+# Revision 1.15  2001/07/13 13:48:07  oes
+#  - Moved STATIC #define for pcre to (ac)config.h
+#  - Made -Ipcre depandant on static pcre compilation to
+#    avoid version conflicts
+#  - Included compilation and depandancies for new deanimate.c
+#  - Made changes to the pcre/pcreposix/pcrs build process
+#    as required by the new library autodetection in
+#    configure.in
+#
+# Revision 1.14  2001/07/01 16:27:44  oes
+# Fixed misplaced dependancy
+#
+# Revision 1.13  2001/06/29 13:18:36  oes
+# - added depandancy of filters.o on cgi.h
+#
+# Revision 1.12  2001/06/12 17:15:56  swa
+# fixes, because a clean build on rh6.1 was impossible.
+# GZIP confuses make, %configure confuses rpm, etc.
+#
+# Revision 1.11  2001/06/11 11:26:35  sarantis
+# RPM version should be the same as ijbswa version.  The rpm release is
+# specified in the specfile.
+#
+# Revision 1.10  2001/06/07 17:27:45  swa
+# added suse build section
+#
+# Revision 1.9  2001/06/04 18:31:58  swa
+# files are now prefixed with either `confdir' or `logdir'.
+# `make redhat-dist' replaces both entries confdir and logdir
+# with redhat values
+#
+# Revision 1.8  2001/06/04 10:44:57  swa
+# `make redhatr-dist' now works. Except for the paths
+# in the config file.
+#
+# Revision 1.7  2001/06/03 17:09:09  swa
+# swa for oes: reversed my earlier change
+#
+# Revision 1.6  2001/06/03 17:07:27  swa
+# swa for oes
+#
+# Revision 1.5  2001/06/03 13:57:26  swa
+# compile cgi.c (for andreas' GUI)
+#
+# Revision 1.4  2001/05/31 21:18:45  jongfoster
+# Added files actions.[ch], actionlist.h, list.[ch] to Makefile
+#
+# Revision 1.3  2001/05/29 20:02:48  joergs
+# Changes for AmigaOS added.
+#
+# Revision 1.2  2001/05/17 22:23:23  oes
+#  - Added auto-generation of CRLFs for Win32 config files
+#  - Added comment-prefix to all Win32-only options in the config file
+#    and provided auto stripping of this prefix for the Win32 platform by make
+#
+# Revision 1.1.1.1  2001/05/15 13:59:00  oes
+# Initial import of version 2.9.3 source tree
+#
+#
+
+# define version (will be wired into the rpm.)
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MINOR = @VERSION_MINOR@
+VERSION_POINT = @VERSION_POINT@
+VERSION       = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_POINT)
+# will automatically be postfixed with -$(RPM_PACKAGEV) in the SPECfile
+RPM_VERSION   = $(VERSION)
+RPM_PACKAGEV  = 1
+
+# The version is currently specified in config.h, which is
+# written by "configure".
+#
+#VERSION_CFLAGS = -DVERSION_MAJOR=$(VERSION_MAJOR) \
+#                 -DVERSION_MINOR=$(VERSION_MINOR) \
+#                 -DVERSION_POINT=$(VERSION_POINT) \
+#                 -DVERSION="$(VERSION)"
+
+# Directories for "make install"
+DEST        = /etc/junkbuster
+SBIN_DEST   = @sbindir@
+MAN_DEST    = @mandir@
+
+# The flag "-mno-win32" can be used by Cygwin to emulate a un?x type install.
+# The flag "-mwindows -mno-cygwin" will cause Cygwin to use MingW32 for Win32 install.
+CYGWIN_FLAGS = @CYGWIN_FLAGS@
+
+# Either/Or of these next two lines
+#DEBUG_CFLAGS = -g
+DEBUG_CFLAGS  = -O3
+
+# Solaris needs a special define:
+# FIXME: This is always commented out
+SOLARIS_FLAGS = @SOLARIS_ONLY@-D__EXTENSIONS__=1
+
+#  -DSTDC_HEADERS Now in config.h
+# Do we need  -DHAVE_STRING  ???
+CFLAGS = @CFLAGS@ @CPPFLAGS@ \
+         -D__MT__=1 -D__STDC__=1 $(SOLARIS_FLAGS) -DHAVE_STRING $(DEBUG_CFLAGS) \
+         $(CYGWIN_FLAGS) $(PCRE_WIN_FLAGS) @STATIC_PCRE_ONLY@ -Ipcre
+
+PROGRAM = junkbuster@EXEEXT@
+CC      = gcc
+ECHO    = echo
+GZIP_PROG    = gzip
+INSTALL = cp -f
+LD      = gcc
+OBJEXT  = @OBJEXT@
+RM      = rm -f
+STRIP_PROG   = strip
+
+C_SRC  = actions.c encode.c errlog.c filters.c gateway.c jbsockets.c \
+         jcc.c killpopup.c list.c loadcfg.c loaders.c miscutil.c \
+         parsers.c showargs.c ssplit.c cgi.c deanimate.c
+         
+C_OBJS = $(C_SRC:.c=.$(OBJEXT))
+C_HDRS = $(C_SRC:.c=.h) project.h actionlist.h
+
+W32_SRC   = @WIN_ONLY@w32log.c w32rulesdlg.c w32taskbar.c win32.c
+W32_FILES = @WIN_ONLY@w32.res
+W32_OBJS  = @WIN_ONLY@$(W32_SRC:.c=.$(OBJEXT)) $(W32_FILES)
+W32_HDRS  = @WIN_ONLY@w32log.h w32res.h w32rulesdlg.h w32taskbar.h
+W32_LIB   = @WIN_ONLY@-lwsock32 -lcomctl32
+W32_INIS  = @WIN_ONLY@junkbstr.txt saclfile.txt sblock.txt scookie.txt  \
+            @WIN_ONLY@sforward.txt simage.txt spopup.txt strust.txt sregexp.txt
+
+PCRS_SRC     = @STATIC_PCRS_ONLY@pcrs.c
+PCRS_OBJS    = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.$(OBJEXT))
+PCRS_HDRS    = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.h)
+
+PCRE_SRC     = @STATIC_PCRE_ONLY@pcre/get.c pcre/maketables.c pcre/study.c pcre/pcre.c
+PCRE_OBJS    = @STATIC_PCRE_ONLY@$(PCRE_SRC:.c=.$(OBJEXT))
+PCRE_HDRS    = @STATIC_PCRE_ONLY@pcre/config.h pcre/chartables.c pcre/internal.h pcre/pcre.h
+
+# No REGEX (Either because dynamically linked pcreposix, or no regex at all):
+REGEX_SRC    =
+# GNU REGEX:
+@GNU_REGEX_ONLY@REGEX_SRC    = gnu_regex.c
+# PCRE REGEX:
+@PCRE_REGEX_ONLY@@STATIC_PCRE_ONLY@REGEX_SRC = pcre/pcreposix.c
+
+REGEX_OBJS   = $(REGEX_SRC:.c=.$(OBJEXT))
+REGEX_HDRS   = $(REGEX_SRC:.c=.h)
+
+# Dependencies introduced by #include "project.h".
+PROJECT_H_DEPS = project.h $(REGEX_HDRS) $(PCRS_HDRS) @STATIC_PCRE_ONLY@pcre/pcre.h
+
+# Only need this on Solaris
+# FIXME: This is always commented out
+SOCKET_LIB   = @SOLARIS_ONLY@-lsocket -lnsl
+
+# PThreads library, if needed.
+PTHREAD_LIB  = @PTHREAD_ONLY@@PTHREAD_LIB@
+
+LIBS         = @LIBS@ $(W32_LIB) $(SOCKET_LIB) $(PTHREAD_LIB)
+
+SRCS         = $(C_SRC)  $(W32_SRC)  $(PCRS_SRC)  $(PCRE_SRC)  $(REGEX_SRC)
+OBJS         = $(C_OBJS) $(W32_OBJS) $(PCRS_OBJS) $(PCRE_OBJS) $(REGEX_OBJS)
+HDRS         = $(C_HDRS) $(W32_HDRS) $(PCRS_HDRS) $(PCRE_OBJS) $(REGEX_HDRS)
+
+
+# -------------------------------------------------------------------------
+# Do not change anything below this line
+# And there should NOT be any targets above this line.
+# -------------------------------------------------------------------------
+LDFLAGS = $(DEBUG_CFLAGS) $(CYGWIN_FLAGS)
+
+all: $(PROGRAM)
+
+SUFFIX     = .txt:o
+.SUFFIXES  : .txt
+
+%.txt:
+       sed -e 's/$$/&\r/' < $< > $@
+
+inifiles: $(W32_INIS)
+
+junkbstr.txt: config
+       sed     -e 's!\(/etc/junkbuster\|.\)/blocklist!sblock.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/popup!spopup.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/cookiefile!scookie.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/forward!sforward.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/trust!strust.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/aclfile!sacl.txt!' \
+                       -e 's!\(/var/log/junkbuster\|.\)/jarfile!jar.log!' \
+                       -e 's!\(/var/log/junkbuster\|.\)/junkbuster\.log!junkbstr.log!' \
+                       -e 's!\(/etc/junkbuster\|.\)/imagelist!simage.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/re_filterfile!sregexp.txt!' \
+                       -e 's!$$!&\r!' \
+                       -e 's!#Win32-only: !!' \
+       < $< > $@
+
+saclfile.txt: aclfile
+sblock.txt: blocklist
+scookie.txt: cookiefile
+sforward.txt: forward
+simage.txt: imagelist
+spopup.txt: popup
+strust.txt: trust
+sregexp.txt: re_filterfile
+
+
+# -------------------------------------------------------------------------
+# redhat distribution
+# -------------------------------------------------------------------------
+redhat-dist:
+       @make clobber
+# verify that i'm root needs to be done
+       rm -f ../ijbswa.tar.gz
+# verify all version strings, FLAGS, etc. in the spec file
+       cat junkbuster-rh.spec | sed 's/^Version:.*/Version: $(RPM_VERSION)/g' | sed 's/^Release:.*/Release: $(RPM_PACKAGEV)/g' > /tmp/abc && cp -f /tmp/abc junkbuster-rh.spec
+       tar --exclude "CVS" --exclude "junkbuster-suse.spec" -cvzf ../ijbswa.tar.gz .
+# verify all files in their correct location needs to be done
+       cd .. && rpm -ta ijbswa.tar.gz
+
+# -------------------------------------------------------------------------
+# suse distribution
+# -------------------------------------------------------------------------
+suse-dist:
+       @make clobber
+# verify that i'm root needs to be done
+       rm -f ../ijbswa.tar.gz
+# verify all version strings, FLAGS, etc. in the spec file
+       cat junkbuster-suse.spec | sed 's/^Version:.*/Version: $(RPM_VERSION)/g' | sed 's/^Release:.*/Release: $(RPM_PACKAGEV)/g' > /tmp/abc && cp -f /tmp/abc junkbuster-suse.spec
+       tar --exclude "CVS" --exclude "junkbuster-rh.spec" -cvzf ../ijbswa.tar.gz .
+# verify all files in their correct location needs to be done
+       cd .. && rpm -ta ijbswa.tar.gz
+
+# -------------------------------------------------------------------------
+#
+# -------------------------------------------------------------------------
+win-dist:
+       $(ECHO) Not implemented.
+
+# -------------------------------------------------------------------------
+#
+# -------------------------------------------------------------------------
+tarball-dist:
+       @make clean
+       make $(PROGRAM) 
+#      remove all objects and create the tarball with the binary
+       cd .. && $(RM) ijb/a.out ijb/core ijb/*.$(OBJEXT) && tar --exclude "ijb/CVS" -cvzf ../ijb-distribution-$(VERSION).tar.gz ijb/
+       chmod a+r ../../ijb-distribution-$(VERSION).tar.gz
+       @$(ECHO) Tarball with binary created.
+
+# -------------------------------------------------------------------------
+#
+# -------------------------------------------------------------------------
+
+actions.@OBJEXT@:   actions.c   actions.h   config.h $(PROJECT_H_DEPS) errlog.h jcc.h list.h loaders.h miscutil.h actionlist.h
+encode.@OBJEXT@:    encode.c    encode.h    config.h
+errlog.@OBJEXT@:    errlog.c    errlog.h    config.h $(PROJECT_H_DEPS) @WIN_ONLY@w32log.h
+filters.@OBJEXT@:   filters.c   filters.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jbsockets.h jcc.h loadcfg.h parsers.h showargs.h ssplit.h cgi.h deanimate.h @WIN_ONLY@win32.h 
+gateway.@OBJEXT@:   gateway.c   gateway.h   config.h $(PROJECT_H_DEPS) errlog.h jbsockets.h jcc.h loadcfg.h
+jbsockets.@OBJEXT@: jbsockets.c jbsockets.h config.h $(PROJECT_H_DEPS) filters.h
+jcc.@OBJEXT@:       jcc.c       jcc.h       config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h killpopup.h loadcfg.h loaders.h miscutil.h parsers.h showargs.h @WIN_ONLY@w32log.h win32.h cgi.h
+killpopup.@OBJEXT@: killpopup.c killpopup.h config.h $(PROJECT_H_DEPS) jcc.h loadcfg.h
+list.@OBJEXT@:      list.c      list.h      config.h $(PROJECT_H_DEPS) list.h miscutil.h
+loadcfg.@OBJEXT@:   loadcfg.c   loadcfg.h   config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h jcc.h killpopup.h loaders.h miscutil.h parsers.h showargs.h @WIN_ONLY@w32log.h win32.h
+loaders.@OBJEXT@:   loaders.c   loaders.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h ssplit.h
+miscutil.@OBJEXT@:  miscutil.c  miscutil.h  config.h
+parsers.@OBJEXT@:   parsers.c   parsers.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h jbsockets.h jcc.h loadcfg.h loaders.h miscutil.h showargs.h ssplit.h
+showargs.@OBJEXT@:  showargs.c  showargs.h  config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h
+ssplit.@OBJEXT@:    ssplit.c    ssplit.h    config.h miscutil.h
+cgi.@OBJEXT@:       cgi.c       cgi.h       config.h $(PROJECT_H_DEPS) list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
+deanimate.@OBJEXT@: deanimate.c deanimate.h config.h $(PROJECT_H_DEPS)
+
+# GNU regex
+gnu_regex.@OBJEXT@: gnu_regex.c gnu_regex.h config.h
+
+# PCRS
+pcrs.@OBJEXT@: pcrs.c pcre/pcre.h pcrs.h
+
+# PCRE
+pcre/get.@OBJEXT@:        pcre/get.c        pcre/config.h pcre/internal.h pcre/pcre.h
+pcre/maketables.@OBJEXT@: pcre/maketables.c pcre/config.h pcre/internal.h pcre/pcre.h
+pcre/pcre.@OBJEXT@:       pcre/pcre.c       pcre/config.h pcre/internal.h pcre/pcre.h pcre/chartables.c 
+pcre/pcreposix.@OBJEXT@:  pcre/pcreposix.c  pcre/config.h pcre/internal.h pcre/pcre.h pcre/pcreposix.h
+pcre/study.@OBJEXT@:      pcre/study.c      pcre/config.h pcre/internal.h pcre/pcre.h
+
+# An auxiliary program makes the PCRE default character table source
+
+pcre/chartables.c:   pcre/dftables
+               pcre/dftables >pcre/chartables.c
+
+pcre/dftables:       pcre/dftables.c pcre/maketables.c pcre/pcre.h pcre/internal.h pcre/config.h
+               $(CC) -o pcre/dftables $(CFLAGS) pcre/dftables.c
+
+# Win32
+w32log.@OBJEXT@: w32log.c errlog.h config.h jcc.h loadcfg.h miscutil.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h w32rulesdlg.h w32taskbar.h win32.h
+w32rulesdlg.@OBJEXT@: w32rulesdlg.c config.h w32rulesdlg.h win32.h
+w32taskbar.@OBJEXT@: w32taskbar.c config.h w32log.h w32taskbar.h
+win32.@OBJEXT@: win32.c config.h jcc.h loadcfg.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h win32.h
+
+w32.res: w32.rc w32res.h icons/denyrule.ico icons/ico00001.ico icons/ico00002.ico icons/ico00003.ico icons/ico00004.ico icons/ico00005.ico icons/ico00006.ico icons/ico00007.ico icons/ico00008.ico icons/icon1.ico icons/idle.ico icons/junkbust.ico config.h
+       windres -D__MINGW32__=0.2 -O coff -i $< -o $@
+
+## AmigaOS, GCC 2.95.1 (or lower, 2.95.3 does NOT work!)
+#ifeq ($(shell $(CC) $(CFLAGS) -dumpmachine), m68k-amigaos)
+#OBJS += amiga.o
+#CFLAGS += -D__AMIGAVERSION__=\"$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)\" -D__AMIGADATE__=\"`date +%d.%m.%Y`\" -W -Wall -m68020 -Os -noixemul -fbaserel -msmall-code
+#LDFLAGS += -m68020 -noixemul -fbaserel
+#LIBS = -lm /gg/lib/libb/libm020/libnix/swapstack.o
+#amiga.o: amiga.c amiga.h config.h
+#endif
+#
+
+$(PROGRAM): $(OBJS) $(W32_FILES)
+       $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS)
+
+clean:
+       $(RM) a.out core $(OBJS) $(W32_FILES) $(W32_INIS)
+
+clobber: clean
+       $(RM) $(PROGRAM) *.pdb *.lib *.exp TAGS junkbuster.log
+
+tags: $(SRCS) $(HDRS)
+       etags $(SRCS) $(HDRS)
+
+install: all
+       $(STRIP_PROG) $(PROGRAM)
+       $(INSTALL) $(PROGRAM) $(SBIN_DEST)
+       $(INSTALL) README README.TOO README.WIN README.re_filter README.cygwin $(DEST)
+       $(INSTALL) aclfile blocklist config cookiefile forward imagelist \
+               popup re_filterfile trust $(DEST)
+       # FIXME: On SuSE, these are not found.  Where do they go?
+       $(ECHO) junkbuster.logrotate junkbuster.monthly junkbuster.weekly
+       $(GZIP_PROG) -c junkbuster.1 > $(MAN_DEST)/junkbuster.1.gz
+       $(INSTALL) junkbuster.init /sbin/init.d/junkbuster
+
+
+## Local Variables:
+## tab-width: 3
+## end:
diff --git a/README b/README
deleted file mode 100644 (file)
index 2c3fc2c..0000000
--- a/README
+++ /dev/null
@@ -1,181 +0,0 @@
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/README,v $
- *
- * Purpose     :  README file to give a short intro.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- *********************************************************************/
-
-This README is included with the development version of Privoxy,
-which will eventually become Privoxy v3.0 (and soon we hope!). See
-http://www.privoxy.org/. The current code level is BETA, and seems 
-stable to us :)
-
-Privoxy is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. Privoxy has a very flexible configuration and
-can be customized to suit individual needs and tastes. Privoxy
-has application for both stand-alone systems and multi-user
-networks.
-
-Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-was originally written by JunkBusters Corporation, and was released as
-free open-source software under the GNU GPL. Stefan Waldherr made many
-improvements, and started the SourceForge project to continue
-development. Several other developers are now contributing.
-
-
- IMPORTANT CHANGES
-------------------
-
-NEWS! As of 03/24/02, the name of this project has been changed 
-from ijbswa/Junkbuster to Privoxy. This is reflected in many of the 
-included files. 
-
-WARNING! If upgrading from earlier versions of this project via 
-RPM packages, the new package will delete any previously installed 
-'Junkbuster' packages.
-
-IMPORTANT! READ! Configuration Change as of 3 Apr 2002: The default
-listening port is now 8118 due to conflicts with port 8000 assignment.
-You will need to change your browser if upgrading!!! And maybe
-firewall, etc.
-
-
- INSTALL
---------
-
-For tarball, first unpack:
-
- tar xzvf privoxy-2.9.13-beta-src.tar.gz
- cd privoxy-2.9.13-beta
-
- autoheader
- autoconf
- ./configure   (--help to see options)
- gmake         (the make from gnu) 
- su 
- make -n install       (to see where all the files will go)
- make install          (to really install)
-
-Redhat and SuSE src and binary RPMs can be built with 'make
-redhat-dist' or 'make suse-dist' (run ./configure first) from unpacked
-sources. BSD will (probably?) require gmake (from http://gnu.org). See
-the user-manual for OS/2 build instructions.
-
-Privoxy is also available via anonymous CVS:
-
- cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
- cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co current
-
-This will create a directory named 'current'. Then, 'cd current', and
-then build as above.
-
-
- RUN
-----
-
-privoxy [--help] [--version] [--no-daemon] [--pidfile PIDFILE] 
- [--user USER] [config_file]
-
-Or for RedHat: /etc/rc.d/init.d/privoxy start
-Or for SuSE:   /etc/rc.d/privoxy start
-
-See the man page or user-manual for a brief explanation of each.
-
-
- CONFIGURATION
---------------
-
-See: 'config', '*.action', and 'default.filter'. These are all well
-commented. Most of the magic is in '*.action', and there are several 
-of these included with varying degrees of aggressiveness. On Unix-like
-systems, these files are installed in /etc/privoxy.  On Windows, then wherever
-the executable itself is installed. There are many significant changes and
-advances since Junkbuster v2.0.x. The user-manual has a run down of
-configuration options, and examples: http://www.privoxy.org/user-manual/.
-
-Be sure to set your browser(s) for HTTP/HTTPS Proxy at <IP>:<Port>, or
-whatever you specify in the config file under 'listen-address'.
-DEFAULT is localhost:8118.
-
-The default.action file can be configured via the web interface accessed
-via http://p.p/, as well other options.
-
-
- DOCUMENTATION
---------------
-
-There is a growing amount of documentation in the 'doc' subdirectory,
-but it is not finished at this point. In particular, see the
-user-manual there, and developers should look at developer-manual.
-
-The most up to date source of information on the current development version,
-may still be either comments in the source code, or the included configuration
-files, which are all well commented. These are 'config', '*.action', and
-'default.filter' in the toplevel source directory.
-
-Some legacy Junkbuster documentation may also be included only to give an idea
-of what Privoxy can do under doc/obsolete/*. Much has changed since these docs
-were written, so beware.
-
-Included documentation may vary according to platform and packager.
-
-
- CONTACTING THE DEVELOPERS, BUG REPORTING AND FEATURE REQUESTS
---------------------------------------------------------------
-
-We value your feedback. However, to provide you with the best support,
-please note:
-   
- * Use the support forum to get help:
-   http://sourceforge.net/tracker/?group_id=11118&atid=211118
- * Submit bugs only thru our bug forum:
-   http://sourceforge.net/tracker/?group_id=11118&atid=111118 
-   Make sure that the bug has not already been submitted. Please try
-   to verify that it is a Privoxy bug, and not a browser or site
-   bug first. If you are using your own custom configuration, please
-   try the stock configs to see if the problem is a configuration
-   related bug. And if not using the latest development snapshot,
-   please try the latest one. Or even better, CVS sources.
- * Submit feature requests only thru our feature request forum:
-   http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-     
-For any other issues, feel free to use the mailing lists:
-http://sourceforge.net/mail/?group_id=11118
-   
-Anyone interested in actively participating in development and related
-discussions can join the appropriate mailing list here:
-http://sourceforge.net/mail/?group_id=11118. Archives are available
-here too.
-
--------------------------------------------------------------------------
-ijbswa-developers@lists.sourceforge.net
-
-$Id: README,v 1.21 2002/03/26 22:29:54 swa Exp $
index bf746a6..a61d3f6 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
+#ifndef _CONFIG_H
+#define _CONFIG_H
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/acconfig.h,v $
@@ -11,7 +11,7 @@
  *                getting ludicrously long with feature defines.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: acconfig.h,v $
- *    Revision 1.21  2002/03/24 14:31:08  swa
- *    remove more crappy files. set RPM
- *    release version correctly.
- *
- *    Revision 1.20  2002/03/24 13:46:44  swa
- *    name change related issue.
- *
- *    Revision 1.19  2002/03/24 13:25:42  swa
- *    name change related issues
- *
- *    Revision 1.18  2002/03/08 16:40:28  oes
- *    Added FEATURE_NO_GIFS
- *
- *    Revision 1.17  2002/03/04 17:52:44  oes
- *    Deleted PID_FILE_PATH
- *
- *    Revision 1.16  2002/01/10 12:36:18  oes
- *    Moved HAVE_*_R to acconfig.h, where they belong.
- *
- *    Revision 1.15  2001/12/30 14:07:31  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.14  2001/10/23 21:24:09  jongfoster
- *    Support for FEATURE_CGI_EDIT_ACTIONS
- *
- *    Revision 1.13  2001/10/07 15:30:41  oes
- *    Removed FEATURE_DENY_GZIP
- *
- *    Revision 1.12  2001/09/13 19:56:37  jongfoster
- *    Reverting to revision 1.10 - previous checking was majorly broken.
- *
- *    Revision 1.10  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.9  2001/07/29 19:08:52  jongfoster
- *    Changing _CONFIG_H to CONFIG_H_INCLUDED.
- *    Also added protection against using a MinGW32 or CygWin version of
- *    config.h from within MS Visual C++
- *
- *    Revision 1.8  2001/07/29 17:09:17  jongfoster
- *    Major changes to build system in order to fix these bugs:
- *    - pthreads under Linux was broken - changed -lpthread to -pthread
- *    - Compiling in MinGW32 mode under CygWin now correctly detects
- *      which shared libraries are available
- *    - Solaris support (?) (Not tested under Solaris yet)
- *
- *    Revision 1.7  2001/07/25 22:53:59  jongfoster
- *    Will #error if pthreads is enabled under BeOs
- *
- *    Revision 1.6  2001/07/15 17:54:29  jongfoster
- *    Renaming #define STATIC to STATIC_PCRE
- *    Adding new #define FEATURE_PTHREAD that will be used to enable
- *    POSIX threads support.
- *
  *    Revision 1.5  2001/07/13 13:48:37  oes
  *     - (Fix:) Copied CODE_STATUS #define from config.h.in
  *     - split REGEX #define into REGEX_GNU and REGEX_PCRE
  */
 #undef VERSION_POINT
 
-/*
- * Version number - RPM-release
- */
-#undef VERSION_RPM_PACKAGE
-
 /*
  * Version number, as a string
  */
 #undef VERSION
 
 /*
- * Status of the code: "alpha", "beta" or "stable".
+ * Status of the code: alpha, beta or stable
  */
 #undef CODE_STATUS
 
 #undef STATIC_PCRS
 
 /*
- * Allows the use of an ACL to control access to the proxy by IP address.
+ * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
+ * non-anonymizing proxy.  This is useful if you're trying to access a
+ * blocked or broken site - just change the setting in the config file
+ * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows
+ * GUI).
  */
-#undef FEATURE_ACL
+#undef TOGGLE
 
 /*
- * Enables the web-based configuration (actionsfile) editor.  If you
- * have a shared proxy, you might want to turn this off.
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps.  This forces it to be 
+ * uncompressed.
  */
-#undef FEATURE_CGI_EDIT_ACTIONS
+#undef DENY_GZIP
 
 /*
- * Allows the use of jar files to capture cookies.
+ * Enables statistics function.
  */
-#undef FEATURE_COOKIE_JAR
+#undef STATISTICS
+
+/*
+ * Bypass filtering for 1 page only
+ */
+#undef FORCE_LOAD
 
 /*
  * Locally redirect remote script-redirect URLs
  */
-#undef FEATURE_FAST_REDIRECTS
+#undef FAST_REDIRECTS
 
 /*
- * Bypass filtering for 1 page only
+ * Split the show-proxy-args page into a page for each config file.
  */
-#undef FEATURE_FORCE_LOAD
+#undef SPLIT_PROXY_ARGS
 
 /*
- * Allow blocking using images as well as HTML.
- * If you do not define this then everything is blocked as HTML.
- *
- * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE.
+ * Kills JavaScript popups - window.open, onunload, etc.
+ */
+#undef KILLPOPUPS
+
+/*
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
  */
-#undef FEATURE_IMAGE_BLOCKING
+#undef WEBDAV
 
 /*
  * Detect image requests automatically for MSIE.  Will fall back to
  * other image-detection methods (i.e. "+image" permission) for other
  * browsers.
  *
- * You must also define FEATURE_IMAGE_BLOCKING to use this feature.
+ * You must also define IMAGE_BLOCKING to use this feature.
  *
  * It detects the following header pair as an image request:
  *
  * These limitations are due to IE making inconsistent choices
  * about which "Accept:" header to send.
  */
-#undef FEATURE_IMAGE_DETECT_MSIE
-
-/*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#undef FEATURE_KILL_POPUPS
-
-/*
- * Use PNG instead of GIF for built-in images
- */
-#undef FEATURE_NO_GIFS
-
-/*
- * Use POSIX threads instead of native threads.
- */
-#undef FEATURE_PTHREAD
+#undef DETECT_MSIE_IMAGES
 
 /*
- * Enables statistics function.
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
  */
-#undef FEATURE_STATISTICS
+#undef IMAGE_BLOCKING
 
 /*
- * Allow Privoxy to be "disabled" so it is just a normal non-blocking
- * non-anonymizing proxy.  This is useful if you're trying to access a
- * blocked or broken site - just change the setting in the config file,
- * or use the handy "Disable" menu option in the Windows GUI.
+ * Allows the use of ACL files to control access to the proxy by IP address.
  */
-#undef FEATURE_TOGGLE
+#undef ACL_FILES
 
 /*
  * Allows the use of trust files.
  */
-#undef FEATURE_TRUST
+#undef TRUST_FILES
 
 /*
- * Defined on Solaris only.  Makes the system libraries thread safe.
+ * Allows the use of jar files to capture cookies.
  */
-#undef _REENTRANT
+#undef JAR_FILES
 
 /*
- * Defined on Solaris only.  Without this, many important functions are not
- * defined in the system headers.
+ * Define this to use the Windows GUI for editing the blocklist.
+ * FIXME: This feature is only partially implemented and does not work
+ * FIXME: This #define can never be set by ./configure.
  */
-#undef __EXTENSIONS__
+#undef WIN_GUI_EDIT
 
 /*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
- */
-#undef __MT__
-
-/* If the (nonstandard and thread-safe) function gethostbyname_r
- * is available, select which signature to use
- */
-#undef HAVE_GETHOSTBYNAME_R_6_ARGS
-#undef HAVE_GETHOSTBYNAME_R_5_ARGS
-#undef HAVE_GETHOSTBYNAME_R_3_ARGS
-
-/* If the (nonstandard and thread-safe) function gethostbyaddr_r
- * is available, select which signature to use
- */
-#undef HAVE_GETHOSTBYADDR_R_8_ARGS
-#undef HAVE_GETHOSTBYADDR_R_7_ARGS
-#undef HAVE_GETHOSTBYADDR_R_5_ARGS
-
-/* Define if you have gmtime_r and localtime_r with a signature
- * of (struct time *, struct tm *)
+ * Use POSIX threads instead of native threads.
  */
-#undef HAVE_GMTIME_R
-#undef HAVE_LOCALTIME_R
+#undef FEATURE_PTHREAD
 
 @BOTTOM@
 
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with ANSI Standard C?)
- */
-#ifndef __STDC__
-#define __STDC__ 1
-#endif /* ndef __STDC__ */
-
 /*
  * Need to set up this define only for the Pthreads library for
  * Win32, available from http://sources.redhat.com/pthreads-win32/
 #define __CLEANUP_C
 #endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */
 
-/*
- * BEOS does not currently support POSIX threads.
- * This *should* be detected by ./configure, but let's be sure.
- */
-#if defined(FEATURE_PTHREAD) && defined(__BEOS__)
-#error BEOS does not support pthread - please run ./configure again with "--disable-pthread"
-
-#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */
-
-
-/*
- * It's too easy to accidentally use a Cygwin or MinGW32 version of config.h
- * under VC++, and it usually gives many wierd error messages.  Let's make
- * the error messages understandable, by bailing out now.
- */
-#ifdef _MSC_VER
-#error For MS VC++, please use config.h.win or config.h.win32threads.win.  You can usually do this by selecting the "Build", "Clean" menu option.
-#endif /* def _MSC_VER */
-
-#endif /* CONFIG_H_INCLUDED */
+#endif /* _CONFIG_H */
index c2ae6b4..cc65b2a 100644 (file)
@@ -13,7 +13,7 @@
  *                    DEFINE_ACTION_ALIAS
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: actionlist.h,v $
- *    Revision 1.14  2002/03/24 16:32:08  jongfoster
- *    Removing logo option
- *
- *    Revision 1.13  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.12  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.11  2002/03/12 01:42:49  oes
- *    Introduced modular filters
- *
- *    Revision 1.10  2002/03/08 18:19:14  jongfoster
- *    Adding +image-blocker{pattern} option to edit interface
- *
- *    Revision 1.9  2001/11/22 21:58:41  jongfoster
- *    Adding action +no-cookies-keep
- *
- *    Revision 1.8  2001/10/10 16:42:52  oes
- *    Fixed a bug, Added +limit-connect string action
- *
- *    Revision 1.7  2001/10/07 15:33:59  oes
- *    Introduced a +no-compression action
- *    Introduced a +downgrade action
- *
- *    Revision 1.6  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.5  2001/07/18 12:27:03  oes
- *    Changed deanimate-gifs to string action
- *
  *    Revision 1.4  2001/07/13 13:52:12  oes
  *     - Formatting
  *     - Introduced new action ACTION_DEANIMATE
  *********************************************************************/
 \f
 
-#if !(defined(DEFINE_ACTION_BOOL) && defined(DEFINE_ACTION_MULTI) && defined(DEFINE_ACTION_STRING))
-#error Please define lots of macros before including "actionlist.h".
-#endif /* !defined(all the DEFINE_ACTION_xxx macros) */
-
-#ifndef DEFINE_CGI_PARAM_RADIO
-#define DEFINE_CGI_PARAM_RADIO(name, bit, index, value, is_default)
-#define DEFINE_CGI_PARAM_CUSTOM(name, bit, index, default_val)
-#define DEFINE_CGI_PARAM_NO_RADIO(name, bit, index, default_val)
-#endif /* ndef DEFINE_CGI_PARAM_RADIO */
-
-DEFINE_ACTION_MULTI      ("add-header",      ACTION_MULTI_ADD_HEADER)
-DEFINE_ACTION_BOOL       ("block",           ACTION_BLOCK)
-DEFINE_ACTION_STRING     ("deanimate-gifs",  ACTION_DEANIMATE,       ACTION_STRING_DEANIMATE)
-DEFINE_CGI_PARAM_RADIO   ("deanimate-gifs",  ACTION_DEANIMATE,       ACTION_STRING_DEANIMATE,     "first", 0)
-DEFINE_CGI_PARAM_RADIO   ("deanimate-gifs",  ACTION_DEANIMATE,       ACTION_STRING_DEANIMATE,     "last",  1)
-DEFINE_ACTION_BOOL       ("downgrade",       ACTION_DOWNGRADE)
-DEFINE_ACTION_BOOL       ("fast-redirects",  ACTION_FAST_REDIRECTS)
-DEFINE_ACTION_MULTI      ("filter",          ACTION_MULTI_FILTER)
-DEFINE_ACTION_BOOL       ("hide-forwarded",  ACTION_HIDE_FORWARDED)
-DEFINE_ACTION_STRING     ("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM)
-DEFINE_CGI_PARAM_RADIO   ("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM,          "block", 1)
-DEFINE_CGI_PARAM_CUSTOM  ("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM,          "spam_me_senseless@sittingduck.xyz")
-DEFINE_ACTION_STRING     ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
-DEFINE_CGI_PARAM_RADIO   ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER,       "forge", 1)
-DEFINE_CGI_PARAM_RADIO   ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER,       "block", 0)
-DEFINE_CGI_PARAM_CUSTOM  ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER,       "http://www.google.com/")
-DEFINE_ACTION_STRING     ("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT)
-DEFINE_CGI_PARAM_NO_RADIO("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT,    "Privoxy/3.0 (Anonymous)")
-DEFINE_ACTION_BOOL       ("image",           ACTION_IMAGE)
-DEFINE_ACTION_STRING     ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER)
-DEFINE_CGI_PARAM_RADIO   ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER, "pattern", 1)
-DEFINE_CGI_PARAM_RADIO   ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER, "blank", 0)
-DEFINE_CGI_PARAM_CUSTOM  ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER, CGI_PREFIX "show-banner?type=pattern")
-DEFINE_ACTION_STRING     ("limit-connect",   ACTION_LIMIT_CONNECT,   ACTION_STRING_LIMIT_CONNECT)
-DEFINE_CGI_PARAM_NO_RADIO("limit-connect",   ACTION_LIMIT_CONNECT,   ACTION_STRING_LIMIT_CONNECT,  "443")
-DEFINE_ACTION_BOOL       ("no-compression",  ACTION_NO_COMPRESSION)
-DEFINE_ACTION_BOOL       ("no-cookies-keep", ACTION_NO_COOKIE_KEEP)
-DEFINE_ACTION_BOOL       ("no-cookies-read", ACTION_NO_COOKIE_READ)
-DEFINE_ACTION_BOOL       ("no-cookies-set",  ACTION_NO_COOKIE_SET)
-DEFINE_ACTION_BOOL       ("no-popups",       ACTION_NO_POPUPS)
-DEFINE_ACTION_BOOL       ("vanilla-wafer",   ACTION_VANILLA_WAFER)
-DEFINE_ACTION_MULTI      ("wafer",           ACTION_MULTI_WAFER)
+DEFINE_ACTION_MULTI ("add-header",      ACTION_MULTI_ADD_HEADER)
+DEFINE_ACTION_BOOL  ("block",           ACTION_BLOCK)
+DEFINE_ACTION_STRING("deanimate-gifs",  ACTION_DEANIMATE,       ACTION_STRING_DEANIMATE)
+DEFINE_ACTION_BOOL  ("fast-redirects",  ACTION_FAST_REDIRECTS)
+DEFINE_ACTION_BOOL  ("filter",          ACTION_FILTER)
+DEFINE_ACTION_BOOL  ("hide-forwarded",  ACTION_HIDE_FORWARDED)
+DEFINE_ACTION_STRING("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM)
+DEFINE_ACTION_STRING("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
+DEFINE_ACTION_STRING("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT)
+DEFINE_ACTION_BOOL  ("image",           ACTION_IMAGE)
+DEFINE_ACTION_STRING("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER)
+DEFINE_ACTION_BOOL  ("no-cookies-read", ACTION_NO_COOKIE_READ)
+DEFINE_ACTION_BOOL  ("no-cookies-set",  ACTION_NO_COOKIE_SET)
+DEFINE_ACTION_BOOL  ("no-popups",       ACTION_NO_POPUPS)
+DEFINE_ACTION_BOOL  ("vanilla-wafer",   ACTION_VANILLA_WAFER)
+DEFINE_ACTION_MULTI ("wafer",           ACTION_MULTI_WAFER)
 #if DEFINE_ACTION_ALIAS
-DEFINE_ACTION_BOOL       ("no-popup",        ACTION_NO_POPUPS)
-DEFINE_ACTION_STRING     ("hide-referrer",   ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
+DEFINE_ACTION_BOOL  ("no-popup",        ACTION_NO_POPUPS)
+DEFINE_ACTION_STRING("hide-referrer",   ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
 #endif /* if DEFINE_ACTION_ALIAS */
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-#undef DEFINE_CGI_PARAM_CUSTOM
-#undef DEFINE_CGI_PARAM_RADIO
-#undef DEFINE_CGI_PARAM_NO_RADIO
-
index e0f3fca..e4e5aaf 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1,4 +1,4 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $";
+const char actions_rcs[] = "$Id: actions.c,v 1.7 2001/06/09 10:55:28 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.c,v $
@@ -7,13 +7,13 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
  *                Functions declared include: FIXME
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -33,88 +33,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: actions.c,v $
- *    Revision 1.25  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.24  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.23  2002/03/07 03:46:16  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.22  2002/01/21 00:27:02  jongfoster
- *    Allowing free_action(NULL).
- *    Moving the functions that #include actionlist.h to the end of the file,
- *    because the Visual C++ 97 debugger gets extremely confused if you try
- *    to debug any code that comes after them in the file.
- *
- *    Revision 1.21  2002/01/17 20:54:44  jongfoster
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.20  2001/11/22 21:56:49  jongfoster
- *    Making action_spec->flags into an unsigned long rather than just an
- *    unsigned int.
- *    Fixing a bug in the display of -add-header and -wafer
- *
- *    Revision 1.19  2001/11/13 00:14:07  jongfoster
- *    Fixing stupid bug now I've figured out what || means.
- *    (It always returns 0 or 1, not one of it's paramaters.)
- *
- *    Revision 1.18  2001/11/07 00:06:06  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile.
- *
- *    Revision 1.17  2001/10/25 03:40:47  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.16  2001/10/23 21:30:30  jongfoster
- *    Adding error-checking to selected functions.
- *
- *    Revision 1.15  2001/10/14 21:58:22  jongfoster
- *    Adding support for the CGI-based editor:
- *    - Exported get_actions()
- *    - Added new function free_alias_list()
- *    - Added support for {{settings}} and {{description}} blocks
- *      in the actions file.  They are currently ignored.
- *    - Added restriction to only one {{alias}} block which must appear
- *      first in the file, to simplify the editor's rewriting rules.
- *    - Note that load_actions_file() is no longer used by the CGI-based
- *      editor, but some of the other routines in this file are.
- *
- *    Revision 1.14  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.13  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.12  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.11  2001/09/14 00:17:32  jongfoster
- *    Tidying up memory allocation. New function init_action().
- *
- *    Revision 1.10  2001/09/10 10:14:34  oes
- *    Removing unused variable
- *
- *    Revision 1.9  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/06/29 13:19:52  oes
- *    Removed logentry from cancelled commit
- *
  *    Revision 1.7  2001/06/09 10:55:28  jongfoster
  *    Changing BUFSIZ ==> BUFFER_SIZE
  *
@@ -146,8 +64,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
 
 #include <stdio.h>
 #include <string.h>
-#include <assert.h>
-#include <stdlib.h>
 
 #include "project.h"
 #include "jcc.h"
@@ -156,14 +72,27 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
 #include "miscutil.h"
 #include "errlog.h"
 #include "loaders.h"
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-#include "encode.h"
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-#include "urlmatch.h"
 
 const char actions_h_rcs[] = ACTIONS_H_VERSION;
 
 
+/* Turn off everything except forwarding */
+/* This structure is used to hold user-defined aliases */
+struct action_alias
+{
+   const char * name;
+   struct action_spec action[1];
+   struct action_alias * next;
+};
+
+
+/*
+ * Must declare this in this file for the above structure.
+ */
+static int get_actions (char *line, 
+                        struct action_alias * alias_list,
+                        struct action_spec *cur_action);
+
 /*
  * We need the main list of options.
  *
@@ -178,10 +107,10 @@ const char actions_h_rcs[] = ACTIONS_H_VERSION;
 #define AV_ADD_STRING 1 /* +stropt{string} */
 #define AV_REM_STRING 2 /* -stropt */
 #define AV_ADD_MULTI  3 /* +multiopt{string} +multiopt{string2} */
-#define AV_REM_MULTI  4 /* -multiopt{string} -multiopt          */
+#define AV_REM_MULTI  4 /* -multiopt{string} -multiopt{*}       */
 
 /*
- * We need a structure to hold the name, flag changes,
+ * We need a structure to hold the name, flag changes, 
  * type, and string index.
  */
 struct action_name
@@ -237,14 +166,13 @@ static const struct action_name action_names[] =
  *          1  :  cur_action = Current actions, to modify.
  *          2  :  new_action = Action to add.
  *
- * Returns     :  JB_ERR_OK or JB_ERR_MEMORY
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err merge_actions (struct action_spec *dest,
-                      const struct action_spec *src)
+void merge_actions (struct action_spec *dest, 
+                    const struct action_spec *src)
 {
    int i;
-   jb_err err;
 
    dest->mask &= src->mask;
    dest->add  &= src->mask;
@@ -257,10 +185,6 @@ jb_err merge_actions (struct action_spec *dest,
       {
          freez(dest->string[i]);
          dest->string[i] = strdup(str);
-         if (NULL == dest->string[i])
-         {
-            return JB_ERR_MEMORY;
-         }
       }
    }
 
@@ -269,10 +193,10 @@ jb_err merge_actions (struct action_spec *dest,
       if (src->multi_remove_all[i])
       {
          /* Remove everything from dest */
-         list_remove_all(dest->multi_remove[i]);
+         destroy_list(dest->multi_remove[i]);
+         destroy_list(dest->multi_add[i]);
          dest->multi_remove_all[i] = 1;
-
-         err = list_duplicate(dest->multi_add[i], src->multi_add[i]);
+         list_duplicate(dest->multi_add[i], src->multi_add[i]);
       }
       else if (dest->multi_remove_all[i])
       {
@@ -281,23 +205,16 @@ jb_err merge_actions (struct action_spec *dest,
           * about what we add.
           */
          list_remove_list(dest->multi_add[i], src->multi_remove[i]);
-         err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
+         list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
       }
       else
       {
          /* No "remove all"s to worry about. */
          list_remove_list(dest->multi_add[i], src->multi_remove[i]);
-         err = list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]);
-         if (!err) err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
-      }
-
-      if (err)
-      {
-         return err;
+         list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]);
+         list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
       }
    }
-
-   return JB_ERR_OK;
 }
 
 
@@ -307,8 +224,6 @@ jb_err merge_actions (struct action_spec *dest,
  *
  * Description :  Copy an action_specs.
  *                Similar to "cur_action = new_action".
- *                Note that dest better not contain valid data
- *                - it's overwritten, not freed.
  *
  * Parameters  :
  *          1  :  dest = Destination of copy.
@@ -317,13 +232,10 @@ jb_err merge_actions (struct action_spec *dest,
  * Returns     :  N/A
  *
  *********************************************************************/
-jb_err copy_action (struct action_spec *dest,
-                    const struct action_spec *src)
+void copy_action (struct action_spec *dest, 
+                  const struct action_spec *src)
 {
    int i;
-   jb_err err = JB_ERR_OK;
-
-   memset(dest, '\0', sizeof(*dest));
 
    dest->mask = src->mask;
    dest->add  = src->add;
@@ -331,32 +243,15 @@ jb_err copy_action (struct action_spec *dest,
    for (i = 0; i < ACTION_STRING_COUNT; i++)
    {
       char * str = src->string[i];
-      if (str)
-      {
-         str = strdup(str);
-         if (!str)
-         {
-            return JB_ERR_MEMORY;
-         }
-         dest->string[i] = str;
-      }
+      dest->string[i] = (str ? strdup(str) : NULL);
    }
 
    for (i = 0; i < ACTION_MULTI_COUNT; i++)
    {
       dest->multi_remove_all[i] = src->multi_remove_all[i];
-      err = list_duplicate(dest->multi_remove[i], src->multi_remove[i]);
-      if (err)
-      {
-         return err;
-      }
-      err = list_duplicate(dest->multi_add[i],    src->multi_add[i]);
-      if (err)
-      {
-         return err;
-      }
+      list_duplicate(dest->multi_remove[i], src->multi_remove[i]);
+      list_duplicate(dest->multi_add[i],    src->multi_add[i]);
    }
-   return err;
 }
 
 
@@ -364,9 +259,7 @@ jb_err copy_action (struct action_spec *dest,
  *
  * Function    :  free_action
  *
- * Description :  Destroy an action_spec.  Frees memory used by it,
- *                except for the memory used by the struct action_spec
- *                itself.
+ * Description :  Free an action_specs.
  *
  * Parameters  :
  *          1  :  src = Source to free.
@@ -378,11 +271,6 @@ void free_action (struct action_spec *src)
 {
    int i;
 
-   if (src == NULL)
-   {
-      return;
-   }
-
    for (i = 0; i < ACTION_STRING_COUNT; i++)
    {
       freez(src->string[i]);
@@ -418,14 +306,14 @@ void free_action (struct action_spec *src)
  *                       we found an action.
  *          2  :  name = [out] Start of action name, null
  *                       terminated.  NULL on EOL
- *          3  :  value = [out] Start of action value, null
+ *          3  :  value = [out] Start of action value, null 
  *                        terminated.  NULL if none or EOL.
  *
- * Returns     :  JB_ERR_OK => Ok
- *                JB_ERR_PARSE => Mismatched {} (line was trashed anyway)
+ * Returns     :  0 => Ok
+ *                nonzero => Mismatched {} (line was trashed anyway)
  *
  *********************************************************************/
-jb_err get_action_token(char **line, char **name, char **value)
+int get_action_token(char **line, char **name, char **value)
 {
    char * str = *line;
    char ch;
@@ -449,19 +337,19 @@ jb_err get_action_token(char **line, char **name, char **value)
    if (*str == '{')
    {
       /* null name, just value is prohibited */
-      return JB_ERR_PARSE;
+      return 1;
    }
 
    *name = str;
 
    /* parse option */
-   while (((ch = *str) != '\0') &&
+   while (((ch = *str) != '\0') && 
           (ch != ' ') && (ch != '\t') && (ch != '{'))
    {
       if (ch == '}')
       {
-         /* error, '}' without '{' */
-         return JB_ERR_PARSE;
+         /* error */
+         return 1;
       }
       str++;
    }
@@ -480,7 +368,7 @@ jb_err get_action_token(char **line, char **name, char **value)
          /* More to parse next time. */
          *line = str + 1;
       }
-      return JB_ERR_OK;
+      return 0;
    }
 
    str++;
@@ -491,7 +379,7 @@ jb_err get_action_token(char **line, char **name, char **value)
    {
       /* error */
       *value = NULL;
-      return JB_ERR_PARSE;
+      return 1;
    }
 
    /* got value */
@@ -500,7 +388,7 @@ jb_err get_action_token(char **line, char **name, char **value)
 
    chomp(*value);
 
-   return JB_ERR_OK;
+   return 0;
 }
 
 
@@ -517,17 +405,15 @@ jb_err get_action_token(char **line, char **name, char **value)
  *          3  :  cur_action = Where to store the action.  Caller
  *                             allocates memory.
  *
- * Returns     :  JB_ERR_OK => Ok
- *                JB_ERR_PARSE => Parse error (line was trashed anyway)
- *                nonzero => Out of memory (line was trashed anyway)
+ * Returns     :  0 => Ok
+ *                nonzero => Error (line was trashed anyway)
  *
  *********************************************************************/
-jb_err get_actions(char *line,
-                   struct action_alias * alias_list,
-                   struct action_spec *cur_action)
+static int get_actions(char *line,
+                       struct action_alias * alias_list,
+                       struct action_spec *cur_action)
 {
-   jb_err err;
-   init_action(cur_action);
+   memset(cur_action, '\0', sizeof(*cur_action));
    cur_action->mask = ACTION_MASK_ALL;
 
    while (line)
@@ -535,16 +421,15 @@ jb_err get_actions(char *line,
       char * option = NULL;
       char * value = NULL;
 
-      err = get_action_token(&line, &option, &value);
-      if (err)
+      if (get_action_token(&line, &option, &value))
       {
-         return err;
+         return 1;
       }
 
       if (option)
       {
          /* handle option in 'option' */
-
+      
          /* Check for standard action name */
          const struct action_name * action = action_names;
 
@@ -570,15 +455,11 @@ jb_err get_actions(char *line,
 
                   if ((value == NULL) || (*value == '\0'))
                   {
-                     return JB_ERR_PARSE;
+                     return 1;
                   }
                   /* FIXME: should validate option string here */
                   freez (cur_action->string[action->index]);
                   cur_action->string[action->index] = strdup(value);
-                  if (NULL == cur_action->string[action->index])
-                  {
-                     return JB_ERR_MEMORY;
-                  }
                   break;
                }
             case AV_REM_STRING:
@@ -592,28 +473,24 @@ jb_err get_actions(char *line,
                {
                   /* append multi string. */
 
-                  struct list * remove_p = cur_action->multi_remove[action->index];
-                  struct list * add_p    = cur_action->multi_add[action->index];
+                  struct list * remove = cur_action->multi_remove[action->index];
+                  struct list * add    = cur_action->multi_add[action->index];
 
                   if ((value == NULL) || (*value == '\0'))
                   {
-                     return JB_ERR_PARSE;
+                     return 1;
                   }
 
-                  list_remove_item(remove_p, value);
-                  err = enlist_unique(add_p, value, 0);
-                  if (err)
-                  {
-                     return err;
-                  }
+                  list_remove_item(remove, value);
+                  enlist_unique(add, value, 0);
                   break;
                }
             case AV_REM_MULTI:
                {
                   /* remove multi string. */
 
-                  struct list * remove_p = cur_action->multi_remove[action->index];
-                  struct list * add_p    = cur_action->multi_add[action->index];
+                  struct list * remove = cur_action->multi_remove[action->index];
+                  struct list * add    = cur_action->multi_add[action->index];
 
                   if ( (value == NULL) || (*value == '\0')
                      || ((*value == '*') && (value[1] == '\0')) )
@@ -623,8 +500,8 @@ jb_err get_actions(char *line,
                       *
                       * Remove *ALL*.
                       */
-                     list_remove_all(remove_p);
-                     list_remove_all(add_p);
+                     destroy_list(remove);
+                     destroy_list(add);
                      cur_action->multi_remove_all[action->index] = 1;
                   }
                   else
@@ -634,27 +511,22 @@ jb_err get_actions(char *line,
                      if ( !cur_action->multi_remove_all[action->index] )
                      {
                         /* there isn't a catch-all in the remove list already */
-                        err = enlist_unique(remove_p, value, 0);
-                        if (err)
-                        {
-                           return err;
-                        }
+                        enlist_unique(remove, value, 0);
                      }
-                     list_remove_item(add_p, value);
+                     list_remove_item(add, value);
                   }
                   break;
                }
             default:
                /* Shouldn't get here unless there's memory corruption. */
-               assert(0);
-               return JB_ERR_PARSE;
+               return 1;
             }
          }
          else
          {
             /* try user aliases. */
             const struct action_alias * alias = alias_list;
-
+            
             while ( (alias != NULL) && (0 != strcmpic(alias->name, option)) )
             {
                alias = alias->next;
@@ -667,51 +539,187 @@ jb_err get_actions(char *line,
             else
             {
                /* Bad action name */
-               return JB_ERR_PARSE;
+               return 1;
             }
          }
       }
    }
 
-   return JB_ERR_OK;
+   return 0;
 }
 
 
 /*********************************************************************
  *
- * Function    :  init_current_action
+ * Function    :  actions_to_text
  *
- * Description :  Zero out an action.
+ * Description :  Converts a actionsfile entry from numeric form
+ *                ("mask" and "add") to text.
  *
  * Parameters  :
- *          1  :  dest = An uninitialized current_action_spec.
+ *          1  :  mask = As from struct url_actions
+ *          2  :  add  = As from struct url_actions
  *
- * Returns     :  N/A
+ * Returns     :  A string.  Caller must free it.
  *
  *********************************************************************/
-void init_current_action (struct current_action_spec *dest)
+char * actions_to_text(struct action_spec *action)
 {
-   memset(dest, '\0', sizeof(*dest));
+   unsigned mask = action->mask;
+   unsigned add  = action->add;
+   char * result = strdup("");
+   struct list * lst;
 
-   dest->flags = ACTION_MOST_COMPATIBLE;
+   /* sanity - prevents "-feature +feature" */
+   mask |= add;
+
+
+#define DEFINE_ACTION_BOOL(__name, __bit)   \
+   if (!(mask & __bit))                     \
+   {                                        \
+      result = strsav(result, " -" __name); \
+   }                                        \
+   else if (add & __bit)                    \
+   {                                        \
+      result = strsav(result, " +" __name); \
+   }
+
+#define DEFINE_ACTION_STRING(__name, __bit, __index) \
+   if (!(mask & __bit))                     \
+   {                                        \
+      result = strsav(result, " -" __name); \
+   }                                        \
+   else if (add & __bit)                    \
+   {                                        \
+      result = strsav(result, " +" __name "{"); \
+      result = strsav(result, action->string[__index]); \
+      result = strsav(result, "}"); \
+   }
+
+#define DEFINE_ACTION_MULTI(__name, __index)         \
+   if (action->multi_remove_all[__index])            \
+   {                                                 \
+      result = strsav(result, " -" __name "{*}");    \
+   }                                                 \
+   else                                              \
+   {                                                 \
+      lst = action->multi_remove[__index]->next;     \
+      while (lst)                                    \
+      {                                              \
+         result = strsav(result, " -" __name "{");   \
+         result = strsav(result, lst->str);          \
+         result = strsav(result, "}");               \
+         lst = lst->next;                            \
+      }                                              \
+   }                                                 \
+   lst = action->multi_add[__index]->next;           \
+   while (lst)                                       \
+   {                                                 \
+      result = strsav(result, " +" __name "{");      \
+      result = strsav(result, lst->str);             \
+      result = strsav(result, "}");                  \
+      lst = lst->next;                               \
+   }
+
+#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
+
+#include "actionlist.h"
+
+#undef DEFINE_ACTION_MULTI
+#undef DEFINE_ACTION_STRING
+#undef DEFINE_ACTION_BOOL
+#undef DEFINE_ACTION_ALIAS
+
+   return result;
 }
 
 
 /*********************************************************************
  *
- * Function    :  init_action
+ * Function    :  current_actions_to_text
+ *
+ * Description :  Converts a actionsfile entry to text.
+ *
+ * Parameters  :
+ *          1  :  action = Action
+ *
+ * Returns     :  A string.  Caller must free it.
+ *
+ *********************************************************************/
+char * current_action_to_text(struct current_action_spec *action)
+{
+   unsigned flags  = action->flags;
+   char * result = strdup("");
+   struct list * lst;
+
+#define DEFINE_ACTION_BOOL(__name, __bit)   \
+   if (flags & __bit)                       \
+   {                                        \
+      result = strsav(result, " +" __name); \
+   }                                        \
+   else                                     \
+   {                                        \
+      result = strsav(result, " -" __name); \
+   }
+
+#define DEFINE_ACTION_STRING(__name, __bit, __index)    \
+   if (flags & __bit)                                   \
+   {                                                    \
+      result = strsav(result, " +" __name "{");         \
+      result = strsav(result, action->string[__index]); \
+      result = strsav(result, "}");                     \
+   }                                                    \
+   else                                                 \
+   {                                                    \
+      result = strsav(result, " -" __name);             \
+   }
+
+#define DEFINE_ACTION_MULTI(__name, __index)            \
+   lst = action->multi[__index]->next;                  \
+   if (lst == NULL)                                     \
+   {                                                    \
+      result = strsav(result, " -" __name);             \
+   }                                                    \
+   else                                                 \
+   {                                                    \
+      while (lst)                                       \
+      {                                                 \
+         result = strsav(result, " +" __name "{");      \
+         result = strsav(result, lst->str);             \
+         result = strsav(result, "}");                  \
+         lst = lst->next;                               \
+      }                                                 \
+   }
+
+#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
+
+#include "actionlist.h"
+
+#undef DEFINE_ACTION_MULTI
+#undef DEFINE_ACTION_STRING
+#undef DEFINE_ACTION_BOOL
+#undef DEFINE_ACTION_ALIAS
+
+   return result;
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  init_current_action
  *
  * Description :  Zero out an action.
  *
  * Parameters  :
- *          1  :  dest = An uninitialized action_spec.
+ *          1  :  dest = An uninitialized current_action_spec.
  *
  * Returns     :  N/A
  *
  *********************************************************************/
-void init_action (struct action_spec *dest)
+void init_current_action (struct current_action_spec *dest)
 {
    memset(dest, '\0', sizeof(*dest));
+   dest->flags = ACTION_MOST_COMPATIBLE;
 }
 
 
@@ -725,7 +733,7 @@ void init_action (struct action_spec *dest)
  *                is that this one doesn't allocate memory for
  *                strings (so "src" better be in memory for at least
  *                as long as "dest" is, and you'd better free
- *                "dest" using "free_current_action").
+ *                "dest" using "current_free_action").
  *                Also, there is no  mask or remove lists in dest.
  *                (If we're applying it to a URL, we don't need them)
  *
@@ -733,15 +741,13 @@ void init_action (struct action_spec *dest)
  *          1  :  dest = Current actions, to modify.
  *          2  :  src = Action to add.
  *
- * Returns  0  :  no error
- *        !=0  :  error, probably JB_ERR_MEMORY.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err merge_current_action (struct current_action_spec *dest,
-                             const struct action_spec *src)
+void merge_current_action (struct current_action_spec *dest, 
+                           const struct action_spec *src)
 {
    int i;
-   jb_err err = JB_ERR_OK;
 
    dest->flags  &= src->mask;
    dest->flags  |= src->add;
@@ -751,13 +757,8 @@ jb_err merge_current_action (struct current_action_spec *dest,
       char * str = src->string[i];
       if (str)
       {
-         str = strdup(str);
-         if (!str)
-         {
-            return JB_ERR_MEMORY;
-         }
          freez(dest->string[i]);
-         dest->string[i] = str;
+         dest->string[i] = strdup(str);
       }
    }
 
@@ -765,24 +766,16 @@ jb_err merge_current_action (struct current_action_spec *dest,
    {
       if (src->multi_remove_all[i])
       {
-         /* Remove everything from dest, then add src->multi_add */
-         err = list_duplicate(dest->multi[i], src->multi_add[i]);
-         if (err)
-         {
-            return err;
-         }
+         /* Remove everything from dest */
+         destroy_list(dest->multi[i]);
+         list_duplicate(dest->multi[i], src->multi_add[i]);
       }
       else
       {
          list_remove_list(dest->multi[i], src->multi_remove[i]);
-         err = list_append_list_unique(dest->multi[i], src->multi_add[i]);
-         if (err)
-         {
-            return err;
-         }
+         list_append_list_unique(dest->multi[i], src->multi_add[i]);
       }
    }
-   return err;
 }
 
 
@@ -790,8 +783,7 @@ jb_err merge_current_action (struct current_action_spec *dest,
  *
  * Function    :  free_current_action
  *
- * Description :  Free memory used by a current_action_spec.
- *                Does not free the current_action_spec itself.
+ * Description :  Free a current_action_spec.
  *
  * Parameters  :
  *          1  :  src = Source to free.
@@ -817,33 +809,6 @@ void free_current_action (struct current_action_spec *src)
 }
 
 
-static struct file_list *current_actions_file  = NULL;
-
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_actions_file
- *
- * Description :  Unloads current actions file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_actions_file(void)
-{
-   if (current_actions_file)
-   {
-      current_actions_file->unloader = unload_actions_file;
-      current_actions_file = NULL;
-   }
-}
-#endif /* FEATURE_GRACEFUL_TERMINATION */
-
-
 /*********************************************************************
  *
  * Function    :  unload_actions_file
@@ -864,8 +829,7 @@ void unload_actions_file(void *file_data)
    while (cur != NULL)
    {
       next = cur->next;
-      free_url_spec(cur->url);
-      free_action(cur->action);
+      free_url(cur->url);
       freez(cur);
       cur = next;
    }
@@ -873,32 +837,6 @@ void unload_actions_file(void *file_data)
 }
 
 
-/*********************************************************************
- *
- * Function    :  free_alias_list
- *
- * Description :  Free memory used by a list of aliases.
- *
- * Parameters  :
- *          1  :  alias_list = Linked list to free.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void free_alias_list(struct action_alias *alias_list)
-{
-   while (alias_list != NULL)
-   {
-      struct action_alias * next = alias_list->next;
-      alias_list->next = NULL;
-      freez(alias_list->name);
-      free_action(alias_list->action);
-      free(alias_list);
-      alias_list = next;
-   }
-}
-
-
 /*********************************************************************
  *
  * Function    :  load_actions_file
@@ -914,29 +852,22 @@ void free_alias_list(struct action_alias *alias_list)
  *********************************************************************/
 int load_actions_file(struct client_state *csp)
 {
-
-   /*
-    * Parser mode.
-    * Note: Keep these in the order they occur in the file, they are
-    * sometimes tested with <=
-    */
-#define MODE_START_OF_FILE 1
-#define MODE_SETTINGS      2
-#define MODE_DESCRIPTION   3
-#define MODE_ALIAS         4
-#define MODE_ACTIONS       5
-
-   int mode = MODE_START_OF_FILE;
+   static struct file_list *current_actions_file  = NULL;
 
    FILE *fp;
+
    struct url_actions *last_perm;
    struct url_actions *perm;
    char  buf[BUFFER_SIZE];
    struct file_list *fs;
-   struct action_spec * cur_action = NULL;
-   int cur_action_used = 0;
+#define MODE_START_OF_FILE 1
+#define MODE_ACTIONS       2
+#define MODE_ALIAS         3
+   int mode = MODE_START_OF_FILE;
+   struct action_spec cur_action[1];
    struct action_alias * alias_list = NULL;
-   unsigned long linenum = 0;
+
+   memset(cur_action, '\0', sizeof(*cur_action));
 
    if (!check_file_changed(current_actions_file, csp->config->actions_file, &fs))
    {
@@ -969,7 +900,7 @@ int load_actions_file(struct client_state *csp)
       return 1; /* never get here */
    }
 
-   while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL)
+   while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
    {
       if (*buf == '{')
       {
@@ -984,9 +915,9 @@ int load_actions_file(struct client_state *csp)
             {
                /* too short */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s", 
-                  csp->config->actions_file, linenum, buf);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
                return 1; /* never get here */
             }
 
@@ -998,87 +929,25 @@ int load_actions_file(struct client_state *csp)
             {
                /* too short */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): {{ }}",
-                  csp->config->actions_file, linenum);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: {{ }}",
+                  csp->config->actions_file);
                return 1; /* never get here */
             }
 
-            /*
-             * An actionsfile can optionally contain the following blocks.
-             * They *MUST* be in this order, to simplify processing:
-             *
-             * {{settings}}
-             * name=value...
-             *
-             * {{description}}
-             * ...free text, format TBD, but no line may start with a '{'...
-             *
-             * {{alias}}
-             * name=actions...
-             *
-             * The actual actions must be *after* these special blocks.
-             * None of these special blocks may be repeated.
-             *
-             */
-            if (0 == strcmpic(start, "settings"))
-            {
-               /* it's a {{settings}} block */
-               if (mode >= MODE_SETTINGS)
-               {
-                  /* {{settings}} must be first thing in file and must only
-                   * appear once.
-                   */
-                  fclose(fp);
-                  log_error(LOG_LEVEL_FATAL,
-                     "can't load actions file '%s': line %lu: {{settings}} must only appear once, and it must be before anything else.",
-                     csp->config->actions_file, linenum);
-               }
-               mode = MODE_SETTINGS;
-            }
-            else if (0 == strcmpic(start, "description"))
-            {
-               /* it's a {{description}} block */
-               if (mode >= MODE_DESCRIPTION)
-               {
-                  /* {{description}} is a singleton and only {{settings}} may proceed it
-                   */
-                  fclose(fp);
-                  log_error(LOG_LEVEL_FATAL,
-                     "can't load actions file '%s': line %lu: {{description}} must only appear once, and only a {{settings}} block may be above it.",
-                     csp->config->actions_file, linenum);
-               }
-               mode = MODE_DESCRIPTION;
-            }
-            else if (0 == strcmpic(start, "alias"))
+            if (0 == strcmpic(start, "alias"))
             {
                /* it's an {{alias}} block */
-               if (mode >= MODE_ALIAS)
-               {
-                  /* {{alias}} must be first thing in file, possibly after
-                   * {{settings}} and {{description}}
-                   *
-                   * {{alias}} must only appear once.
-                   *
-                   * Note that these are new restrictions introduced in
-                   * v2.9.10 in order to make actionsfile editing simpler.
-                   * (Otherwise, reordering actionsfile entries without
-                   * completely rewriting the file becomes non-trivial)
-                   */
-                  fclose(fp);
-                  log_error(LOG_LEVEL_FATAL,
-                     "can't load actions file '%s': line %lu: {{alias}} must only appear once, and it must be before all actions.",
-                     csp->config->actions_file, linenum);
-               }
+
                mode = MODE_ALIAS;
             }
             else
             {
                /* invalid {{something}} block */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): {{%s}}",
-                  csp->config->actions_file, linenum, start);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: {{%s}}",
+                  csp->config->actions_file, start);
                return 1; /* never get here */
             }
          }
@@ -1093,26 +962,7 @@ int load_actions_file(struct client_state *csp)
             mode    = MODE_ACTIONS;
 
             /* free old action */
-            if (cur_action)
-            {
-               if (!cur_action_used)
-               {
-                  free_action(cur_action);
-                  free(cur_action);
-               }
-               cur_action = NULL;
-            }
-            cur_action_used = 0;
-            cur_action = (struct action_spec *)zalloc(sizeof(*cur_action));
-            if (cur_action == NULL)
-            {
-               fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': out of memory",
-                  csp->config->actions_file);
-               return 1; /* never get here */
-            }
-            init_action(cur_action);
+            free_action(cur_action);
 
             /* trim { */
             strcpy(actions_buf, buf + 1);
@@ -1121,11 +971,11 @@ int load_actions_file(struct client_state *csp)
             end = actions_buf + strlen(actions_buf) - 1;
             if (*end != '}')
             {
-               /* No closing } */
+               /* too short */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s",
-                  csp->config->actions_file, linenum, buf);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
                return 1; /* never get here */
             }
             *end = '\0';
@@ -1133,48 +983,42 @@ int load_actions_file(struct client_state *csp)
             /* trim any whitespace immediately inside {} */
             chomp(actions_buf);
 
+            if (*actions_buf == '\0')
+            {
+               /* too short */
+               fclose(fp);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
+               return 1; /* never get here */
+            }
+
             if (get_actions(actions_buf, alias_list, cur_action))
             {
                /* error */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s",
-                  csp->config->actions_file, linenum, buf);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
                return 1; /* never get here */
             }
          }
       }
-      else if (mode == MODE_SETTINGS)
-      {
-         /*
-          * Part of the {{settings}} block.
-          * Ignore for now, but we may want to read & check permissions
-          * when we go multi-user.
-          */
-      }
-      else if (mode == MODE_DESCRIPTION)
-      {
-         /*
-          * Part of the {{description}} block.
-          * Ignore for now.
-          */
-      }
       else if (mode == MODE_ALIAS)
       {
-         /*
-          * define an alias
-          */
+         /* define an alias */
          char  actions_buf[BUFFER_SIZE];
          struct action_alias * new_alias;
+         int more = 1;
 
          char * start = strchr(buf, '=');
          char * end = start;
 
          if ((start == NULL) || (start == buf))
          {
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': invalid alias line (%lu): %s",
-               csp->config->actions_file, linenum, buf);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': invalid alias line: %s",
+               csp->config->actions_file, buf);
             return 1; /* never get here */
          }
 
@@ -1207,9 +1051,9 @@ int load_actions_file(struct client_state *csp)
          }
          if (*start == '\0')
          {
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': invalid alias line (%lu): %s",
-               csp->config->actions_file, linenum, buf);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': invalid alias line: %s",
+               csp->config->actions_file, buf);
             return 1; /* never get here */
          }
 
@@ -1221,12 +1065,12 @@ int load_actions_file(struct client_state *csp)
          {
             /* error */
             fclose(fp);
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': invalid alias line (%lu): %s = %s",
-               csp->config->actions_file, linenum, buf, start);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': invalid alias line: %s = %s",
+               csp->config->actions_file, buf, start);
             return 1; /* never get here */
          }
-
+         
          /* add to list */
          new_alias->next = alias_list;
          alias_list = new_alias;
@@ -1252,9 +1096,9 @@ int load_actions_file(struct client_state *csp)
          if (create_url_spec(perm->url, buf))
          {
             fclose(fp);
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': line %lu: cannot create URL pattern from: %s",
-               csp->config->actions_file, linenum, buf);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': cannot create URL pattern from: %s",
+               csp->config->actions_file, buf);
             return 1; /* never get here */
          }
 
@@ -1266,16 +1110,16 @@ int load_actions_file(struct client_state *csp)
       {
          /* oops - please have a {} line as 1st line in file. */
          fclose(fp);
-         log_error(LOG_LEVEL_FATAL,
-            "can't load actions file '%s': first needed line (%lu) is invalid: %s",
-            csp->config->actions_file, linenum, buf);
+         log_error(LOG_LEVEL_FATAL, 
+            "can't load actions file '%s': first line is invalid: %s",
+            csp->config->actions_file, buf);
          return 1; /* never get here */
       }
       else
       {
          /* How did we get here? This is impossible! */
          fclose(fp);
-         log_error(LOG_LEVEL_FATAL,
+         log_error(LOG_LEVEL_FATAL, 
             "can't load actions file '%s': INTERNAL ERROR - mode = %d",
             csp->config->actions_file, mode);
          return 1; /* never get here */
@@ -1283,10 +1127,24 @@ int load_actions_file(struct client_state *csp)
    }
 
    fclose(fp);
-
+   
    free_action(cur_action);
 
-   free_alias_list(alias_list);
+   while (alias_list != NULL)
+   {
+      struct action_alias * next = alias_list->next;
+      freez((char *)alias_list->name);
+      free_action(alias_list->action);
+      free(alias_list);
+      alias_list = next;
+   }
+
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
 
    /* the old one is now obsolete */
    if (current_actions_file)
@@ -1306,290 +1164,3 @@ int load_actions_file(struct client_state *csp)
    return(0);
 
 }
-
-
-/*********************************************************************
- *
- * Function    :  actions_to_text
- *
- * Description :  Converts a actionsfile entry from numeric form
- *                ("mask" and "add") to text.
- *
- * Parameters  :
- *          1  :  mask = As from struct url_actions
- *          2  :  add  = As from struct url_actions
- *
- * Returns     :  A string.  Caller must free it.
- *                NULL on out-of-memory error.
- *
- *********************************************************************/
-char * actions_to_text(struct action_spec *action)
-{
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   char * result = strdup("");
-   struct list_entry * lst;
-
-   /* sanity - prevents "-feature +feature" */
-   mask |= add;
-
-
-#define DEFINE_ACTION_BOOL(__name, __bit)    \
-   if (!(mask & __bit))                      \
-   {                                         \
-      string_append(&result, " -" __name);   \
-   }                                         \
-   else if (add & __bit)                     \
-   {                                         \
-      string_append(&result, " +" __name);   \
-   }
-
-#define DEFINE_ACTION_STRING(__name, __bit, __index)   \
-   if (!(mask & __bit))                                \
-   {                                                   \
-      string_append(&result, " -" __name);             \
-   }                                                   \
-   else if (add & __bit)                               \
-   {                                                   \
-      string_append(&result, " +" __name "{");         \
-      string_append(&result, action->string[__index]); \
-      string_append(&result, "}");                     \
-   }
-
-#define DEFINE_ACTION_MULTI(__name, __index)         \
-   if (action->multi_remove_all[__index])            \
-   {                                                 \
-      string_append(&result, " -" __name);           \
-   }                                                 \
-   else                                              \
-   {                                                 \
-      lst = action->multi_remove[__index]->first;    \
-      while (lst)                                    \
-      {                                              \
-         string_append(&result, " -" __name "{");    \
-         string_append(&result, lst->str);           \
-         string_append(&result, "}");                \
-         lst = lst->next;                            \
-      }                                              \
-   }                                                 \
-   lst = action->multi_add[__index]->first;          \
-   while (lst)                                       \
-   {                                                 \
-      string_append(&result, " +" __name "{");       \
-      string_append(&result, lst->str);              \
-      string_append(&result, "}");                   \
-      lst = lst->next;                               \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-
-   return result;
-}
-
-
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-/*********************************************************************
- *
- * Function    :  actions_to_html
- *
- * Description :  Converts a actionsfile entry from numeric form
- *                ("mask" and "add") to a <br>-seperated HTML string.
- *
- * Parameters  :
- *          1  :  mask = As from struct url_actions
- *          2  :  add  = As from struct url_actions
- *
- * Returns     :  A string.  Caller must free it.
- *                NULL on out-of-memory error.
- *
- *********************************************************************/
-char * actions_to_html(struct action_spec *action)
-{
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   char * result = strdup("");
-   char * enc_str;
-   struct list_entry * lst;
-
-   /* sanity - prevents "-feature +feature" */
-   mask |= add;
-
-
-#define DEFINE_ACTION_BOOL(__name, __bit)       \
-   if (!(mask & __bit))                         \
-   {                                            \
-      string_append(&result, "\n<br>-" __name); \
-   }                                            \
-   else if (add & __bit)                        \
-   {                                            \
-      string_append(&result, "\n<br>+" __name); \
-   }
-
-#define DEFINE_ACTION_STRING(__name, __bit, __index) \
-   if (!(mask & __bit))                              \
-   {                                                 \
-      string_append(&result, "\n<br>-" __name);      \
-   }                                                 \
-   else if (add & __bit)                             \
-   {                                                 \
-      string_append(&result, "\n<br>+" __name "{");  \
-      if (NULL == result)                            \
-      {                                              \
-         return NULL;                                \
-      }                                              \
-      enc_str = html_encode(action->string[__index]);\
-      if (NULL == enc_str)                           \
-      {                                              \
-         free(result);                               \
-         return NULL;                                \
-      }                                              \
-      string_append(&result, enc_str);               \
-      free(enc_str);                                 \
-      string_append(&result, "}");                   \
-   }
-
-#define DEFINE_ACTION_MULTI(__name, __index)          \
-   if (action->multi_remove_all[__index])             \
-   {                                                  \
-      string_append(&result, "\n<br>-" __name);       \
-   }                                                  \
-   else                                               \
-   {                                                  \
-      lst = action->multi_remove[__index]->first;     \
-      while (lst)                                     \
-      {                                               \
-         string_append(&result, "\n<br>-" __name "{");\
-         if (NULL == result)                          \
-         {                                            \
-            return NULL;                              \
-         }                                            \
-         enc_str = html_encode(lst->str);             \
-         if (NULL == enc_str)                         \
-         {                                            \
-            free(result);                             \
-            return NULL;                              \
-         }                                            \
-         string_append(&result, enc_str);             \
-         free(enc_str);                               \
-         string_append(&result, "}");                 \
-         lst = lst->next;                             \
-      }                                               \
-   }                                                  \
-   lst = action->multi_add[__index]->first;           \
-   while (lst)                                        \
-   {                                                  \
-      string_append(&result, "\n<br>+" __name "{");   \
-      if (NULL == result)                             \
-      {                                               \
-         return NULL;                                 \
-      }                                               \
-      enc_str = html_encode(lst->str);                \
-      if (NULL == enc_str)                            \
-      {                                               \
-         free(result);                                \
-         return NULL;                                 \
-      }                                               \
-      string_append(&result, enc_str);                \
-      free(enc_str);                                  \
-      string_append(&result, "}");                    \
-      lst = lst->next;                                \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-
-   /* trim leading <br> */
-   if (result && *result)
-   {
-      char * s = result;
-      result = strdup(result + 5);
-      free(s);
-   }
-
-   return result;
-}
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-
-/*********************************************************************
- *
- * Function    :  current_actions_to_text
- *
- * Description :  Converts a actionsfile entry to text.
- *
- * Parameters  :
- *          1  :  action = Action
- *
- * Returns     :  A string.  Caller must free it.
- *                NULL on out-of-memory error.
- *
- *********************************************************************/
-char * current_action_to_text(struct current_action_spec *action)
-{
-   unsigned long flags  = action->flags;
-   char * result = strdup("");
-   struct list_entry * lst;
-
-#define DEFINE_ACTION_BOOL(__name, __bit)  \
-   if (flags & __bit)                      \
-   {                                       \
-      string_append(&result, " +" __name); \
-   }                                       \
-   else                                    \
-   {                                       \
-      string_append(&result, " -" __name); \
-   }
-
-#define DEFINE_ACTION_STRING(__name, __bit, __index)   \
-   if (flags & __bit)                                  \
-   {                                                   \
-      string_append(&result, " +" __name "{");         \
-      string_append(&result, action->string[__index]); \
-      string_append(&result, "}");                     \
-   }                                                   \
-   else                                                \
-   {                                                   \
-      string_append(&result, " -" __name);             \
-   }
-
-#define DEFINE_ACTION_MULTI(__name, __index)           \
-   lst = action->multi[__index]->first;                \
-   if (lst == NULL)                                    \
-   {                                                   \
-      string_append(&result, " -" __name);             \
-   }                                                   \
-   else                                                \
-   {                                                   \
-      while (lst)                                      \
-      {                                                \
-         string_append(&result, " +" __name "{");      \
-         string_append(&result, lst->str);             \
-         string_append(&result, "}");                  \
-         lst = lst->next;                              \
-      }                                                \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-
-   return result;
-}
index 04434e2..d71d8c3 100644 (file)
--- a/actions.h
+++ b/actions.h
@@ -1,6 +1,6 @@
-#ifndef ACTIONS_H_INCLUDED
-#define ACTIONS_H_INCLUDED
-#define ACTIONS_H_VERSION "$Id: actions.h,v 1.8 2002/03/24 13:25:43 swa Exp $"
+#ifndef _ACTIONS_H
+#define _ACTIONS_H
+#define ACTIONS_H_VERSION "$Id: actions.h,v ??? $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.h,v $
@@ -9,7 +9,7 @@
  *                Functions declared include: FIXME
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: actions.h,v $
- *    Revision 1.8  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.7  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.6  2001/10/23 21:30:30  jongfoster
- *    Adding error-checking to selected functions.
- *
- *    Revision 1.5  2001/10/14 21:58:22  jongfoster
- *    Adding support for the CGI-based editor:
- *    - Exported get_actions()
- *    - Added new function free_alias_list()
- *    - Added support for {{settings}} and {{description}} blocks
- *      in the actions file.  They are currently ignored.
- *    - Added restriction to only one {{alias}} block which must appear
- *      first in the file, to simplify the editor's rewriting rules.
- *    - Note that load_actions_file() is no longer used by the CGI-based
- *      editor, but some of the other routines in this file are.
- *
- *    Revision 1.4  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.3  2001/09/14 00:17:32  jongfoster
- *    Tidying up memory allocation. New function init_action().
- *
- *    Revision 1.2  2001/07/29 19:01:11  jongfoster
- *    Changed _FILENAME_H to FILENAME_H_INCLUDED.
- *    Added forward declarations for needed structures.
- *
- *    Revision 1.1  2001/05/31 21:16:46  jongfoster
- *    Moved functions to process the action list into this new file.
- *
  *
  *********************************************************************/
 \f
@@ -84,51 +44,23 @@ extern "C" {
 #endif
 
 
-struct action_spec;
-struct current_action_spec;
-struct client_state;
-
-
-
-/* This structure is used to hold user-defined aliases */
-struct action_alias
-{
-   const char * name;
-   struct action_spec action[1];
-   struct action_alias * next;
-};
-
-
-extern jb_err get_actions (char *line, 
-                           struct action_alias * alias_list,
-                           struct action_spec *cur_action);
-extern void free_alias_list(struct action_alias *alias_list);
-
-extern void init_action(struct action_spec *dest);
-extern void free_action(struct action_spec *src);
-extern jb_err merge_actions (struct action_spec *dest, 
-                             const struct action_spec *src);
-extern jb_err copy_action (struct action_spec *dest, 
+extern void merge_actions (struct action_spec *dest, 
                            const struct action_spec *src);
+extern void copy_action (struct action_spec *dest, 
+                         const struct action_spec *src);
+extern void free_action (struct action_spec *src);
 extern char * actions_to_text     (struct action_spec *action);
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-extern char * actions_to_html     (struct action_spec *action);
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
 
 extern void init_current_action     (struct current_action_spec *dest);
-extern void free_current_action     (struct current_action_spec *src);
-extern jb_err merge_current_action  (struct current_action_spec *dest, 
+extern void merge_current_action    (struct current_action_spec *dest, 
                                      const struct action_spec *src);
+extern void free_current_action     (struct current_action_spec *src);
 extern char * current_action_to_text(struct current_action_spec *action);
 
-extern jb_err get_action_token(char **line, char **name, char **value);
+extern int get_action_token(char **line, char **name, char **value);
 extern void unload_actions_file(void *file_data);
 extern int load_actions_file(struct client_state *csp);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-void unload_current_actions_file(void);
-#endif
-
 
 /* Revision control strings from this header and associated .c file */
 extern const char actions_rcs[];
@@ -138,7 +70,7 @@ extern const char actions_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef ACTIONS_H_INCLUDED */
+#endif /* ndef _ERRLOG_H */
 
 /*
   Local Variables:
old mode 100644 (file)
new mode 100755 (executable)
similarity index 76%
rename from default.action
rename to actionsfile
index b2c85ef..d3e14d4
@@ -1,43 +1,10 @@
-######################################################################
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/basic.action,v $
-# 
-#  $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $
+#############################################################################
+# Sample actions file for the Internet Junkbuster 2.9.x
 #
-#  Purpose     :  Default actions file, see
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES
+# For information, see http://ijbswa.sourceforge.net/
 #
-#  Copyright   :  Written by and Copyright
-#                 Privoxy team. http://www.privoxy.org/
+# $Id: actionsfile,v 1.2 2001/06/29 21:45:41 oes Exp $
 #
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-# 
-# We value your feedback. However, to provide you with the best support,
-# please note:
-#  
-#  * Use the support forum to get help:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118
-#  * Submit bugs only thru our bug forum:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 
-#    Make sure that the bug has not already been submitted. Please try
-#    to verify that it is a Junkbuster bug, and not a browser or site
-#    bug first. If you are using your own custom configuration, please
-#    try the stock configs to see if the problem is a configuration
-#    related bug. And if not using the latest development snapshot,
-#    please try the latest one. Or even better, CVS sources.
-#  * Submit feature requests only thru our feature request forum:
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-#      
-# For any other issues, feel free to use the mailing lists:
-# http://sourceforge.net/mail/?group_id=11118
-#    
-# Anyone interested in actively participating in development and related
-# discussions can join the appropriate mailing list here:
-# http://sourceforge.net/mail/?group_id=11118. Archives are available
-# here too.
-# 
 #############################################################################
 # Syntax
 #############################################################################
@@ -65,7 +32,7 @@
 #   is a domain-only pattern and will match any request to www.yahoo.com
 # 
 # www.example.com/
-#   means exactly the same (but is slightly less efficient)
+#   means exactly the same
 # 
 # www.example.com/index.html
 #   matches only the document /index.html on www.example.com
 # details.
 # 
 # Please note that matching in the path is CASE INSENSITIVE by default, but
-# you can switch to case sensitive by starting the pattern with the "(?-i)"
-# switch:
+# you can switch to case sensitive at any point in the pattern by using
+# the "(?-i)" switch:
 # 
 # www.example.com/(?-i)PaTtErN.*
 #   will match only documents whose path starts with PaTtErN in exactly this
 #   capitalization.
-#
-# Partially case-sensetive and partially case-insensitive patterns are
-# possible, but the rules about splitting them up are extremely complex
-# - see the PCRE documentation for more information.
 # 
 #############################################################################
 # Action Syntax
 #    most banner animations, but also has the risk of not showing the
 #    entire last frame (if it is only a delta to an earlier frame).
 #
-# +downgrade
-#    Downgrade HTTP/1.1 client requests to HTTP/1.0 and downgrade the
-#    responses as well. Use this action for servers that use HTTP/1.1
-#    protocol features that Junkbuster currently can't handle yet.
-#
 # +fast-redirects
 #    Many sites, like yahoo.com, don't just link to other sites.
 #    Instead, they will link to some script on their own server,
 #    request and send a local redirect back to your browser without
 #    contacting the remote site.
 #
-# +filter{name}
-#    Filter the website through one or more regular expression filters.
-#    Repeat for multiple filters.
-#   
-#    Filters predefined in the supplied re_filterfile include:
-#
-#     html-annoyances:  Get rid of particularly annoying HTML abuse
-#     js-annoyances:    Get rid of particularly annoying JavaScript abuse
-#     no-poups:         Kill all popups in JS and HTML
-#     frameset-borders: Give frames a border
-#     webbugs:          Squish WebBugs (1x1 invisible GIFs used for user tracking)
-#     no-refresh:       Automatic refresh sucks on auto-dialup lines
-#     fun:              Text replacements  for subversive browsing fun!
-#     nimda:            Remove (virus) Nimda code.
-#     banners-by-size:  Kill banners by size
-#     crude-parental:   Kill all web pages that contain the words "sex" or "warez"
-#
+# +filter
+#    Filter the website through the re_filterfile
+#    FIXME: The syntax should be +filter{filename}
 #
 # +hide-forwarded
 #    Block any existing X-Forwarded-for header, and do not add a new one.
 #    in which case a "blocked" image can be sent rather than a HTML page.
 #    See +image-blocker{} for the control over what is actually sent.
 #
+# +image-blocker{logo}
 # +image-blocker{blank}
-# +image-blocker{pattern}
-# +image-blocker{<URL>} with <url> being any valid image URL
+# +image-blocker{http://i.j.b/send-banner}
 #    Decides what to do with URLs that end up tagged with {+block +image}.
-#    There are 4 options:
-#      * "-image-blocker" will send a HTML "blocked" page, usually
-#        resulting in a "broken image" icon.
-#      * "+image-blocker{blank}" will send a 1x1 transparent image
-#      * "+image-blocker{pattern}" will send a 4x4 grey/white pattern
-#        which is less intrusive than the logo but easier to recognize
-#        than the transparent one.
-#      * "+image-blocker{<URL>}" will send a HTTP temporary redirect
-#        to the specified image URL.
-#
-#
-# +limit-connect{portlist}
-#   The CONNECT methods exists in HTTP to allow access to secure websites
-#   (https:// URLs) through proxies. It works very simply: The proxy
-#   connects to the server on the specified port, and then short-circuits
-#   its connections to the cliant and to the remote proxy.
-#   This can be a big security hole, since CONNECT-enabled proxies can
-#   be abused as TCP relays very easily.
-#   By default, i.e. in the absence of a +limit-connect action, Junkbuster
-#   will only allow CONNECT requests to port 443, which is the standard port
-#   for https.
-#   If you want to allow CONNECT for more ports than that, or want to forbid
-#   CONNECT altogether, you can specify a comma separated list of ports and port
-#   ranges (the latter using dashes, with the minimum defaulting to 0 and max to 65K):
-#
-#   +limit-connect{443} # This is the default and need no be specified.
-#   +limit-connect{80,443} # Ports 80 and 443 are OK.
-#   +limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to 100, and above 500 are OK.
-#
-# +no-compression
-#    Prevent the website from compressing the data. Some websites do
-#    that, which is a problem for junkbuster, since +filter, +no-popup
-#    and +gif-deanimate will not work on compressed data. Will slow down
-#    connections to those websites, though.
-#
-# +no-cookies-keep
-#    If the website sets cookies, make sure they are erased when you exit
-#    and restart your web browser.  This makes profiling cookies useless,
-#    but won't break sites which require cookies so that you can log in
-#    or for transactions.
+#    There are 4 options.  "-image-blocker" will send a HTML "blocked" page,
+#    usually resulting in a "broken image" icon.  "+image-blocker{logo}"
+#    will send a "JunkBuster" image.  "+image-blocker{blank}" will send
+#    a 1x1 transparent GIF.  And finally, "+image-blocker{http://xyz.com}"
+#    will send a HTTP temporary redirect to the specified image - this 
+#    has the advantage of the icon being beeing cached by the browser,
+#    which will speed up the display.  
 #
 # +no-cookies-read
 #    Prevent the website from reading cookies
 # Useful aliases
 +no-cookies = +no-cookies-set +no-cookies-read
 -no-cookies = -no-cookies-set -no-cookies-read
+fragile     = -block -no-cookies -filter -fast-redirects -hide-referer -no-popups
+shop        = -no-cookies -filter -fast-redirects
 +imageblock = +block +image
 
-# Fragile sites should have the minimum changes
-fragile     = -block -deanimate-gifs -fast-redirects -filter -hide-referer -no-cookies -no-popups
-
-# Shops should be allowed to set persistent cookies
-shop        = -filter -no-cookies -no-cookies-keep
-
-# Your favourite blend of filters:
-#
-myfilters   = +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\
-              +filter{webbugs} +filter{nimda} +filter{banners-by-size}
-
+#For people who don't like to type too much:  ;-)
+c0 = +no-cookies
+c1 = -no-cookies
+c2 = -no-cookies-set +no-cookies-read
+c3 = +no-cookies-set -no-cookies-read
 #... etc.  Customize to your heart's content.
 
 #############################################################################
 # Defaults
 #############################################################################
 {\
--add-header \
 -block \
--deanimate-gifs \
--downgrade \
 +fast-redirects \
-myfilters \
-+no-compression \
-+no-cookies-keep \
++filter \
 +hide-forwarded \
 +hide-from{block} \
 +hide-referer{forge} \
 -hide-user-agent \
 -image \
-+image-blocker{http://config.privoxy.org/send-banner} \
-+no-cookies-keep \
--no-cookies-read \
--no-cookies-set \
++image-blocker{http://i.j.b/send-banner} \
++no-cookies-read \
++no-cookies-set \
 +no-popups \
--vanilla-wafer \
--wafer \
++vanilla-wafer \
 }
 / # Match all URLs
 
-
 #############################################################################
 # A useful site for testing - shows all headers:
 # http://privacy.net/analyze/
 #############################################################################
-{+add-header{X-Privacy: Yes please} \
+{+add-header{X-Privacy: Yes please} #-add-header{*} \
 +add-header{X-User-Tracking: No thanks!} -filter}
 privacy.net
 
-
 #############################################################################
-# Test for new GIF deanimation feature.
-# Just try http://www.oesterhelt.org/deanimate-demo with and without it.
+# Permissions list
 #############################################################################
-{+deanimate-gifs{last}}
-www.oesterhelt.org/deanimate-demo
-
 
-#############################################################################
 # Sites that need cookies
-#
-# FIXME: Now cookies are allowed by default, do any of these sites
-# need persistent cookies?
-#############################################################################
+{-no-cookies}
+.javasoft.com
+.sun.com
+.yahoo.com
+.msdn.microsoft.com
 
-#{-no-cookies}
-#.javasoft.com
-#.sun.com
-#.yahoo.com
-#.msdn.microsoft.com
-#.sourceforge.net
-#.sf.net
-#www.nexgo.de
-#.myrealbox.com
-#mail.uni.de
-#e-tools.freenet.de
-#office.freenet.de
+# Alternative way of saying the same thing
+{-no-cookies-set -no-cookies-read}
+.sourceforge.net
+.sf.net
 
-#############################################################################
 # These sites are very complex and require
 # minimal interference.
-#############################################################################
 {fragile}
 .office.microsoft.com
 .windowsupdate.microsoft.com
-.deutsche-bank-24.de
 
-#############################################################################
 # Shopping sites - still want to block ads.
-#############################################################################
 {shop}
 .quietpc.com
 .worldpay.com   # for quietpc.com
 .jungle.com
 .scan.co.uk
 
-#############################################################################
 # These shops require pop-ups
-#############################################################################
 {shop -no-popups}
 .dabs.com
 .overclockers.co.uk
 
-#############################################################################
-# Sometimes fast-redirects catches things by mistake
-#############################################################################
 {-fast-redirects}
 www.ukc.ac.uk/cgi-bin/wac\.cgi\?
 login.yahoo.com
-edit.europe.yahoo.com
-.google.com
-.altavista.com/.*(like|url|link):http
-.altavista.com/trans.*urltext=http
-.speedfind.de
-.nytimes.com
 
-#############################################################################
 # Please don't re_filter code!
-#############################################################################
 {-filter}
-.sourceforge.net
-
+.cvs.sourceforge.net
 
 #############################################################################
 # Imagelist:
@@ -517,18 +384,13 @@ www.carbuyer.com/cgi-carbuyer/getimage.cgi
 *.fxweb.com/v2-trackrun\.cgi
 195.63.104.61
 195.63.104.222
-213.165.64.3[4-9]
-213.165.64.4[0-4]
+213.165.64.3[89]
+213.165.64.4[1-4]
 194.221.183.22[1-7]
-a196.g.akamai.net/7/196/2670/000[1-3]/images\.gmx\.net/.*images/.*/.*/
-/cgi-bin/ivw/CP/
+a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/
+/cgi-bin/ivw/CP/CGI
 151.189.8.213/Adimg
 151.189.8.193/Media
-.smartclicks.com/.*/smart(img|banner|host|bar|site)
-.linkexchange.com/.*/showl(ogo|e)
-MoneyBanner.de
-pixel.intares.net/cgi-bin/janus
-ar.atwola.com # This serves all ads for CNN and AOL
 
 #############################################################################
 # Blocklist:
@@ -544,48 +406,49 @@ ar.atwola.com # This serves all ads for CNN and AOL
 ###/*.*/(sponsor|banner)s?[0-9]?/
 ###/*.*/.*banner([-_]?[a-z0-9]+)?\.(gif|jpg)
 
-/?.*/_?(plain|live)?ads?(-banners)?/
-/?.*/abanners/
-/?.*/ad(sdna_image|gifs?)/
-/?.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
-/?.*/adbanners/
-/?.*/ad_banner/
-/?.*/adserver
-/?.*/adstream\.cgi
-/?.*/adv((er)?ts?|ertis(ing|ements?))?/
-/?.*/anzei(gen)?/?
-/?.*/ban[-_]cgi/
-/?.*/banner_?ads/
-/?.*/banner_?anzeigen
-/?.*/bannerimage/
-/?.*/banners?/
-/?.*/banners?\.cgi/
-/?.*/cgi-bin/centralad/getimage
-/?.*/images/addver\.gif
-/?.*/images/advert\.gif
-/?.*/images/marketing/.*\.(gif|jpe?g)
-/?.*/place-ads
-/?.*/popupads/
-/?.*/promobar.*
-/?.*/publicite/
-/?.*/randomads/.*\.(gif|jpe?g)
-/?.*/rekla(ma|me|am)/.*\.(gif|jpe?g)
-/?.*/siteads/
-/?.*/sponsor.*\.gif
-/?.*/sponsors?[0-9]?/
-/?.*/ucbandeimg/
-/?.*/werb\..*
-/?.*/werbebanner/
-/?.*/werbung/.*\.(gif|jpe?g)
-/?.*/adv\.   # www.telegraaf.nl
-/?.*/advert[0-9]+\.jpg
-/?.*bann\.gif
-/?.*/ads/
+/.*/_?(plain|live)?ads?(-banners)?/
+/.*/abanners/
+/.*/ad(sdna_image|gifs?)/
+/.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
+/.*/adbanners/
+/.*/adserver
+/.*/adstream\.cgi
+/.*/adv((er)?ts?|ertis(ing|ements?))?/
+/.*/anzei(gen)?/?
+/.*/ban[-_]cgi/
+/.*/banner_?ads/
+/.*/banner_?anzeigen
+/.*/bannerimage/
+/.*/banners?/
+/.*/banners?\.cgi/
+/.*/cgi-bin/centralad/getimage
+/.*/images/addver\.gif
+/.*/images/advert\.gif
+/.*/images/marketing/.*\.(gif|jpe?g)
+/.*/place-ads
+/.*/popupads/
+/.*/promobar.*
+/.*/publicite/
+/.*/randomads/.*\.(gif|jpe?g)
+/.*/reklama/.*\.(gif|jpe?g)
+/.*/reklame/.*\.(gif|jpe?g)
+/.*/reklaam/.*\.(gif|jpe?g)
+/.*/siteads/
+/.*/sponsor.*\.gif
+/.*/sponsors?[0-9]?/
+/.*/ucbandeimg/
+/.*/werb\..*
+/.*/werbebanner/
+/.*/werbung/.*\.(gif|jpe?g)
+/.*/adv\.   # www.telegraaf.nl
+/.*/advert[0-9]+\.jpg
+/.*bann\.gif
 /Media/Images/Adds/
 /_banner/
 /ad_images/
 /adgenius/
 /adimages/
+/.*/ads/
 /viewad/
 /adserve/
 /adverts/
@@ -624,24 +487,24 @@ ar.atwola.com # This serves all ads for CNN and AOL
 /worldnet/ad\.cgi
 /zhp/auktion/img/
 /cgi-bin/nph-adclick.exe/
-/?.*/Image/BannerAdvertising/
-/?.*/ad-bin/
-/?.*/adlib/server\.cgi
-/?.*/gsa_bs/gsa_bs.cmdl
+/.*/Image/BannerAdvertising/
+/.*/ad-bin/
+/.*/adlib/server\.cgi
+/.*/gsa_bs/gsa_bs.cmdl
 /autoads/
 /anz/pics/
 
 # for our finnish friends, by Kai Puolamaki <Kai.Puolamaki@iki.fi>
-/?.*/mainos/*.*/.*\.gif
-/?.*/mainos/*.*/.*\.jpe?g
+/.*/mainos/*.*/.*\.gif
+/.*/mainos/*.*/.*\.jpe?g
 
 # more from a finnish friend Petri Haapio <pha@iki.fi>
 cgi.tietovalta.fi
 .keltaisetsivut.fi/web/img/\.*gif
 .haku.net/pics/pana\.*gif
 .www.fi/guvat/\.*gif
-/?.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png))
-/?.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png))
+/.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png))
+/.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png))
 
 # and even more from a finnish friend Hannu Napari <Hannu.Napari@hut.fi>
 194.251.243.50/cgi-bin/banner
@@ -652,21 +515,21 @@ www.iltalehti.fi/ilmkuvat
 www.mtv3.fi/mainoskuvat
 
 # <jwz@jwz.org>
-/?.*/adfinity
-/?.*/[?]adserv
-/?.*/bizgrphx/
-/?.*/smallad2\.gif
-/?.*/ana2ad\.gif
-/?.*/adimg/
-/?.*/.*counter\.pl
-/?.*/spin_html/
-/?.*/images/topics/topicgimp\.gif
+/.*/adfinity
+/.*/[?]adserv
+/.*/bizgrphx/
+/.*/smallad2\.gif
+/.*/ana2ad\.gif
+/.*/adimg/
+/.*/.*counter\.pl
+/.*/spin_html/
+/.*/images/topics/topicgimp\.gif
 .discovery.com/.*banner_id
-/?.*/.*bannr\.gif
+/.*/.*bannr\.gif
 .cruel.com/images/
 .idrink.com/frm_bottom.htm
-/?.*/.*pb_ihtml\.gif
-/?.*/ph-ad.*\.focalink\.com
+/.*/.*pb_ihtml\.gif
+/.*/ph-ad.*\.focalink\.com
 /cgi-bin/adjuggler
 
 /we_ba/ # hausfrauenseite.de *bwhahahaaaaa*
@@ -699,38 +562,38 @@ www.mtv3.fi/mainoskuvat
 /.*s_msn\.gif
 /.*addchannel\.gif
 /.*adddesktop\.gif
-/?.*/ns4\.gif
-/?.*/v3sban\.gif
-/?.*/?FPCreated\.gif
-/?.*/opera35\.gif
-/?.*/opera13\.gif
-/?.*/opera_b\.gif
-/?.*/ie_horiz\.gif
-/?.*/ie_logo\.gif
+/.*/ns4\.gif
+/.*/v3sban\.gif
+/.*/?FPCreated\.gif
+/.*/opera35\.gif
+/.*/opera13\.gif
+/.*/opera_b\.gif
+/.*/ie_horiz\.gif
+/.*/ie_logo\.gif
 
 # ... and even more!
-/?.*/favicon\.ico
+/.*/favicon\.ico
 
 # generally useless information and promo stuff (commented out)
 #/.*/(counter|getpcbutton|BuiltByNOF|netscape|hotmail|vcr(rated)?|rsaci(rated)?|freeloader|cache_now(_anim)?|apache_pb|now_(anim_)?button|ie_?(buttonlogo|static?|.*ani.*)?)\.(gif|jpe?g)
 
-/?.*/images/na/us/brand/
-/?.*/advantage\.(gif|jpg)
-/?.*/advanbar\.(gif|jpg)
-/?.*/advanbtn\.(gif|jpg)
-/?.*/biznetsmall\.(gif|jpg)
-/?.*/utopiad\.(gif|jpg)
-/?.*/epipo\.(gif|jpg)
-/?.*/amazon([a-zA-Z0-9]+)\.(gif|jpg)
-/?.*/bnlogo.(gif|jpg)
-/?.*/buynow([a-zA-Z0-9]+)\.(gif|jpg)
+/.*/images/na/us/brand/
+/.*/advantage\.(gif|jpg)
+/.*/advanbar\.(gif|jpg)
+/.*/advanbtn\.(gif|jpg)
+/.*/biznetsmall\.(gif|jpg)
+/.*/utopiad\.(gif|jpg)
+/.*/epipo\.(gif|jpg)
+/.*/amazon([a-zA-Z0-9]+)\.(gif|jpg)
+/.*/bnlogo.(gif|jpg)
+/.*/buynow([a-zA-Z0-9]+)\.(gif|jpg)
 
 /p/d/publicid
 
 
 # for the dutch folks by a dutch friend gertjan@west.nl
-/?.*/Advertenties/
-/?.*/Adverteerders/
+/.*/Advertenties/
+/.*/Adverteerders/
 .netdirect.nl/nd_servlet/___
 
 # --------------------------------------------------------------------------
@@ -1039,8 +902,8 @@ www.forbes.com/tool/images/frontend/
 www.zserver.com
 www.spinbox.com
 .pathfinder.com/shopping/marketplace/images/
-/?.*/adbanner*
-/?.*/adgraphic*
+/.*/adbanner*
+/.*/adgraphic*
 static.wired.com/images
 .perso.estat.com/cgi-bin/perso/
 #dinoadserver1.roka.net
@@ -1086,11 +949,11 @@ home.talkcity.com/homepopup.html.*
 # Banners from Freeserve
 #banner.freeservers.com/cgi-bin/fs_adbar # fixed by above regexp
 # And those nasty va-popups !
-/?.*/?va_banner.html
+/.*/?va_banner.html
 # And an all-around hit against advert*.jpg
-/?.*/advert[0-9]+\.jpg
+/.*/advert[0-9]+\.jpg
 # And yet another Internet Explorer gif ...
-/?.*/ie_horiz\.gif
+/.*/ie_horiz\.gif
 # Some uninteresting buttons I think...
 .mircx.com/images/buttons/
 services.mircx.com/.*\.gif
@@ -1309,10 +1172,6 @@ www.linux-magazin.de/banner
 # The Register ads - oh, and all images in Register stories (sigh).
 www.theregister.co.uk/media/
 
-# Used on http://www.theregister.co.uk/
-# Sample advert URL:
-# http://secure.webconnect.net/cgi-bin/webconnecthome.dll?F467
-.webconnect.net
 
 # Dilbert:
 www.dilbert.com/comics/dilbert/images/.*_140x800.*\.gif
@@ -1326,11 +1185,11 @@ www.stattrack.com/stats/
 #Now they're Yahoo GeoCities, their junk is in a different place.
 ##geo.yahoo.com/serv
 ##visit.geocities.com/visit.gif
-.yimg.com/?.*/www.geocities.com/js_source
+.yimg.com/.*/www.geocities.com/js_source
 #http://us.toto.geo.yahoo.com/toto?s=76001086
 .geo.yahoo.com
 .visit.geocities.com
-.yimg.com/?.*/www.geocities.com/
+.yimg.com/.*/www.geocities.com/
 
 #http://counter16.bravenet.com/counter.php
 counter*.
@@ -1366,7 +1225,7 @@ logout.gmx.net
 logout.tvspielfilm.de
 gmx.tvspielfilm.de
 www.freenet.de/customerindex\.html
-/?.*/phpAds
+/.*/phpAds
 .fxweb.com/v2-trackrun\.cgi
 rtldating.peopleunited.de
 .advertising.com
@@ -1378,13 +1237,12 @@ fourohfour.nbci.com/Members404Error.php3
 .adlink.de
 www.fair-ist-mehr.de/cgi-bin/bt.pl
 .linkexchange.
-/?.*/adpage.asp
+/.*/adpage.asp
 /ADS
 .net-on.net
 rstrip.namezero.com
 62.26.220.2
 .doubleclick.net
-.adserver.yahoo.com
 
 #############################################################################
 {-block}
@@ -1392,7 +1250,6 @@ rstrip.namezero.com
 include.ebay.com
 cpan.valueclick.com
 www.userfriendly.org/images/banners/banner_dp_heart\.gif
-advogato.org
 
 #Why were these in the Waldherr blockfile?
 #www.hitbox.com
@@ -1497,8 +1354,10 @@ www.iez-auktion.de
 
 
 # Jon's addition: MSDN
+
 .msdn.microsoft.com
 
+
 #js
 .adbusters.com
 .freemail*.web.de/online/ordner/anzeigen
@@ -1506,8 +1365,10 @@ foggy.sda.t-online.de
 .us.i1.yimg.com/us.yimg.com/i/pim/ad2.gif
 www.nexgo.de/.*/bg_banner.jpg
 
-# .*ads. matches prdownloads.sourceforge.net and many other download sites
-# The fix is:
-.*downloads.
+# New GIF deanimation feature. Just try http://www.oesterhelt.org/deanimate-demo
+# with and without it.
+#
+{+deanimate-gifs{last}}
+www.oesterhelt.org/deanimate-demo
 
 # End of file
diff --git a/advanced.action b/advanced.action
deleted file mode 100644 (file)
index 0285503..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-######################################################################\r
-# \r
-#  File        :  $Source: /cvsroot/ijbswa/current/advanced.action,v $\r
-# \r
-#  $Id: advanced.action,v 1.3 2002/03/26 22:29:54 swa Exp $\r
-#\r
-#  Purpose     :  Most agressive actions file, see\r
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES\r
-# \r
-#  Copyright   :  Written by and Copyright\r
-#                 Privoxy team. http://www.privoxy.org/\r
-#\r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and\r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-#\r
-# We value your feedback. However, to provide you with the best support,\r
-# please note:\r
-#  \r
-#  * Use the support forum to get help:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118\r
-#  * Submit bugs only thru our bug forum:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 \r
-#    Make sure that the bug has not already been submitted. Please try\r
-#    to verify that it is a Junkbuster bug, and not a browser or site\r
-#    bug first. If you are using your own custom configuration, please\r
-#    try the stock configs to see if the problem is a configuration\r
-#    related bug. And if not using the latest development snapshot,\r
-#    please try the latest one. Or even better, CVS sources.\r
-#  * Submit feature requests only thru our feature request forum:\r
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse\r
-#      \r
-# For any other issues, feel free to use the mailing lists:\r
-# http://sourceforge.net/mail/?group_id=11118\r
-#    \r
-# Anyone interested in actively participating in development and related\r
-# discussions can join the appropriate mailing list here:\r
-# http://sourceforge.net/mail/?group_id=11118. Archives are available\r
-# here too.\r
-# \r
-######################################################################\r
-\r
-######################################################################\r
-# Aliases\r
-######################################################################\r
-\r
-######################################################################\r
-# Defaults\r
-######################################################################\r
-\r
-######################################################################\r
-# Specials\r
-######################################################################\r
-\r
-######################################################################\r
-# Imagelist:\r
-######################################################################\r
-\r
-######################################################################\r
-# Blocklist:\r
-######################################################################\r
-\r
-######################################################################\r
-# \r
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge\r
-#                 Privoxy team. http://www.privoxy.org/\r
-# \r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and \r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-# \r
-#                 This program is free software; you can redistribute it \r
-#                 and/or modify it under the terms of the GNU General\r
-#                 Public License as published by the Free Software\r
-#                 Foundation; either version 2 of the License, or (at\r
-#                 your option) any later version.\r
-# \r
-#                 This program is distributed in the hope that it will\r
-#                 be useful, but WITHOUT ANY WARRANTY; without even the\r
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A\r
-#                 PARTICULAR PURPOSE.  See the GNU General Public\r
-#                 License for more details.\r
-# \r
-#                 The GNU General Public License should be included with\r
-#                 this file.  If not, you can view it at\r
-#                 http://www.gnu.org/copyleft/gpl.html\r
-#                 or write to the Free Software Foundation, Inc., 59\r
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
-# \r
-######################################################################\r
diff --git a/amiga.c b/amiga.c
index 493a00e..789fd08 100644 (file)
--- a/amiga.c
+++ b/amiga.c
@@ -1,4 +1,4 @@
-const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
+const char amiga_rcs[] = "$Id: amiga.c,v 1.1.1.1 2001/05/15 13:58:46 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/amiga.c,v $
@@ -6,7 +6,7 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
  * Purpose     :  Amiga-specific declarations.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
@@ -28,48 +28,6 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
  *
  * Revisions   :
  *    $Log: amiga.c,v $
- *    Revision 1.8  2002/03/25 19:32:15  joergs
- *    Name in version string changed from junkbuster to Privoxy.
- *
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.5  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.4  2001/10/07 15:35:13  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Revision 1.3  2001/09/12 22:54:51  joergs
- *    Stacksize of main thread increased.
- *
- *    Revision 1.2  2001/05/23 00:13:58  joergs
- *    AmigaOS support fixed.
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:46  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -88,8 +46,8 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
 
 const char amiga_h_rcs[] = AMIGA_H_VERSION;
 
-unsigned long __stack = 100*1024;
-static char ver[] = "$VER: Privoxy " __AMIGAVERSION__ " (" __AMIGADATE__ ")";
+unsigned long __stack = 20*1024;
+static char ver[] = "$VER: junkbuster " __AMIGAVERSION__ " (" __AMIGADATE__ ")";
 struct Task *main_task = NULL;
 int childs = 0;
 
@@ -109,32 +67,29 @@ __saveds ULONG server_thread(void)
    {
       SetErrnoPtr(&(UserData.eno),sizeof(int));
       local_csp->cfd=ObtainSocket(local_csp->cfd, AF_INET, SOCK_STREAM, 0);
-      if(JB_INVALID_SOCKET!=local_csp->cfd)
+      if(-1!=local_csp->cfd)
       {
          Signal(main_task,SIGF_SINGLE);
          serve((struct client_state *) local_csp);
       } else {
-         local_csp->flags &= ~CSP_FLAG_ACTIVE;
+         local_csp->active = 0;
          Signal(main_task,SIGF_SINGLE);
       }
       CloseLibrary(SocketBase);
    } else {
-      local_csp->flags &= ~CSP_FLAG_ACTIVE;
+      local_csp->active = 0;
       Signal(main_task,SIGF_SINGLE);
    }
    childs--;
    return 0;
 }
 
-static BPTR olddir;
-
 void amiga_exit(void)
 {
    if(SocketBase)
    {
       CloseLibrary(SocketBase);
    }
-   CurrentDir(olddir);
 }
 
 static struct SignalSemaphore memsem;
@@ -162,13 +117,12 @@ void InitAmiga(void)
    InitSemaphore(&memsem);
    memsemptr = &memsem;
 
-   olddir=CurrentDir(GetProgramDir());
    atexit(amiga_exit);
 }
 
 #ifdef __GNUC__
 #ifdef libnix
-/* multithreadingsafe libnix replacements */
+/* multitaskingsafe libnix replacements */
 static void *memPool=NULL;
 
 void *malloc (size_t s)
@@ -277,7 +231,7 @@ ADD2EXIT(__memCleanUp,-50);
 #error No libnix and no ixemul!?
 #endif /* libnix */
 #else
-#error Only GCC is supported, multithreading safe malloc/free required.
+#error Only GCC is supported, multitasking safe malloc/free required.
 #endif /* __GNUC__ */
 
 #endif /* def AMIGA */
diff --git a/amiga.h b/amiga.h
index 580dc32..5393304 100644 (file)
--- a/amiga.h
+++ b/amiga.h
@@ -1,7 +1,7 @@
 #ifdef AMIGA
-#ifndef AMIGA_H_INCLUDED
-#define AMIGA_H_INCLUDED
-#define AMIGA_H_VERSION "$Id: amiga.h,v 1.8 2002/03/24 13:25:43 swa Exp $"
+#ifndef _AMIGA_H
+#define _AMIGA_H
+#define AMIGA_H_VERSION "$Id: amiga.h,v 1.3 2001/05/25 21:53:27 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/amiga.h,v $
@@ -9,7 +9,7 @@
  * Purpose     :  Amiga-specific declarations.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *
  * Revisions   :
  *    $Log: amiga.h,v $
- *    Revision 1.8  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.7  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.6  2001/10/13 12:46:08  joergs
- *    Added #undef EINTR to avoid warnings
- *
- *    Revision 1.5  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.4  2001/05/29 20:05:06  joergs
- *    Fixed exit() macro not exiting if called before InitAmiga()
- *    (junkbuster --help and --version).
- *
  *    Revision 1.3  2001/05/25 21:53:27  jongfoster
  *    Fixing indentation
  *
@@ -70,7 +53,6 @@
 #undef __NOLIBBASE__
 
 #define __CONSTLIBBASEDECL__ const
-#define DEVICES_TIMER_H
 #include <proto/exec.h>
 #include <exec/tasks.h>
 #include <proto/dos.h>
@@ -116,8 +98,7 @@ __saveds ULONG server_thread(void);
    }                                                        \
 }
 
-#undef EINTR
 #define EINTR 0
 
-#endif /* ndef AMIGA_H_INCLUDED */
+#endif /* ndef _AMIGA_H */
 #endif /* def AMIGA */
diff --git a/basic.action b/basic.action
deleted file mode 100644 (file)
index 567f6b9..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-######################################################################\r
-# \r
-#  File        :  $Source: /cvsroot/ijbswa/current/basic.action,v $\r
-# \r
-#  $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $\r
-#\r
-#  Purpose     :  Very basic actions file, see\r
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES\r
-# \r
-#  Copyright   :  Written by and Copyright\r
-#                 Privoxy team. http://www.privoxy.org/\r
-#\r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and\r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-#\r
-# We value your feedback. However, to provide you with the best support,\r
-# please note:\r
-#  \r
-#  * Use the support forum to get help:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118\r
-#  * Submit bugs only thru our bug forum:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 \r
-#    Make sure that the bug has not already been submitted. Please try\r
-#    to verify that it is a Junkbuster bug, and not a browser or site\r
-#    bug first. If you are using your own custom configuration, please\r
-#    try the stock configs to see if the problem is a configuration\r
-#    related bug. And if not using the latest development snapshot,\r
-#    please try the latest one. Or even better, CVS sources.\r
-#  * Submit feature requests only thru our feature request forum:\r
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse\r
-#      \r
-# For any other issues, feel free to use the mailing lists:\r
-# http://sourceforge.net/mail/?group_id=11118\r
-#    \r
-# Anyone interested in actively participating in development and related\r
-# discussions can join the appropriate mailing list here:\r
-# http://sourceforge.net/mail/?group_id=11118. Archives are available\r
-# here too.\r
-# \r
-######################################################################\r
-\r
-######################################################################\r
-# Aliases\r
-######################################################################\r
-{{alias}}\r
-+imageblock = +block +image\r
-\r
-######################################################################\r
-# Defaults\r
-######################################################################\r
-{\\r
-+deanimate-gifs{last} \\r
-+image-blocker{trans} \\r
-+hide-referer{forge} \\r
-+no-cookies-keep \\r
--filter \\r
-}\r
-/ # Match all URLs\r
-\r
-\r
-######################################################################\r
-# Specials\r
-######################################################################\r
-{+image}\r
-#############################################################################\r
-/.*\.gif\r
-/.*\.jpe?g\r
-/.*\.png\r
-\r
-#############################################################################\r
-{+imageblock}\r
-#############################################################################\r
-.ad.doubleclick.net\r
-.adforce.imgis.com\r
-.focalink.com\r
-\r
-######################################################################\r
-# Blocklist:\r
-######################################################################\r
-{+block}\r
-#############################################################################\r
-\r
-# generic hosts (probably most effective)\r
-ad*.\r
-.*ads.\r
-banner.\r
-\r
-/.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g))\r
-/.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/])\r
-/.*/(ng)?adclient\.cgi\r
-/.*/(plain|live|rotate)[-_.]?ads?/\r
-/.*/(sponsor)s?[0-9]?/\r
-/?.*/_?(plain|live)?ads?(-banners)?/\r
-/?.*/abanners/\r
-/?.*/ad(sdna_image|gifs?)/\r
-/?.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)\r
-/?.*/adbanners/\r
-/?.*/adserver\r
-/?.*/adstream\.cgi\r
-/?.*/adv((er)?ts?|ertis(ing|ements?))?/\r
-/?.*/anzei(gen)?/?\r
-/?.*/ban[-_]cgi/\r
-/?.*/banner_?ads/\r
-/?.*/banner_?anzeigen\r
-/?.*/bannerimage/\r
-/?.*/banners?/\r
-/?.*/banners?\.cgi/\r
-/?.*/cgi-bin/centralad/getimage\r
-/?.*/images/addver\.gif\r
-/?.*/images/advert\.gif\r
-/?.*/images/marketing/.*\.(gif|jpe?g)\r
-/?.*/place-ads\r
-/?.*/popupads/\r
-/?.*/promobar.*\r
-/?.*/publicite/\r
-/?.*/randomads/.*\.(gif|jpe?g)\r
-/?.*/rekla(ma|me|am)/.*\.(gif|jpe?g)\r
-/?.*/siteads/\r
-/?.*/sponsor.*\.gif\r
-/?.*/sponsors?[0-9]?/\r
-/?.*/ucbandeimg/\r
-/?.*/werb\..*\r
-/?.*/werbebanner/\r
-/?.*/werbung/.*\.(gif|jpe?g)\r
-/?.*/adv\.   # www.telegraaf.nl\r
-/?.*/advert[0-9]+\.jpg\r
-/?.*bann\.gif\r
-/?.*/ads/\r
-/_banner/\r
-/ad_images/\r
-/adgenius/\r
-/adimages/\r
-/viewad/\r
-/adserve/\r
-/adverts/\r
-/annonser?/\r
-/bando/\r
-/bannerad/\r
-/bannerfarm/\r
-/bin/getimage.cgi/...\?AD\r
-/bin/nph-oma.count/ct/default.shtml\r
-/bin/nph-oma.count/ix/default.html\r
-/cgi-bin/getimage.cgi/....\?GROUP=\r
-/cgi-bin/nph-load\r
-/cgi-bin/webad.dll/ad\r
-/cwmail/acc\.gif\r
-/cwmail/amzn-bm1\.gif\r
-/db_area/banrgifs/\r
-/gif/teasere/\r
-/grafikk/annonse/\r
-/graphics/defaultAd/\r
-/grf/annonif\r
-/htmlad/\r
-/image\.ng/AdType\r
-/image\.ng/transactionID\r
-/images/.*/.*_anim\.gif # alvin brattli\r
-/ip_img/.*\.(gif|jpe?g)\r
-/marketpl*/\r
-/minibanners/\r
-/netscapeworld/nw-ad/\r
-/promotions/houseads/\r
-/rotads/ \r
-/rotateads/\r
-/rotations/ \r
-/torget/jobline/.*\.gif\r
-/viewad/\r
-/werbung/\r
-/worldnet/ad\.cgi\r
-/zhp/auktion/img/\r
-/cgi-bin/nph-adclick.exe/\r
-/?.*/Image/BannerAdvertising/\r
-/?.*/ad-bin/\r
-/?.*/adlib/server\.cgi\r
-/?.*/gsa_bs/gsa_bs.cmdl\r
-/autoads/\r
-/anz/pics/\r
-# for our finnish friends, by Kai Puolamaki <Kai.Puolamaki@iki.fi>\r
-/?.*/mainos/*.*/.*\.gif\r
-/?.*/mainos/*.*/.*\.jpe?g\r
-# more from a finnish friend Petri Haapio <pha@iki.fi>\r
-/?.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png))\r
-/?.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png))\r
-# <jwz@jwz.org>\r
-/?.*/adfinity\r
-/?.*/[?]adserv\r
-/?.*/bizgrphx/\r
-/?.*/smallad2\.gif\r
-/?.*/ana2ad\.gif\r
-/?.*/adimg/\r
-/?.*/.*counter\.pl\r
-/?.*/spin_html/\r
-/?.*/images/topics/topicgimp\.gif\r
-.discovery.com/.*banner_id\r
-/?.*/.*bannr\.gif\r
-.cruel.com/images/\r
-.idrink.com/frm_bottom.htm\r
-/?.*/.*pb_ihtml\.gif\r
-/?.*/ph-ad.*\.focalink\.com\r
-/cgi-bin/adjuggler\r
-\r
-# ms sucks !\r
-/.*(ms)?backoff(ice)?.*\.(gif|jpe?g)\r
-/.*(/ie4|/ie3|msie|sqlbans|powrbybo|activex|backoffice|explorer|netnow|getpoint|ntbutton|hmlink).*\.(gif|jpe?g)\r
-/.*activex.*(gif|jpe?g)\r
-/.*explorer?.(gif|jpe?g)\r
-/.*freeie\.(gif|jpe?g)\r
-/.*/ie_?(buttonlogo|static?|anim.*)?\.(gif|jpe?g)\r
-/.*ie_sm\.(gif|jpe?g)\r
-/.*msie(30)?\.(gif|jpe?g)\r
-/.*msnlogo\.(gif|jpe?g)\r
-/.*office97_ad1\.(gif|jpe?g)\r
-/.*pbbobansm\.(gif|jpe?g)\r
-/.*powrbybo\.(gif|jpe?g)\r
-/.*sqlbans\.(gif|jpe?g)\r
-/.*exc_ms\.gif\r
-/.*ie4get_animated\.gif\r
-/.*ie4_animated\.gif\r
-/.*n_iemap\.gif\r
-/.*ieget\.gif\r
-/.*logo_msnhm_*\r
-/.*mcsp2\.gif\r
-/.*msn2\.gif\r
-/.*add_active\.gif\r
-/.*n_msnmap\.gif\r
-/.*Ad00\.gif\r
-/.*s_msn\.gif\r
-/.*addchannel\.gif\r
-/.*adddesktop\.gif\r
-/?.*/ns4\.gif\r
-/?.*/v3sban\.gif\r
-/?.*/?FPCreated\.gif\r
-/?.*/opera35\.gif\r
-/?.*/opera13\.gif\r
-/?.*/opera_b\.gif\r
-/?.*/ie_horiz\.gif\r
-/?.*/ie_logo\.gif\r
-# ... and even more!\r
-/?.*/favicon\.ico\r
-\r
-/?.*/images/na/us/brand/\r
-/?.*/advantage\.(gif|jpg)\r
-/?.*/advanbar\.(gif|jpg)\r
-/?.*/advanbtn\.(gif|jpg)\r
-/?.*/biznetsmall\.(gif|jpg)\r
-/?.*/utopiad\.(gif|jpg)\r
-/?.*/epipo\.(gif|jpg)\r
-/?.*/amazon([a-zA-Z0-9]+)\.(gif|jpg)\r
-/?.*/bnlogo.(gif|jpg)\r
-/?.*/buynow([a-zA-Z0-9]+)\.(gif|jpg)\r
-\r
-# for the dutch folks by a dutch friend gertjan@west.nl\r
-/?.*/Advertenties/\r
-/?.*/Adverteerders/\r
-.netdirect.nl/nd_servlet/___\r
-\r
-.admaximize.com\r
-.imgis.com\r
-\r
-# wayne@staff.msen.com\r
-a*.*.*.yimg.com/([0-9]*|\/)*us.yimg.com/*\r
-\r
-####################################################\r
-# Jon's addition:\r
-#\r
-# The Register ads - oh, and all images in Register stories (sigh).\r
-www.theregister.co.uk/media/\r
-\r
-# Used on http://www.theregister.co.uk/\r
-# Sample advert URL:\r
-# http://secure.webconnect.net/cgi-bin/webconnecthome.dll?F467\r
-.webconnect.net\r
-\r
-# Dilbert:\r
-www.dilbert.com/comics/dilbert/images/.*_140x800.*\.gif\r
-\r
-# stattrack.com\r
-# Uses URL: http://www.stattrack.com/cgi-bin/stats/image.cgi\r
-/cgi-bin/stats/\r
-# And loads JavaScript from http://www.stattrack.com/stats/code\r
-www.stattrack.com/stats/\r
-\r
-#Now they're Yahoo GeoCities, their junk is in a different place.\r
-##geo.yahoo.com/serv\r
-##visit.geocities.com/visit.gif\r
-.yimg.com/?.*/www.geocities.com/js_source\r
-#http://us.toto.geo.yahoo.com/toto?s=76001086\r
-.geo.yahoo.com\r
-.visit.geocities.com\r
-.yimg.com/?.*/www.geocities.com/\r
-\r
-.exitexchange.com\r
-\r
-#SourceForge ads.\r
-sfads.osdn.com\r
-\r
-#This site traps the browser\r
-.webhideout.com\r
-\r
-#privacy.net runs ads\r
-.a.consumer.net\r
-\r
-#Lindsay.Marshall@newcastle.ac.uk suggested these, to kill Opera adverts:\r
-www.qksrv.net\r
-mirror.qkimg.net\r
-\r
-#js\r
-dinoadserver*.roka.net\r
-logout.gmx.net\r
-logout.tvspielfilm.de\r
-gmx.tvspielfilm.de\r
-www.freenet.de/customerindex\.html\r
-/?.*/phpAds\r
-.fxweb.com/v2-trackrun\.cgi\r
-rtldating.peopleunited.de\r
-.advertising.com\r
-www.zdnet.com/fcgi-bin/\r
-service.bfast.com/bfast/serve\r
-199.172.144.25\r
-fourohfour.nbci.com/Members404Error.php3\r
-.adtech.de\r
-.adlink.de\r
-www.fair-ist-mehr.de/cgi-bin/bt.pl\r
-.linkexchange.\r
-/?.*/adpage.asp\r
-/ADS\r
-.net-on.net\r
-rstrip.namezero.com\r
-62.26.220.2\r
-.doubleclick.net\r
-.adserver.yahoo.com\r
-\r
-#############################################################################\r
-{-block}\r
-#############################################################################\r
-.admin.\r
-.edu\r
-.ac.uk    # English Universities too! - Jon\r
-.uni-*.de # What about Germany? --oes\r
-# my banking stuff => no ads.\r
-.comdirekt.de\r
-.comdirect.de\r
-.teledata.de\r
-# Jon's addition: MSDN\r
-.msdn.microsoft.com\r
-# .*ads. matches prdownloads.sourceforge.net and many other download sites\r
-# The fix is:\r
-.*downloads.\r
-\r
-######################################################################\r
-# \r
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge\r
-#                 Privoxy team. http://www.privoxy.org/\r
-# \r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and \r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-# \r
-#                 This program is free software; you can redistribute it \r
-#                 and/or modify it under the terms of the GNU General\r
-#                 Public License as published by the Free Software\r
-#                 Foundation; either version 2 of the License, or (at\r
-#                 your option) any later version.\r
-# \r
-#                 This program is distributed in the hope that it will\r
-#                 be useful, but WITHOUT ANY WARRANTY; without even the\r
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A\r
-#                 PARTICULAR PURPOSE.  See the GNU General Public\r
-#                 License for more details.\r
-# \r
-#                 The GNU General Public License should be included with\r
-#                 this file.  If not, you can view it at\r
-#                 http://www.gnu.org/copyleft/gpl.html\r
-#                 or write to the Free Software Foundation, Inc., 59\r
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
-# \r
-######################################################################\r
diff --git a/cgi.c b/cgi.c
index a569441..60806b1 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -1,18 +1,16 @@
-const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
+const char cgi_rcs[] = "$Id: cgi.c,v 1.10 2001/07/13 13:53:13 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgi.c,v $
  *
  * Purpose     :  Declares functions to intercept request, generate
  *                html or gif answers, and to compose HTTP resonses.
- *                This only contains the framework functions, the
- *                actual handler functions are declared elsewhere.
  *                
  *                Functions declared include:
  * 
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -38,212 +36,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
  *
  * Revisions   :
  *    $Log: cgi.c,v $
- *    Revision 1.56  2002/03/24 17:50:46  jongfoster
- *    Fixing compile error if actions file editor disabled
- *
- *    Revision 1.55  2002/03/24 16:55:06  oes
- *    Making GIF checkerboard transparent
- *
- *    Revision 1.54  2002/03/24 16:18:15  jongfoster
- *    Removing old logo
- *
- *    Revision 1.53  2002/03/24 16:06:00  oes
- *    Correct transparency for checkerboard PNG. Thanks, Magnus!
- *
- *    Revision 1.52  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.51  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.50  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.49  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.48  2002/03/08 17:47:07  jongfoster
- *    Adding comments
- *
- *    Revision 1.47  2002/03/08 16:41:33  oes
- *    Added GIF images again
- *
- *    Revision 1.46  2002/03/07 03:48:38  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.45  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.44  2002/03/05 22:43:45  david__schmidt
- *    - Better error reporting on OS/2
- *    - Fix double-slash comment (oops)
- *
- *    Revision 1.43  2002/03/05 21:33:45  david__schmidt
- *    - Re-enable OS/2 building after new parms were added
- *    - Fix false out of memory report when resolving CGI templates when no IP
- *      address is available of failed attempt (a la no such domain)
- *
- *    Revision 1.42  2002/01/21 00:33:20  jongfoster
- *    Replacing strsav() with the safer string_append() or string_join().
- *    Adding map_block_keep() to save a few bytes in the edit-actions-list HTML.
- *    Adding missing html_encode() to error message generators.
- *    Adding edit-actions-section-swap and many "shortcuts" to the list of CGIs.
- *
- *    Revision 1.41  2002/01/17 20:56:22  jongfoster
- *    Replacing hard references to the URL of the config interface
- *    with #defines from project.h
- *
- *    Revision 1.40  2002/01/09 14:26:46  oes
- *    Added support for thread-safe gmtime_r call.
- *
- *    Revision 1.39  2001/11/16 00:48:13  jongfoster
- *    Fixing a compiler warning
- *
- *    Revision 1.38  2001/11/13 00:31:21  jongfoster
- *    - Adding new CGIs for use by non-JavaScript browsers:
- *        edit-actions-url-form
- *        edit-actions-add-url-form
- *        edit-actions-remove-url-form
- *    - Fixing make_menu()'s HTML generation - it now quotes the href parameter.
- *    - Fixing || bug.
- *
- *    Revision 1.37  2001/11/01 14:28:47  david__schmidt
- *    Show enablement/disablement status in almost all templates.
- *    There is a little trickiness here: apparent recursive resolution of
- *    @if-enabled-then@ caused the toggle template to show status out-of-phase with
- *    the actual enablement status.  So a similar construct,
- *    @if-enabled-display-then@, is used to resolve the status display on non-'toggle'
- *    templates.
- *
- *    Revision 1.36  2001/10/26 17:33:27  oes
- *    marginal bugfix
- *
- *    Revision 1.35  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.34  2001/10/18 22:22:09  david__schmidt
- *    Only show "Local support" on templates conditionally:
- *      - if either 'admin-address' or 'proxy-info-url' are uncommented in config
- *      - if not, no Local support section appears
- *
- *    Revision 1.33  2001/10/14 22:28:41  jongfoster
- *    Fixing stupid typo.
- *
- *    Revision 1.32  2001/10/14 22:20:18  jongfoster
- *    - Changes to CGI dispatching method to match CGI names exactly,
- *      rather than doing a prefix match.
- *    - No longer need to count the length of the CGI handler names by hand.
- *    - Adding new handler for 404 error when disptching a CGI, if none of
- *      the handlers match.
- *    - Adding new handlers for CGI actionsfile editor.
- *
- *    Revision 1.31  2001/10/10 10:56:39  oes
- *    Failiure to load template now fatal. Before, the user got a hard-to-understand assertion failure from cgi.c
- *
- *    Revision 1.30  2001/10/02 15:30:57  oes
- *    Introduced show-request cgi
- *
- *    Revision 1.29  2001/09/20 15:47:44  steudten
- *
- *    Fix BUG: Modify int size to size_t size in fill_template()
- *     - removes big trouble on machines where sizeof(int) != sizeof(size_t).
- *
- *    Revision 1.28  2001/09/19 18:00:37  oes
- *     - Deletef time() FIXME (Can't fail under Linux either, if
- *       the argument is guaranteed to be in out address space,
- *       which it is.)
- *     - Fixed comments
- *     - Pointer notation cosmetics
- *     - Fixed a minor bug in template_fill(): Failiure of
- *       pcrs_execute() now secure.
- *
- *    Revision 1.27  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *    Revision 1.26  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.25  2001/09/16 15:02:35  jongfoster
- *    Adding i.j.b/robots.txt.
- *    Inlining add_stats() since it's only ever called from one place.
- *
- *    Revision 1.24  2001/09/16 11:38:01  jongfoster
- *    Splitting fill_template() into 2 functions:
- *    template_load() loads the file
- *    template_fill() performs the PCRS regexps.
- *    This is because the CGI edit interface has a "table row"
- *    template which is used many times in the page - this
- *    change means it's only loaded from disk once.
- *
- *    Revision 1.23  2001/09/16 11:16:05  jongfoster
- *    Better error handling in dispatch_cgi() and parse_cgi_parameters()
- *
- *    Revision 1.22  2001/09/16 11:00:10  jongfoster
- *    New function alloc_http_response, for symmetry with free_http_response
- *
- *    Revision 1.21  2001/09/13 23:53:03  jongfoster
- *    Support for both static and dynamically generated CGI pages.
- *    Correctly setting Last-Modified: and Expires: HTTP headers.
- *
- *    Revision 1.20  2001/09/13 23:40:36  jongfoster
- *    (Cosmetic only) Indentation correction
- *
- *    Revision 1.19  2001/09/13 23:31:25  jongfoster
- *    Moving image data to cgi.c rather than cgi.h.
- *
- *    Revision 1.18  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.17  2001/08/05 15:57:38  oes
- *    Adapted finish_http_response to new list_to_text
- *
- *    Revision 1.16  2001/08/01 21:33:18  jongfoster
- *    Changes to fill_template() that reduce memory usage without having
- *    an impact on performance.  I also renamed some variables so as not
- *    to clash with the C++ keywords "new" and "template".
- *
- *    Revision 1.15  2001/08/01 21:19:22  jongfoster
- *    Moving file version information to a separate CGI page.
- *
- *    Revision 1.14  2001/08/01 00:19:03  jongfoster
- *    New function: map_conditional() for an if-then-else syntax.
- *    Changing to use new version of show_defines()
- *
- *    Revision 1.13  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.12  2001/07/29 18:47:05  jongfoster
- *    Adding missing #include "loadcfg.h"
- *
- *    Revision 1.11  2001/07/18 17:24:37  oes
- *    Changed to conform to new pcrs interface
- *
  *    Revision 1.10  2001/07/13 13:53:13  oes
  *    Removed all #ifdef PCRS and related code
  *
@@ -332,7 +124,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
 #include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
-#include <assert.h>
 
 #ifdef _WIN32
 #define snprintf _snprintf
@@ -343,196 +134,42 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
 #include "list.h"
 #include "encode.h"
 #include "ssplit.h"
+#include "jcc.h"
+#include "filters.h"
+#include "actions.h"
 #include "errlog.h"
 #include "miscutil.h"
-#include "cgisimple.h"
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-#include "cgiedit.h"
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-#include "loadcfg.h"
-/* loadcfg.h is for g_bToggleIJB only */
+#include "showargs.h"
 
 const char cgi_h_rcs[] = CGI_H_VERSION;
 
-static const struct cgi_dispatcher cgi_dispatchers[] = {
-   { "",
-         cgi_default,
-         "Privoxy main page" },
-#ifdef FEATURE_GRACEFUL_TERMINATION
-   { "die", 
-         cgi_die,  
-         "<b>Shut down</b> - <font color=red size='+1'>Do not deploy this build in a production environment, this is a one click Denial Of Service attack!!!</font>" }, 
-#endif
+const struct cgi_dispatcher cgi_dispatcher[] = {
    { "show-status", 
-         cgi_show_status,  
-         "Show information about the current configuration" }, 
-   { "show-version", 
-         cgi_show_version,  
-         "Show the source code version numbers" }, 
-   { "show-request", 
-         cgi_show_request,  
-         "Show the client's request headers." }, 
+         11, cgi_show_status,  
+         "Show information about the version and configuration" }, 
    { "show-url-info",
-         cgi_show_url_info, 
+         13, cgi_show_url_info, 
          "Show which actions apply to a URL and why"  },
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-   { "toggle",
-         cgi_toggle, 
-         "Toggle Privoxy on or off" },
-   { "edit-actions",
-         cgi_edit_actions, 
-         "Edit the actions list" },
-
-   
-   { "eaa", /* Shortcut for edit-actions-add-url-form */
-         cgi_edit_actions_add_url_form, 
-         NULL },
-   { "eau", /* Shortcut for edit-actions-url-form */
-         cgi_edit_actions_url_form, 
-         NULL },
-   { "ear", /* Shortcut for edit-actions-remove-url-form */
-         cgi_edit_actions_remove_url_form, 
-         NULL },
-   { "eas", /* Shortcut for edit-actions-for-url */
-         cgi_edit_actions_for_url, 
-         NULL },
-   { "easa", /* Shortcut for edit-actions-section-add */
-         cgi_edit_actions_section_add, 
-         NULL },
-   { "easr", /* Shortcut for edit-actions-section-remove */
-         cgi_edit_actions_section_remove, 
-         NULL },
-   { "eass", /* Shortcut for edit-actions-section-swap */
-         cgi_edit_actions_section_swap, 
-         NULL },
-   { "edit-actions-for-url",
-         cgi_edit_actions_for_url, 
-         NULL /* Edit the actions for (a) specified URL(s) */ },
-   { "edit-actions-list",
-         cgi_edit_actions_list, 
-         NULL /* Edit the actions list */ },
-   { "edit-actions-submit",
-         cgi_edit_actions_submit, 
-         NULL /* Change the actions for (a) specified URL(s) */ },
-   { "edit-actions-url",
-         cgi_edit_actions_url, 
-         NULL /* Change a URL pattern in the actionsfile */ },
-   { "edit-actions-url-form",
-         cgi_edit_actions_url_form, 
-         NULL /* Form to change a URL pattern in the actionsfile */ },
-   { "edit-actions-add-url",
-         cgi_edit_actions_add_url, 
-         NULL /* Add a URL pattern to the actionsfile */ },
-   { "edit-actions-add-url-form",
-         cgi_edit_actions_add_url_form, 
-         NULL /* Form to add a URL pattern to the actionsfile */ },
-   { "edit-actions-remove-url",
-         cgi_edit_actions_remove_url, 
-         NULL /* Remove a URL pattern from the actionsfile */ },
-   { "edit-actions-remove-url-form",
-         cgi_edit_actions_remove_url_form, 
-         NULL /* Form to remove a URL pattern from the actionsfile */ },
-   { "edit-actions-section-add",
-         cgi_edit_actions_section_add, 
-         NULL /* Remove a section from the actionsfile */ },
-   { "edit-actions-section-remove",
-         cgi_edit_actions_section_remove, 
-         NULL /* Remove a section from the actionsfile */ },
-   { "edit-actions-section-swap",
-         cgi_edit_actions_section_swap, 
-         NULL /* Swap two sections in the actionsfile */ },
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-   { "robots.txt", 
-         cgi_robots_txt,  
-         NULL /* Sends a robots.txt file to tell robots to go away. */ }, 
    { "send-banner",
-         cgi_send_banner, 
-         NULL /* Send a built-in image */ },
-   { "t",
-         cgi_transparent_image, 
-         NULL /* Send a transparent image (short name) */ },
-   { NULL, /* NULL Indicates end of list and default page */
-         cgi_error_404,
-         NULL /* Unknown CGI page */ }
+         11, cgi_send_banner, 
+         "HIDE Send the transparent or \"Junkbuster\" gif" },
+   { "",
+         0, cgi_default,
+         "Junkbuster main page" },
+   { NULL, 0, NULL, NULL }
 };
 
 
-/*
- * Bulit-in images for ad replacement
- *
- * Hint: You can encode your own images like this:
- * cat your-image | perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o", unpack("C", $c)); }'
- */
-
-#ifdef FEATURE_NO_GIFS
-
-/*
- * Checkerboard pattern, as a PNG.
- */
-const char image_pattern_data[] =
-   "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104"
-   "\122\000\000\000\004\000\000\000\004\010\002\000\000\000\046"
-   "\223\011\051\000\000\000\006\142\113\107\104\000\310\000\310"
-   "\000\310\052\045\225\037\000\000\000\032\111\104\101\124\170"
-   "\332\143\070\161\342\304\377\377\377\041\044\003\234\165\342"
-   "\304\011\006\234\062\000\125\200\052\251\125\174\360\223\000"
-   "\000\000\000\111\105\116\104\256\102\140\202";
-
-/*
- * 1x1 transparant PNG.
- */
-const char image_blank_data[] =
- "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104\122"
- "\000\000\000\004\000\000\000\004\010\006\000\000\000\251\361\236"
- "\176\000\000\000\007\164\111\115\105\007\322\003\013\020\073\070"
- "\013\025\036\203\000\000\000\011\160\110\131\163\000\000\013\022"
- "\000\000\013\022\001\322\335\176\374\000\000\000\004\147\101\115"
- "\101\000\000\261\217\013\374\141\005\000\000\000\033\111\104\101"
- "\124\170\332\143\070\161\342\304\207\377\377\377\347\302\150\006"
- "\144\016\210\146\040\250\002\000\042\305\065\221\270\027\131\110"
- "\000\000\000\000\111\105\116\104\256\102\140\202";
-#else
-
-/*
- * Checkerboard pattern, as a GIF.
- */
-const char image_pattern_data[] =
-   "\107\111\106\070\071\141\004\000\004\000\200\000\000\310\310"
-   "\310\377\377\377\041\376\016\111\040\167\141\163\040\141\040"
-   "\142\141\156\156\145\162\000\041\371\004\001\012\000\001\000"
-   "\054\000\000\000\000\004\000\004\000\000\002\005\104\174\147"
-   "\270\005\000\073";
-
-/*
- * 1x1 transparant GIF.
- */
-const char image_blank_data[] =
-   "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000"
-   "\000!\371\004\001\000\000\000\000,\000\000\000\000\001"
-   "\000\001\000\000\002\002D\001\000;";
-#endif
-
-const size_t image_pattern_length = sizeof(image_pattern_data) - 1;
-const size_t image_blank_length   = sizeof(image_blank_data) - 1;
-
-
-static struct http_response cgi_error_memory_response[1];
-
-static struct http_response *dispatch_known_cgi(struct client_state * csp,
-                                                const char * path);
-static struct map *parse_cgi_parameters(char *argstring);
-
-
 /*********************************************************************
  * 
  * Function    :  dispatch_cgi
  *
- * Description :  Checks if a request URL has either the magical
- *                hostname CGI_SITE_1_HOST (usully http://i.j.b/) or
- *                matches CGI_SITE_2_HOST CGI_SITE_2_PATH (usually
- *                http://ijbswa.sourceforge.net/config). If so, it passes
- *                the (rest of the) path onto dispatch_known_cgi, which
- *                calls the relevant CGI handler function.
+ * Description :  Checks if a request URL has either the magical hostname
+ *                i.j.b or matches HOME_PAGE_URL/config/. If so, it parses
+ *                the (rest of the) path as a cgi name plus query string,
+ *                prepares a map that maps CGI parameter names to their values,
+ *                initializes the http_response struct, and calls the 
+ *                relevant CGI handler function.
  *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
@@ -542,47 +179,31 @@ static struct map *parse_cgi_parameters(char *argstring);
  *********************************************************************/
 struct http_response *dispatch_cgi(struct client_state *csp)
 {
-   const char *host = csp->http->host;
-   const char *path = csp->http->path;
+   char *argstring = NULL;
+   const struct cgi_dispatcher *d;
+   struct map *param_list;
+   struct http_response *rsp;
 
    /*
     * Should we intercept ?
     */
 
-   /* Note: "example.com" and "example.com." are equivalent hostnames. */
-
-   /* Either the host matches CGI_SITE_1_HOST ..*/
-   if (   ( (0 == strcmpic(host, CGI_SITE_1_HOST))
-         || (0 == strcmpic(host, CGI_SITE_1_HOST ".")))
-       && (path[0] == '/') )
+   /* Either the host matches CGI_PREFIX_HOST ..*/
+   if (0 == strcmpic(csp->http->host, CGI_PREFIX_HOST))
    {
-      /* ..then the path will all be for us.  Remove leading '/' */
-      path++;
+      /* ..then the path will all be for us */
+      argstring = csp->http->path;
    }
-   /* Or it's the host part CGI_SITE_2_HOST, and the path CGI_SITE_2_PATH */
-   else if ( ( (0 == strcmpic(host, CGI_SITE_2_HOST ))
-            || (0 == strcmpic(host, CGI_SITE_2_HOST ".")) )
-          && (0 == strncmpic(path, CGI_SITE_2_PATH, strlen(CGI_SITE_2_PATH))) )
+   /* Or it's the host part HOME_PAGE_URL, and the path /config ? */
+   else if (   (0 == strcmpic(csp->http->host, HOME_PAGE_URL + 7 ))
+            && (0 == strncmpic(csp->http->path,"/config", 7))
+            && ((csp->http->path[7] == '/') || (csp->http->path[7] == '\0')))
    {
-      /* take everything following CGI_SITE_2_PATH */
-      path += strlen(CGI_SITE_2_PATH);
-      if (*path == '/')
-      {
-         /* skip the forward slash after CGI_SITE_2_PATH */
-         path++;
-      }
-      else if (*path != '\0')
-      {
-         /*
-          * wierdness: URL is /configXXX, where XXX is some string
-          * Do *NOT* intercept.
-          */
-         return NULL;
-      }
+      /* then it's everything following "/config" */
+      argstring = csp->http->path + 7;
    }
    else
    {
-      /* Not a CGI */
       return NULL;
    }
 
@@ -590,74 +211,16 @@ struct http_response *dispatch_cgi(struct client_state *csp)
     * This is a CGI call.
     */
 
-   return dispatch_known_cgi(csp, path);
-}
-
-
-/*********************************************************************
- * 
- * Function    :  dispatch_known_cgi
- *
- * Description :  Processes a CGI once dispatch_cgi has determined that
- *                it matches one of the magic prefixes. Parses the path
- *                as a cgi name plus query string, prepares a map that
- *                maps CGI parameter names to their values, initializes
- *                the http_response struct, and calls the relevant CGI
- *                handler function.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  path = Path of CGI, with the CGI prefix removed.
- *                       Should not have a leading "/".
- *
- * Returns     :  http_response, or NULL on handler failure or out of
- *                memory.
- *
- *********************************************************************/
-static struct http_response *dispatch_known_cgi(struct client_state * csp,
-                                                const char * path)
-{
-   const struct cgi_dispatcher *d;
-   struct map *param_list;
-   struct http_response *rsp;
-   char *query_args_start;
-   char *path_copy;
-   jb_err err;
-
-   if (NULL == (path_copy = strdup(path)))
-   {
-      return cgi_error_memory();
-   }
-
-   query_args_start = path_copy;
-   while (*query_args_start && *query_args_start != '?')
-   {
-      query_args_start++;
-   }
-   if (*query_args_start == '?')
-   {
-      *query_args_start++ = '\0';
-   }
-
-   if (NULL == (param_list = parse_cgi_parameters(query_args_start)))
+   /* Get mem for response or fail*/
+   if (NULL == ( rsp = zalloc(sizeof(*rsp))))
    {
-      free(path_copy);
-      return cgi_error_memory();
+      return NULL;
    }
 
-
-   /*
-    * At this point:
-    * path_copy        = CGI call name
-    * param_list       = CGI params, as map
-    */
-
-   /* Get mem for response or fail*/
-   if (NULL == (rsp = alloc_http_response()))
+   /* Remove leading slash */
+   if (*argstring == '/')
    {
-      free(path_copy);
-      free_map(param_list);
-      return cgi_error_memory();
+      argstring++;
    }
 
    log_error(LOG_LEVEL_GPC, "%s%s cgi call", csp->http->hostport, csp->http->path);
@@ -665,32 +228,25 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
                             csp->ip_addr_str, csp->http->cmd); 
 
    /* Find and start the right CGI function*/
-   d = cgi_dispatchers;
-   for (;;)
+   for (d = cgi_dispatcher; d->handler; d++)
    {
-      if ((d->name == NULL) || (strcmp(path_copy, d->name) == 0))
+      if (strncmp(argstring, d->name, d->name_length) == 0)
       {
-         err = (d->handler)(csp, rsp, param_list);
-         free(path_copy);
-         free_map(param_list);
-         if (err == JB_ERR_CGI_PARAMS)
-         {
-            err = cgi_error_bad_param(csp, rsp);
-         }
-         if (!err)
-         {
-            /* It worked */
-            return finish_http_response(rsp);
-         }
-         else
+         param_list = parse_cgi_parameters(argstring + d->name_length);
+         if ((d->handler)(csp, rsp, param_list))
          {
-            /* Error in handler, probably out-of-memory */
-            free_http_response(rsp);
-            return cgi_error_memory();
+            freez(rsp);
          }
+
+         free_map(param_list);
+         return(finish_http_response(rsp));
       }
-      d++;
    }
+
+   /* Can't get here, since cgi_default will match all requests */
+   freez(rsp);
+   return(NULL);
+
 }
 
 
@@ -702,361 +258,513 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
  *                pairs and store them in a struct map list.
  *
  * Parameters  :
- *          1  :  string = string to be parsed.  Will be trashed.
+ *          1  :  string = string to be parsed 
  *
- * Returns     :  pointer to param list, or NULL if out of memory.
+ * Returns     :  poniter to param list, or NULL if failiure
  *
  *********************************************************************/
-static struct map *parse_cgi_parameters(char *argstring)
+struct map *parse_cgi_parameters(char *argstring)
 {
-   char *p;
+   char *tmp, *p;
    char *vector[BUFFER_SIZE];
    int pairs, i;
-   struct map *cgi_params;
+   struct map *cgi_params = NULL;
 
-   if (NULL == (cgi_params = new_map()))
-   {
-      return NULL;
-   }
+   if(*argstring == '?') argstring++;
+   tmp = strdup(argstring);
 
-   pairs = ssplit(argstring, "&", vector, SZ(vector), 1, 1);
+   pairs = ssplit(tmp, "&", vector, SZ(vector), 1, 1);
 
    for (i = 0; i < pairs; i++)
    {
       if ((NULL != (p = strchr(vector[i], '='))) && (*(p+1) != '\0'))
       {
          *p = '\0';
-         if (map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0))
-         {
-            free_map(cgi_params);
-            return NULL;
-         }
+         cgi_params = map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0);
       }
    }
 
-   return cgi_params;
+   free(tmp);
+   return(cgi_params);
 
 }
 
 
 /*********************************************************************
  *
- * Function    :  error_response
- *
- * Description :  returns an http_response that explains the reason
- *                why a request failed.
+ * Function    :  cgi_default
  *
+ * Description :  CGI function that is called if no action was given.
+ *                Lists menu of available unhidden CGIs.
+ *               
  * Parameters  :
- *           :  csp = Current client state (buffers, headers, etc...)
- *          2  :  templatename = Which template should be used for the answer
- *          3  :  sys_err = system error number
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
  *
- * Returns     :  A http_response.  If we run out of memory, this
- *                will be cgi_error_memory().
+ * Returns     :  0
  *
  *********************************************************************/
-struct http_response *error_response(struct client_state *csp,
-                                     const char *templatename,
-                                     int sys_err)
+int cgi_default(struct client_state *csp, struct http_response *rsp,
+                struct map *parameters)
 {
-   jb_err err;
-   struct http_response *rsp;
-   struct map * exports = default_exports(csp, NULL);
-   if (exports == NULL)
-   {
-      return cgi_error_memory();
-   }
-
-   if (NULL == (rsp = alloc_http_response()))
-   {
-      free_map(exports);
-      return cgi_error_memory();
-   }
-
-   err = map(exports, "host", 1, html_encode(csp->http->host), 0);
-   if (!err) err = map(exports, "hostport", 1, html_encode(csp->http->hostport), 0);
-   if (!err) err = map(exports, "path", 1, html_encode(csp->http->path), 0);
-   if (!err) err = map(exports, "error", 1, html_encode_and_free_original(safe_strerror(sys_err)), 0);
-   if (!err)
-   {
-     err = map(exports, "host-ip", 1, html_encode(csp->http->host_ip_addr_str), 0);
-     if (err)
-     {
-       /* Some failures, like "404 no such domain", don't have an IP address. */
-       err = map(exports, "host-ip", 1, html_encode(csp->http->host), 0);
-     }
-   }
+   char *p, *tmp = NULL;
+   struct map *exports = default_exports(csp, "");
 
-
-   if (err)
+   /* If there were other parameters, export a dump as "cgi-parameters" */
+   if(parameters)
    {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
+      p = dump_map(parameters);
+      tmp = strsav(tmp, "<p>What made you think this cgi takes parameters?\n"
+                        "Anyway, here they are, in case you're interested:</p>\n");
+      tmp = strsav(tmp, p);
+      exports = map(exports, "cgi-parameters", 1, tmp, 0);
+      free(p);
    }
-
-   if (!strcmp(templatename, "no-such-domain"))
-   {
-      rsp->status = strdup("404 No such domain");
-      if (rsp->status == NULL)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-   }
-   else if (!strcmp(templatename, "connect-failed"))
+   else
    {
-      rsp->status = strdup("503 Connect failed");
-      if (rsp->status == NULL)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
+      exports = map(exports, "cgi-parameters", 1, "", 1);
    }
 
-   err = template_fill_for_cgi(csp, templatename, exports, rsp);
-   if (err)
-   {
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
+   rsp->body = fill_template(csp, "default", exports);
+   free_map(exports);
+   return(0);
 
-   return finish_http_response(rsp);
 }
 
 
 /*********************************************************************
  *
- * Function    :  cgi_init_error_messages
+ * Function    :  cgi_send_banner
  *
- * Description :  Call at the start of the program to initialize
- *                the error message used by cgi_error_memory().
+ * Description :  CGI function that returns a banner. 
  *
- * Parameters  :  N/A
+ * Parameters  :
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
  *
- * Returns     :  N/A
+ * CGI Parameters :
+ *           type : Selects the type of banner between "trans" and "jb".
+ *                  Defaults to "jb" if absent or != "trans".
+ *
+ * Returns     :  0
  *
  *********************************************************************/
-void cgi_init_error_messages(void)
+int cgi_send_banner(struct client_state *csp, struct http_response *rsp,
+                    struct map *parameters)
 {
-   memset(cgi_error_memory_response, '\0', sizeof(*cgi_error_memory_response));
-   cgi_error_memory_response->head =
-      "HTTP/1.0 500 Internal Privoxy Error\r\n"
-      "Content-Type: text/html\r\n"
-      "\r\n";
-   cgi_error_memory_response->body =
-      "<html>\r\n"
-      "<head><title>500 Internal Privoxy Error</title></head>\r\n"
-      "<body>\r\n"
-      "<h1>500 Internal Privoxy Error</h1>\r\n"
-      "<p>Privoxy <b>ran out of memory</b> while processing your request.</p>\r\n"
-      "<p>Please contact your proxy administrator, or try again later</p>\r\n"
-      "</body>\r\n"
-      "</html>\r\n";
-
-   cgi_error_memory_response->head_length =
-      strlen(cgi_error_memory_response->head);
-   cgi_error_memory_response->content_length =
-      strlen(cgi_error_memory_response->body);
-}
+   if(strcmp(lookup(parameters, "type"), "trans"))
+   {
+      rsp->body = bindup(JBGIF, sizeof(JBGIF));
+      rsp->content_length = sizeof(JBGIF);
+   }
+   else
+   {
+      rsp->body = bindup(BLANKGIF, sizeof(BLANKGIF));
+      rsp->content_length = sizeof(BLANKGIF);
+   }   
 
+   enlist(rsp->headers, "Content-Type: image/gif");
 
-/*********************************************************************
- *
- * Function    :  cgi_error_memory
- *
- * Description :  Called if a CGI function runs out of memory.
- *                Returns a statically-allocated error response.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  template_name = Name of template that could not
- *                                be loaded.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-struct http_response *cgi_error_memory(void)
-{
-   /* assert that it's been initialized. */
-   assert(cgi_error_memory_response->head);
+   return(0);
 
-   return cgi_error_memory_response;
 }
 
 
 /*********************************************************************
  *
- * Function    :  cgi_error_no_template
+ * Function    :  cgi_show_status
  *
- * Description :  Almost-CGI function that is called if a templae
- *                cannot be loaded.  Note this is not a true CGI,
- *                it takes a template name rather than a map of 
- *                parameters.
+ * Description :  CGI function that returns a a web page describing the
+ *                current status of IJB.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  template_name = Name of template that could not
- *                                be loaded.
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
+ *
+ * CGI Parameters :
+ *           type : Selects the type of banner between "trans" and "jb".
+ *                  Defaults to "jb" if absent or != "trans".
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  0
  *
  *********************************************************************/
-jb_err cgi_error_no_template(struct client_state *csp,
-                             struct http_response *rsp,
-                             const char *template_name)
+int cgi_show_status(struct client_state *csp, struct http_response *rsp,
+                    struct map *parameters)
 {
-   static const char status[] =
-      "500 Internal Privoxy Error";
-   static const char body_prefix[] =
-      "<html>\r\n"
-      "<head><title>500 Internal Privoxy Error</title></head>\r\n"
-      "<body>\r\n"
-      "<h1>500 Internal Privoxy Error</h1>\r\n"
-      "<p>Privoxy encountered an error while processing your request:</p>\r\n"
-      "<p><b>Could not load template file <code>";
-   static const char body_suffix[] =
-      "</code></b></p>\r\n"
-      "<p>Please contact your proxy administrator.</p>\r\n"
-      "<p>If you are the proxy administrator, please put the required file "
-      "in the <code><i>(confdir)</i>/templates</code> directory.  The "
-      "location of the <code><i>(confdir)</i></code> directory "
-      "is specified in the main Privoxy <code>config</code> "
-      "file.  (It's typically the Privoxy install directory"
-#ifndef _WIN32
-      ", or <code>/etc/privoxy/</code>"
-#endif /* ndef _WIN32 */
-      ").</p>\r\n"
-      "</body>\r\n"
-      "</html>\r\n";
-
-   assert(csp);
-   assert(rsp);
-   assert(template_name);
-
-   /* Reset rsp, if needed */
-   freez(rsp->status);
-   freez(rsp->head);
-   freez(rsp->body);
-   rsp->content_length = 0;
-   rsp->head_length = 0;
-   rsp->is_static = 0;
-
-   rsp->body = malloc(strlen(body_prefix) + strlen(template_name) + strlen(body_suffix) + 1);
-   if (rsp->body == NULL)
+   char *s = NULL;
+   int i;
+   struct map *exports = default_exports(csp, "show-status");
+
+#ifdef SPLIT_PROXY_ARGS
+   FILE * fp;
+   char buf[BUFFER_SIZE];
+   char * p;
+   const char * filename = NULL;
+   char * file_description = NULL;
+
+
+   p = lookup(parameters, "file");
+   switch (*p)
    {
-      return JB_ERR_MEMORY;
+   case 'p':
+      if (csp->actions_list)
+      {
+         filename = csp->actions_list->filename;
+         file_description = "Actions List";
+      }
+      break;
+
+   case 'r':
+      if (csp->rlist)
+      {
+         filename = csp->rlist->filename;
+         file_description = "Regex Filter List";
+      }
+      break;
+
+#ifdef TRUST_FILES
+   case 't':
+      if (csp->tlist)
+      {
+         filename = csp->tlist->filename;
+         file_description = "Trust List";
+      }
+      break;
+#endif /* def TRUST_FILES */
    }
-   strcpy(rsp->body, body_prefix);
-   strcat(rsp->body, template_name);
-   strcat(rsp->body, body_suffix);
 
-   rsp->status = strdup(status);
-   if (rsp->body == NULL)
+   if (NULL != filename)
    {
-      return JB_ERR_MEMORY;
+      exports = map(exports, "file-description", 1, file_description, 1);
+      exports = map(exports, "filepath", 1, html_encode(filename), 0);
+
+      if ((fp = fopen(filename, "r")) == NULL)
+      {
+         exports = map(exports, "content", 1, "<h1>ERROR OPENING FILE!</h1>", 1);
+      }
+      else
+      {
+         while (fgets(buf, sizeof(buf), fp))
+         {
+            p = html_encode(buf);
+            if (p)
+            {
+               s = strsav(s, p);
+               freez(p);
+               s = strsav(s, "<br>");
+            }
+         }
+         fclose(fp);
+         exports = map(exports, "contents", 1, s, 0);
+      }
+      rsp->body = fill_template(csp, "show-status-file", exports);
+      free_map(exports);
+      return(0);
+
    }
 
-   return JB_ERR_OK;
-}
+#endif /* def SPLIT_PROXY_ARGS */
 
+   exports = map(exports, "redirect-url", 1, REDIRECT_URL, 1);
+   
+   s = NULL;
+   for (i=0; i < Argc; i++)
+   {
+      s = strsav(s, Argv[i]);
+      s = strsav(s, " ");
+   }
+   exports = map(exports, "invocation", 1, s, 0);
 
-/*********************************************************************
+   exports = map(exports, "options", 1, csp->config->proxy_args, 1);
+   s =   show_rcs();
+   exports = map(exports, "sourceversions", 1, s, 0);  
+   s =   show_defines();
+   exports = map(exports, "defines", 1, s, 0); 
+
+#ifdef STATISTICS
+   exports = add_stats(exports);
+#else
+   exports = map_block_killer(exports, "statistics");
+#endif /* ndef STATISTICS */
+
+#ifdef SPLIT_PROXY_ARGS
+
+   exports = map_block_killer(exports, "no-split-args");
+
+   if (csp->actions_list)
+   {
+      exports = map(exports, "actions-filename", 1,  csp->actions_list->filename, 1);
+   }
+   else
+   {
+      exports = map(exports, "actions-filename", 1, "None specified", 1);
+   }
+
+   if (csp->rlist)
+   {
+      exports = map(exports, "re-filter-filename", 1,  csp->rlist->filename, 1);
+   }
+   else
+   {
+      exports = map(exports, "re-filter-filename", 1, "None specified", 1);
+   }
+
+#ifdef TRUST_FILES
+   if (csp->tlist)
+   {
+      exports = map(exports, "trust-filename", 1,  csp->tlist->filename, 1);
+   }
+   else
+   {
+       exports = map(exports, "trust-filename", 1, "None specified", 1);
+   }
+#else
+   exports = map_block_killer(exports, "trust-support");
+#endif /* ndef TRUST_FILES */
+
+#else /* ifndef SPLIT_PROXY_ARGS */
+   exports = map_block_killer(exports, "split-args");
+
+   if (csp->clist)
+   {
+      map(exports, "clist", 1, csp->clist->proxy_args , 1);
+   }
+
+   if (csp->rlist)
+   {
+      map(exports, "rlist", 1, csp->rlist->proxy_args , 1);
+   }
+
+#ifdef TRUST_FILES
+    if (csp->tlist)
+   {
+      map(exports, "tlist", 1, csp->tlist->proxy_args , 1);
+   }
+#endif /* def TRUST_FILES */
+
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+   rsp->body = fill_template(csp, "show-status", exports);
+   free_map(exports);
+   return(0);
+
+}
+
+ /*********************************************************************
  *
- * Function    :  cgi_error_bad_param
+ * Function    :  cgi_show_url_info
+ *
+ * Description :  CGI function that determines and shows which actions
+ *                junkbuster will perform for a given url, and which
+ *                matches starting from the defaults have lead to that.
  *
- * Description :  CGI function that is called if the parameters
- *                (query string) for a CGI were wrong.
- *               
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
  *
- * CGI Parameters : none
+ * CGI Parameters :
+ *            url : The url whose actions are to be determined.
+ *                  If url is unset, the url-given conditional will be
+ *                  set, so that all but the form can be suppressed in
+ *                  the template.
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  0
  *
  *********************************************************************/
-jb_err cgi_error_bad_param(struct client_state *csp,
-                           struct http_response *rsp)
+int cgi_show_url_info(struct client_state *csp, struct http_response *rsp,
+                      struct map *parameters)
 {
-   struct map *exports;
+   struct map *exports = default_exports(csp, "show-url-info");
+   char *url_param, *host = NULL;
 
-   assert(csp);
-   assert(rsp);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
+   if (NULL == (url_param = strdup(lookup(parameters, "url"))) || *url_param == '\0')
    {
-      return JB_ERR_MEMORY;
+      exports = map_block_killer(exports, "url-given");
+      exports = map(exports, "url", 1, "", 1);
    }
+   else
+   {
+      char *matches = NULL;
+      char *path;
+      char *s;
+      int port = 80;
+      int hits = 0;
+      struct file_list *fl;
+      struct url_actions *b;
+      struct url_spec url[1];
+      struct current_action_spec action[1];
+      
+      host = url_param;
+      host += (strncmp(url_param, "http://", 7)) ? 0 : 7;
+
+      exports = map(exports, "url", 1, host, 1);
+      exports = map(exports, "url-html", 1, html_encode(host), 0);
+
+      init_current_action(action);
+
+      s = current_action_to_text(action);
+      exports = map(exports, "default", 1, s , 0);
+
+      if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
+      {
+         exports = map(exports, "matches", 1, "none" , 1);
+         exports = map(exports, "final", 1, lookup(exports, "default"), 1);
+
+         freez(url_param);
+         free_current_action(action);
+
+         rsp->body = fill_template(csp, "show-url-info", exports);
+         free_map(exports);
+
+         return 0;
+      }
+
+      s = strchr(host, '/');
+      if (s != NULL)
+      {
+         path = strdup(s);
+         *s = '\0';
+      }
+      else
+      {
+         path = strdup("");
+      }
+      s = strchr(host, ':');
+      if (s != NULL)
+      {
+         *s++ = '\0';
+         port = atoi(s);
+         s = NULL;
+      }
+
+      *url = dsplit(host);
+
+      /* if splitting the domain fails, punt */
+      if (url->dbuf == NULL)
+      {
+         exports = map(exports, "matches", 1, "none" , 1);
+         exports = map(exports, "final", 1, lookup(exports, "default"), 1);
+
+         freez(url_param);
+         freez(path);
+         free_current_action(action);
+
+         rsp->body = fill_template(csp, "show-url-info", exports);
+         free_map(exports);
+
+         return 0;
+      }
+
+      for (b = b->next; NULL != b; b = b->next)
+      {
+         if ((b->url->port == 0) || (b->url->port == port))
+         {
+            if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0))
+            {
+               if ((b->url->path == NULL) ||
+#ifdef REGEX
+                  (regexec(b->url->preg, path, 0, NULL, 0) == 0)
+#else
+                  (strncmp(b->url->path, path, b->url->pathlen) == 0)
+#endif
+               )
+               {
+                  s = actions_to_text(b->action);
+                  matches = strsav(matches, "<b>{");
+                  matches = strsav(matches, s);
+                  matches = strsav(matches, " }</b><br>\n<code>");
+                  matches = strsav(matches, b->url->spec);
+                  matches = strsav(matches, "</code><br>\n<br>\n");
+                  freez(s);
+
+                  merge_current_action(action, b->action);
+                  hits++;
+               }
+            }
+         }
+      }
+
+      if (hits)
+      {
+         exports = map(exports, "matches", 1, matches , 0);
+      }
+      else
+      {
+         exports = map(exports, "matches", 1, "none", 1);
+      }
+      matches = NULL;
+
+      freez(url->dbuf);
+      freez(url->dvec);
+
+      freez(url_param);
+      freez(path);
+
+      s = current_action_to_text(action);
+      exports = map(exports, "final", 1, s, 0);
+      s = NULL;
+
+      free_current_action(action);
+   }
+
+   rsp->body = fill_template(csp, "show-url-info", exports);
+   free_map(exports);
+   return 0;
 
-   return template_fill_for_cgi(csp, "cgi-error-bad-param", exports, rsp);
 }
 
 
 /*********************************************************************
  *
- * Function    :  get_http_time
+ * Function    :  error_response
  *
- * Description :  Get the time in a format suitable for use in a
- *                HTTP header - e.g.:
- *                "Sun, 06 Nov 1994 08:49:37 GMT"
+ * Description :  returns an http_response that explains the reason
+ *                why a request failed.
  *
- * Parameters  :  
- *          1  :  time_offset = Time returned will be current time
- *                              plus this number of seconds.
- *          2  :  buf = Destination for result.  Must be long enough
- *                      to hold 29 characters plus a trailing zero.
+ * Parameters  :
+ *          1  :  csp = Current client state (buffers, headers, etc...)
+ *          2  :  template = Which template should be used for the answer
+ *          3  :  errno = system error number
  *
- * Returns     :  N/A
+ * Returns     :  NULL if no memory, else http_response
  *
  *********************************************************************/
-void get_http_time(int time_offset, char *buf)
+struct http_response *error_response(struct client_state *csp, const char *template, int err)
 {
-   static const char day_names[7][4] =
-      { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
-   static const char month_names[12][4] =
-      { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-
-   struct tm *t;
-   time_t current_time;
-
-   assert(buf);
-
-   time(&current_time); /* get current time */
-
-   current_time += time_offset;
+   struct http_response *rsp;
+   struct map *exports = default_exports(csp, NULL);
 
-   /* get and save the gmt */
+   if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp))))
    {
-#ifdef HAVE_GMTIME_R
-      struct tm dummy;
-      t = gmtime_r(&current_time, &dummy);
-#else
-      t = gmtime(&current_time);
-#endif
-   }
+      return NULL;
+   }  
 
-   /* Format: "Sun, 06 Nov 1994 08:49:37 GMT" */
-   snprintf(buf, 30,
-      "%s, %02d %s %4d %02d:%02d:%02d GMT",
-      day_names[t->tm_wday],
-      t->tm_mday,
-      month_names[t->tm_mon],
-      t->tm_year + 1900,
-      t->tm_hour,
-      t->tm_min,
-      t->tm_sec
-      );
+      exports = map(exports, "host-html", 1, html_encode(csp->http->host), 0);
+      exports = map(exports, "hostport", 1, csp->http->hostport, 1);
+      exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0);
+      exports = map(exports, "path", 1, csp->http->path, 1);
+      exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0);
+      exports = map(exports, "error", 1, safe_strerror(err), 0);
+      exports = map(exports, "host-ip", 1, csp->http->host_ip_addr_str, 1);
 
+      rsp->body = fill_template(csp, template, exports);
+      free_map(exports);
+      
+      if (!strcmp(template, "no-such-domain"))
+      {
+         rsp->status = strdup("404 No such domain"); 
+      }
+      else if (!strcmp(template, "connect-failed"))
+      {
+         rsp->status = strdup("503 Connect failed");
+      }
+
+      return(finish_http_response(rsp));
 }
 
 
@@ -1070,28 +778,18 @@ void get_http_time(int time_offset, char *buf)
  * Parameters  :
  *          1  :  rsp = pointer to http_response to be processed
  *
- * Returns     :  A http_response, usually the rsp parameter.
- *                On error, free()s rsp and returns cgi_error_memory()
+ * Returns     :  http_response, or NULL on failiure
  *
  *********************************************************************/
 struct http_response *finish_http_response(struct http_response *rsp)
 {
    char buf[BUFFER_SIZE];
-   jb_err err;
-
-   /* Special case - do NOT change this statically allocated response,
-    * which is ready for output anyway.
-    */
-   if (rsp == cgi_error_memory_response)
-   {
-      return rsp;
-   }
 
    /* 
     * Fill in the HTTP Status
     */
    sprintf(buf, "HTTP/1.0 %s", rsp->status ? rsp->status : "200 OK");
-   err = enlist_first(rsp->headers, buf);
+   enlist_first(rsp->headers, buf);
 
    /* 
     * Set the Content-Length
@@ -1100,95 +798,32 @@ struct http_response *finish_http_response(struct http_response *rsp)
    {
       rsp->content_length = rsp->body ? strlen(rsp->body) : 0;
    }
-   if (!err)
-   {
-      sprintf(buf, "Content-Length: %d", rsp->content_length);
-      err = enlist(rsp->headers, buf);
-   }
+   sprintf(buf, "Content-Length: %d", rsp->content_length);
+   enlist(rsp->headers, buf);
 
    /* 
-    * Fill in the default headers:
-    *
-    * Content-Type: default to text/html if not already specified.
-    * Date: set to current date/time.
-    * Last-Modified: set to date/time the page was last changed.
-    * Expires: set to date/time page next needs reloading.
-    * Cache-Control: set to "no-cache" if applicable.
-    * 
-    * See http://www.w3.org/Protocols/rfc2068/rfc2068
+    * Fill in the default headers FIXME: Are these correct? sequence OK? check rfc!
     */
-   if (!err) err = enlist_unique(rsp->headers, "Content-Type: text/html", 13);
-
-   if (rsp->is_static)
-   {
-      /*
-       * Set Expires to about 10 min into the future so it'll get reloaded
-       * occasionally, e.g. if Privoxy gets upgraded.
-       */
-
-      if (!err)
-      {
-         get_http_time(0, buf);
-         err = enlist_unique_header(rsp->headers, "Date", buf);
-      }
-
-      /* Some date in the past. */
-      if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", "Sat, 17 Jun 2000 12:00:00 GMT");
-
-      if (!err)
-      {
-         get_http_time(10 * 60, buf); /* 10 * 60sec = 10 minutes */
-         err = enlist_unique_header(rsp->headers, "Expires", buf);
-      }
-   }
-   else
-   {
-      /*
-       * Compliant browsers should not cache this due to the "Cache-Control"
-       * setting.  However, to be certain, we also set both "Last-Modified"
-       * and "Expires" to the current time.
-       */
-      if (!err) err = enlist_unique_header(rsp->headers, "Cache-Control", "no-cache");
-
-      get_http_time(0, buf);
-      if (!err) err = enlist_unique_header(rsp->headers, "Date", buf);
-      if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", buf);
-      if (!err) err = enlist_unique_header(rsp->headers, "Expires", buf);
-   }
-
+   enlist_unique(rsp->headers, "Last-Modified: Thu Jul 31, 1997 07:42:22 pm GMT", 14);
+   enlist_unique(rsp->headers, "Expires:       Thu Jul 31, 1997 07:42:22 pm GMT", 8);
+   enlist_unique(rsp->headers, "Content-Type: text/html", 13);
+   enlist(rsp->headers, "");
+  
 
    /* 
     * Write the head
     */
-   if (err || (NULL == (rsp->head = list_to_text(rsp->headers))))
+   if (NULL == (rsp->head = list_to_text(rsp->headers)))
    {
       free_http_response(rsp);
-      return cgi_error_memory();
+      return(NULL);
    }
    rsp->head_length = strlen(rsp->head);
 
-   return rsp;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  alloc_http_response
- *
- * Description :  Allocates a new http_response structure.
- *
- * Parameters  :  N/A
- *
- * Returns     :  pointer to a new http_response, or NULL.
- *
- *********************************************************************/
-struct http_response *alloc_http_response(void)
-{
-   return (struct http_response *) zalloc(sizeof(struct http_response));
+   return(rsp);
 
 }
-
+  
 
 /*********************************************************************
  *
@@ -1205,16 +840,13 @@ struct http_response *alloc_http_response(void)
  *********************************************************************/
 void free_http_response(struct http_response *rsp)
 {
-   /*
-    * Must special case cgi_error_memory_response, which is never freed.
-    */
-   if (rsp && (rsp != cgi_error_memory_response))
+   if(rsp)
    {
       freez(rsp->status);
       freez(rsp->head);
       freez(rsp->body);
       destroy_list(rsp->headers);
-      free(rsp);
+      freez(rsp);
    }
 
 }
@@ -1222,254 +854,99 @@ void free_http_response(struct http_response *rsp)
 
 /*********************************************************************
  *
- * Function    :  template_load
+ * Function    :  fill_template
  *
  * Description :  CGI support function that loads a given HTML
- *                template from the confdir, ignoring comment
- *                lines. 
+ *                template from the confdir, and fills it in
+ *                by replacing @name@ with value using pcrs,
+ *                for each item in the output map.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  template_ptr = Destination for pointer to loaded
- *                               template text.
- *          3  :  template = name of the HTML template to be used
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           3 :  template = name of the HTML template to be used
+ *           2 :  exports = map with fill in symbol -> name pairs
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *                JB_ERR_FILE if the template file cannot be read
+ * Returns     :  char * with filled out form, or NULL if failiure
  *
  *********************************************************************/
-jb_err template_load(struct client_state *csp, char ** template_ptr, 
-                     const char *templatename)
+char *fill_template(struct client_state *csp, const char *template, struct map *exports)
 {
-   char *templates_dir_path;
-   char *full_path;
-   char *file_buffer;
-   FILE *fp;
+   struct map *m;
+   pcrs_job *job, *joblist = NULL;
    char buf[BUFFER_SIZE];
+   char *new, *old = NULL;
+   int size;
+   FILE *fp;
 
-   assert(csp);
-   assert(template_ptr);
-   assert(templatename);
-
-   *template_ptr = NULL;
 
    /*
     * Open template file or fail
     */
+   snprintf(buf, BUFFER_SIZE, "%s/templates/%s", csp->config->confdir, template);
 
-   templates_dir_path = make_path(csp->config->confdir, "templates");
-   if (templates_dir_path == NULL)
+   if(NULL == (fp = fopen(buf, "r")))
    {
-      return JB_ERR_MEMORY;
-   }
-
-   full_path = make_path(templates_dir_path, templatename);
-   free(templates_dir_path);
-   if (full_path == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   file_buffer = strdup("");
-   if (file_buffer == NULL)
-   {
-      free(full_path);
-      return JB_ERR_MEMORY;
-   }
-
-   if (NULL == (fp = fopen(full_path, "r")))
-   {
-      log_error(LOG_LEVEL_ERROR, "Cannot open template file %s: %E", full_path);
-      free(full_path);
-      free(file_buffer);
-      return JB_ERR_FILE;
+      log_error(LOG_LEVEL_ERROR, "error loading template %s: %E", buf);
+      return NULL;
    }
-   free(full_path);
+   
 
    /* 
-    * Read the file, ignoring comments.
-    *
-    * FIXME: The comment handling could break with lines >BUFFER_SIZE long.
-    *        This is unlikely in practise.
+    * Assemble pcrs joblist from exports map
     */
-   while (fgets(buf, BUFFER_SIZE, fp))
+   for (m = exports; m; m = m->next)
    {
-      /* skip lines starting with '#' */
-      if(*buf == '#')
+      int error;
+
+      /* Enclose name in @@ */
+      snprintf(buf, BUFFER_SIZE, "@%s@", m->name);
+
+      /* Make and chain job */
+      if ( NULL == (job = (pcrs_compile(buf, m->value, "sigTU", &error))) ) 
       {
-         continue;
+         log_error(LOG_LEVEL_ERROR, "Error compiling template fill job %s: %d", m->name, error);
       }
-
-      if (string_append(&file_buffer, buf))
+      else
       {
-         fclose(fp);
-         return JB_ERR_MEMORY;
+         job->next = joblist;
+         joblist = job;
       }
    }
-   fclose(fp);
-
-   *template_ptr = file_buffer;
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  template_fill
- *
- * Description :  CGI support function that fills in a pre-loaded
- *                HTML template by replacing @name@ with value using
- *                pcrs, for each item in the output map.
- *
- *                Note that a leading '$' charachter in the export map's
- *                values will be stripped and toggle on backreference
- *                interpretation.
- *
- * Parameters  :
- *          1  :  template_ptr = IN: Template to be filled out.
- *                                   Will be free()d.
- *                               OUT: Filled out template.
- *                                    Caller must free().
- *          2  :  exports = map with fill in symbol -> name pairs
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error
- *
- *********************************************************************/
-jb_err template_fill(char **template_ptr, const struct map *exports)
-{
-   struct map_entry *m;
-   pcrs_job *job;
-   char buf[BUFFER_SIZE];
-   char *tmp_out_buffer;
-   char *file_buffer;
-   size_t  size;
-   int error;
-   const char *flags;
-
-   assert(template_ptr);
-   assert(*template_ptr);
-   assert(exports);
 
-   file_buffer = *template_ptr;
-   size = strlen(file_buffer) + 1;
 
    /* 
-    * Assemble pcrs joblist from exports map
+    * Read the file, ignoring comments
     */
-   for (m = exports->first; m != NULL; m = m->next)
+   while (fgets(buf, BUFFER_SIZE, fp))
    {
-      if (*m->name == '$')
-      {
-         /*
-          * First character of name is '$', so remove this flag
-          * character and allow backreferences ($1 etc) in the
-          * "replace with" text.
-          */
-         snprintf(buf, BUFFER_SIZE, "%s", m->name + 1);
-         flags = "sigU";
-      }
-      else
-      {
-         /*
-          * Treat the "replace with" text as a literal string - 
-          * no quoting needed, no backreferences allowed.
-          * ("Trivial" ['T'] flag).
-          */
-         flags = "sigTU";
-
-         /* Enclose name in @@ */
-         snprintf(buf, BUFFER_SIZE, "@%s@", m->name);
-      }
+      /* skip lines starting with '#' */
+      if(*buf == '#') continue;
+   
+      old = strsav(old, buf);
+   }
+   fclose(fp);
 
 
-      log_error(LOG_LEVEL_CGI, "Substituting: s/%s/%s/%s", buf, m->value, flags);
+   /*
+    * Execute the jobs
+    */
+   size = strlen(old) + 1;
+   new = old;
 
-      /* Make and run job. */
-      job = pcrs_compile(buf, m->value, flags,  &error);
-      if (job == NULL) 
-      {
-         if (error == PCRS_ERR_NOMEM)
-         {
-            free(file_buffer);
-            *template_ptr = NULL;
-            return JB_ERR_MEMORY;
-         }
-         else
-         {
-            log_error(LOG_LEVEL_ERROR, "Error compiling template fill job %s: %d", m->name, error);
-            /* Hope it wasn't important and silently ignore the invalid job */
-         }
-      }
-      else
-      {
-         pcrs_execute(job, file_buffer, size, &tmp_out_buffer, &size);
-         free(file_buffer);
-         pcrs_free_job(job);
-         if (NULL == tmp_out_buffer)
-         {
-            *template_ptr = NULL;
-            return JB_ERR_MEMORY;
-         }
-         file_buffer = tmp_out_buffer;
-      }
+   for (job = joblist; NULL != job; job = job->next)
+   {
+      pcrs_execute(job, old, size, &new, &size);
+      if (old != buf) free(old);
+      old = new;
    }
 
+
    /*
-    * Return
+    * Free the jobs & return
     */
-   *template_ptr = file_buffer;
-   return JB_ERR_OK;
-}
+   pcrs_free_joblist(joblist);
+   return(new);
 
-
-/*********************************************************************
- *
- * Function    :  template_fill_for_cgi
- *
- * Description :  CGI support function that loads a HTML template
- *                and fills it in.  Handles file-not-found errors
- *                by sending a HTML error message.  For convenience,
- *                this function also frees the passed "exports" map.
- *
- * Parameters  :
- *          1  :  csp = Client state
- *          2  :  templatename = name of the HTML template to be used
- *          3  :  exports = map with fill in symbol -> name pairs.
- *                          Will be freed by this function.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error
- *
- *********************************************************************/
-jb_err template_fill_for_cgi(struct client_state *csp,
-                             const char *templatename,
-                             struct map *exports,
-                             struct http_response *rsp)
-{
-   jb_err err;
-   
-   assert(csp);
-   assert(templatename);
-   assert(exports);
-   assert(rsp);
-
-   err = template_load(csp, &rsp->body, templatename);
-   if (err == JB_ERR_FILE)
-   {
-      free_map(exports);
-      return cgi_error_no_template(csp, rsp, templatename);
-   }
-   else if (err)
-   {
-      free_map(exports);
-      return err; /* JB_ERR_MEMORY */
-   }
-   err = template_fill(&rsp->body, exports);
-   free_map(exports);
-   return err;
 }
 
 
@@ -1483,75 +960,43 @@ jb_err template_fill_for_cgi(struct client_state *csp,
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *          2  :  caller = name of CGI who calls us and which should
- *                         be excluded from the generated menu. May be
- *                         NULL.
- * Returns     :  NULL if no memory, else a new map.  Caller frees.
+ *                         be excluded from the generated menu.
+ * Returns     :  NULL if no memory, else map
  *
  *********************************************************************/
-struct map *default_exports(const struct client_state *csp, const char *caller)
+struct map *default_exports(struct client_state *csp, char *caller)
 {
+   struct map *exports = NULL;
    char buf[20];
-   jb_err err;
-   struct map * exports;
-   int local_help_exists = 0;
 
-   assert(csp);
-
-   exports = new_map();
-   if (exports == NULL)
-   {
-      return NULL;
-   }
-
-   err = map(exports, "version", 1, html_encode(VERSION), 0);
-   if (!err) err = map(exports, "my-ip-address", 1, html_encode(csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown"), 0);
-   if (!err) err = map(exports, "my-hostname",   1, html_encode(csp->my_hostname ? csp->my_hostname : "unknown"), 0);
-   if (!err) err = map(exports, "homepage",      1, html_encode(HOME_PAGE_URL), 0);
-   if (!err) err = map(exports, "default-cgi",   1, html_encode(CGI_PREFIX), 0);
-   if (!err) err = map(exports, "menu",          1, make_menu(caller), 0);
-   if (!err) err = map(exports, "code-status",   1, CODE_STATUS, 1);
-   if (!err) err = map_conditional(exports, "enabled-display", g_bToggleIJB);
+   exports = map(exports, "version", 1, VERSION, 1);
+   exports = map(exports, "my-ip-address", 1, csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown", 1);
+   exports = map(exports, "my-hostname", 1, csp->my_hostname ? csp->my_hostname : "unknown", 1);
+   exports = map(exports, "admin-address", 1, csp->config->admin_address ? csp->config->admin_address : "fill@me.in.please", 1);
+   exports = map(exports, "homepage", 1, HOME_PAGE_URL, 1);
+   exports = map(exports, "default-cgi", 1, HOME_PAGE_URL "/config", 1);
+   exports = map(exports, "menu", 1, make_menu(caller), 0);
+   exports = map(exports, "code-status", 1, CODE_STATUS, 1);
 
    snprintf(buf, 20, "%d", csp->config->hport);
-   if (!err) err = map(exports, "my-port", 1, buf, 1);
+   exports = map(exports, "my-port", 1, buf, 1);
 
    if(!strcmp(CODE_STATUS, "stable"))
    {
-      if (!err) err = map_block_killer(exports, "unstable");
-   }
-
-   if (csp->config->admin_address != NULL)
-   {
-      if (!err) err = map(exports, "admin-address", 1, html_encode(csp->config->admin_address), 0);
-      local_help_exists = 1;
-   }
-   else
-   {
-      if (!err) err = map_block_killer(exports, "have-adminaddr-info");
+      exports = map_block_killer(exports, "unstable");
    }
 
-   if (csp->config->proxy_info_url != NULL)
+   if(csp->config->proxy_info_url != NULL)
    {
-      if (!err) err = map(exports, "proxy-info-url", 1, html_encode(csp->config->proxy_info_url), 0);
-      local_help_exists = 1;
+      exports = map(exports, "proxy-info-url", 1, csp->config->proxy_info_url, 1);
    }
    else
    {
-      if (!err) err = map_block_killer(exports, "have-proxy-info");
-   }
+      exports = map_block_killer(exports, "have-proxy-info");
+   }   
 
-   if (local_help_exists == 0)
-   {
-      if (!err) err = map_block_killer(exports, "have-help-info");
-   }
+   return(exports);
 
-   if (err)
-   {
-      free_map(exports);
-      return NULL;
-   }
-
-   return exports;
 }
 
 
@@ -1569,184 +1014,145 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
  *          1  :  exports = map to extend
  *          2  :  name = name of conditional block
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  extended map
  *
  *********************************************************************/
-jb_err map_block_killer(struct map *exports, const char *name)
+struct map *map_block_killer(struct map *exports, char *name)
 {
    char buf[1000]; /* Will do, since the names are hardwired */
 
-   assert(exports);
-   assert(name);
-   assert(strlen(name) < 490);
-
    snprintf(buf, 1000, "if-%s-start.*if-%s-end", name, name);
-   return map(exports, buf, 1, "", 1);
+   exports = map(exports, buf, 1, "", 1);
+
+   return(exports);
+
 }
 
 
 /*********************************************************************
  *
- * Function    :  map_block_keep
+ * Function    :  make_menu
  *
- * Description :  Convenience function.  Removes the markers used
- *                by map-block-killer, to save a few bytes.
- *                i.e. removes "@if-<name>-start@" and "@if-<name>-end@"
+ * Description :  Returns an HTML-formatted menu of the available 
+ *                unhidden CGIs, excluding the one given in <self>.
  *
- * Parameters  :  
- *          1  :  exports = map to extend
- *          2  :  name = name of conditional block
+ * Parameters  :  self = name of CGI to leave out, can be NULL
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  menu string
  *
  *********************************************************************/
-jb_err map_block_keep(struct map *exports, const char *name)
+char *make_menu(const char *self)
 {
-   jb_err err;
-   char buf[500]; /* Will do, since the names are hardwired */
-
-   assert(exports);
-   assert(name);
-   assert(strlen(name) < 490);
+   const struct cgi_dispatcher *d;
+   char buf[BUFFER_SIZE], *tmp = NULL;
 
-   snprintf(buf, 500, "if-%s-start", name);
-   err = map(exports, buf, 1, "", 1);
+   if (self == NULL) self = "NO-SUCH-CGI!";
 
-   if (err)
+   /* List available unhidden CGI's and export as "other-cgis" */
+   for (d = cgi_dispatcher; d->handler; d++)
    {
-      return err;
+      if (strncmp(d->description, "HIDE", 4) && strcmp(d->name, self))
+      {
+         snprintf(buf, BUFFER_SIZE, "<li><a href=%s/config/%s>%s</a></li>\n",
+              HOME_PAGE_URL, d->name, d->description);
+         tmp = strsav(tmp, buf);
+      }
    }
+   return(tmp);
 
-   snprintf(buf, 500, "if-%s-end", name);
-   return map(exports, buf, 1, "", 1);
 }
 
 
 /*********************************************************************
  *
- * Function    :  map_conditional
- *
- * Description :  Convenience function.
- *                Adds an "if-then-else" for the conditional HTML-template
- *                block <name>, i.e. a substitution of the form:
- *                @if-<name>-then@
- *                   True text
- *                @else-not-<name>@
- *                   False text
- *                @endif-<name>@
+ * Function    :  dump_map
  *
- *                The control structure and one of the alternatives
- *                will be hidden.
+ * Description :  HTML-dump a map for debugging
  *
- * Parameters  :  
- *          1  :  exports = map to extend
- *          2  :  name = name of conditional block
- *          3  :  choose_first = nonzero for first, zero for second.
+ * Parameters  :
+ *          1  :  map = map to dump
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  string with HTML
  *
  *********************************************************************/
-jb_err map_conditional(struct map *exports, const char *name, int choose_first)
+char *dump_map(struct map *map)
 {
-   char buf[1000]; /* Will do, since the names are hardwired */
-   jb_err err;
+   struct map *p = map;
+   char *ret = NULL;
 
-   assert(exports);
-   assert(name);
-   assert(strlen(name) < 480);
+   ret = strsav(ret, "<table>\n");
 
-   snprintf(buf, 1000, (choose_first
-      ? "else-not-%s@.*@endif-%s"
-      : "if-%s-then@.*@else-not-%s"),
-      name, name);
-
-   err = map(exports, buf, 1, "", 1);
-   if (err)
+   while (p)
    {
-      return err;
+      ret = strsav(ret, "<tr><td><b>");
+      ret = strsav(ret, p->name);
+      ret = strsav(ret, "</b></td><td>");
+      ret = strsav(ret, p->value);
+      ret = strsav(ret, "</td></tr>\n");
+      p = p->next;
    }
 
-   snprintf(buf, 1000, (choose_first ? "if-%s-then" : "endif-%s"), name);
-   return map(exports, buf, 1, "", 1);
+   ret = strsav(ret, "</table>\n");
+   return(ret);
+
 }
 
 
+#ifdef STATISTICS
 /*********************************************************************
  *
- * Function    :  make_menu
+ * Function    :  add_stats
  *
- * Description :  Returns an HTML-formatted menu of the available 
- *                unhidden CGIs, excluding the one given in <self>.
+ * Description :  Add the blocking statistics to a given map.
  *
- * Parameters  :  self = name of CGI to leave out, can be NULL
+ * Parameters  :
+ *          1  :  exports = map to write to.
  *
- * Returns     :  menu string, or NULL on out-of-memory error.
+ * Returns     :  pointer to extended map
  *
  *********************************************************************/
-char *make_menu(const char *self)
+struct map *add_stats(struct map *exports)
 {
-   const struct cgi_dispatcher *d;
-   char *result = strdup("");
+   float perc_rej;   /* Percentage of http requests rejected */
+   char buf[1000];
+   int local_urls_read     = urls_read;
+   int local_urls_rejected = urls_rejected;
 
-   if (self == NULL)
-   {
-      self = "NO-SUCH-CGI!";
-   }
+   /*
+    * Need to alter the stats not to include the fetch of this
+    * page.
+    *
+    * Can't do following thread safely! doh!
+    *
+    * urls_read--;
+    * urls_rejected--; * This will be incremented subsequently *
+    */
 
-   /* List available unhidden CGI's and export as "other-cgis" */
-   for (d = cgi_dispatchers; d->name; d++)
+   if (local_urls_read == 0)
    {
-      if (d->description && strcmp(d->name, self))
-      {
-         string_append(&result, "<li><a href=\"" CGI_PREFIX);
-         string_append(&result, d->name);
-         string_append(&result, "\">");
-         string_append(&result, d->description);
-         string_append(&result, "</a></li>\n");
-      }
+      exports = map_block_killer(exports, "have-stats");
    }
+   else
+   {
+      exports = map_block_killer(exports, "have-no-stats");
 
-   return result;
-}
-
+      perc_rej = (float)local_urls_rejected * 100.0F /
+            (float)local_urls_read;
 
-/*********************************************************************
- *
- * Function    :  dump_map
- *
- * Description :  HTML-dump a map for debugging
- *
- * Parameters  :
- *          1  :  the_map = map to dump
- *
- * Returns     :  string with HTML
- *
- *********************************************************************/
-char *dump_map(const struct map *the_map)
-{
-   struct map_entry *cur_entry;
-   char *ret = strdup("");
+      sprintf(buf, "%d", local_urls_read);
+      exports = map(exports, "requests-received", 1, buf, 1);
 
-   string_append(&ret, "<table>\n");
+      sprintf(buf, "%d", local_urls_rejected);
+      exports = map(exports, "requests-blocked", 1, buf, 1);
 
-   for (cur_entry = the_map->first;
-        (cur_entry != NULL) && (ret != NULL);
-        cur_entry = cur_entry->next)
-   {
-      string_append(&ret, "<tr><td><b>");
-      string_join  (&ret, html_encode(cur_entry->name));
-      string_append(&ret, "</b></td><td>");
-      string_join  (&ret, html_encode(cur_entry->value));
-      string_append(&ret, "</td></tr>\n");
+      sprintf(buf, "%6.2f", perc_rej);
+      exports = map(exports, "percent-blocked", 1, buf, 1);
    }
 
-   string_append(&ret, "</table>\n");
-   return ret;
-}
+   return(exports);
 
+}
+#endif /* def STATISTICS */
 
 /*
   Local Variables:
diff --git a/cgi.h b/cgi.h
index c7391bc..fb6f574 100644 (file)
--- a/cgi.h
+++ b/cgi.h
@@ -1,6 +1,6 @@
-#ifndef CGI_H_INCLUDED
-#define CGI_H_INCLUDED
-#define CGI_H_VERSION "$Id: cgi.h,v 1.23 2002/03/24 16:18:15 jongfoster Exp $"
+#ifndef _CGI_H
+#define _CGI_H
+#define CGI_H_VERSION "$Id: cgi.h,v 1.5 2001/06/29 13:22:44 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgi.h,v $
@@ -12,7 +12,7 @@
  * 
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: cgi.h,v $
- *    Revision 1.23  2002/03/24 16:18:15  jongfoster
- *    Removing old logo
- *
- *    Revision 1.22  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.21  2002/03/07 03:48:38  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.20  2002/03/04 17:53:22  oes
- *    Fixed compiled warning
- *
- *    Revision 1.19  2002/01/21 00:33:52  jongfoster
- *    Adding map_block_keep() to save a few bytes in the edit-actions-list HTML.
- *
- *    Revision 1.18  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.17  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.16  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *    Revision 1.15  2001/09/16 15:02:35  jongfoster
- *    Adding i.j.b/robots.txt.
- *    Inlining add_stats() since it's only ever called from one place.
- *
- *    Revision 1.14  2001/09/16 11:38:02  jongfoster
- *    Splitting fill_template() into 2 functions:
- *    template_load() loads the file
- *    template_fill() performs the PCRS regexps.
- *    This is because the CGI edit interface has a "table row"
- *    template which is used many times in the page - this
- *    change means it's only loaded from disk once.
- *
- *    Revision 1.13  2001/09/16 11:00:10  jongfoster
- *    New function alloc_http_response, for symmetry with free_http_response
- *
- *    Revision 1.12  2001/09/13 23:31:25  jongfoster
- *    Moving image data to cgi.c rather than cgi.h.
- *
- *    Revision 1.11  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.10  2001/08/01 21:19:22  jongfoster
- *    Moving file version information to a separate CGI page.
- *
- *    Revision 1.9  2001/08/01 00:17:54  jongfoster
- *    Adding prototype for map_conditional
- *
- *    Revision 1.8  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.7  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.6  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.5  2001/06/29 13:22:44  oes
  *    - Cleaned up
  *    - Added new functions: default_exports(), make_menu(),
@@ -145,59 +65,68 @@ extern "C" {
 #endif
 
 /*
- * Main dispatch function
+ * Dispatch & parameter parsing functions
  */
 extern struct http_response *dispatch_cgi(struct client_state *csp);
+extern struct map *parse_cgi_parameters(char *argstring);
+
+/*
+ * CGI functions
+ */
+extern int cgi_default(struct client_state *csp, struct http_response *rsp,
+                       struct map *parameters);
+extern int cgi_show_status(struct client_state *csp, struct http_response *rsp,
+                           struct map *parameters);
+extern int cgi_show_url_info(struct client_state *csp, struct http_response *rsp,
+                             struct map *parameters);
+extern int cgi_send_banner(struct client_state *csp, struct http_response *rsp,
+                                 struct map *parameters);
 
 /* Not exactly a CGI */
-extern struct http_response * error_response(struct client_state *csp,
-                                             const char *templatename,
-                                             int err);
+extern struct http_response *error_response(struct client_state *csp, const char *template, int err);
 
 /*
  * CGI support functions
  */
-extern struct http_response * alloc_http_response(void);
-extern void free_http_response(struct http_response *rsp);
-
 extern struct http_response *finish_http_response(struct http_response *rsp);
+extern void free_http_response(struct http_response *rsp);
 
-extern struct map * default_exports(const struct client_state *csp, const char *caller);
-
-extern jb_err map_block_killer (struct map *exports, const char *name);
-extern jb_err map_block_keep   (struct map *exports, const char *name);
-extern jb_err map_conditional  (struct map *exports, const char *name, int choose_first);
-
-extern jb_err template_load(struct client_state *csp, char ** template_ptr, 
-                            const char *templatename);
-extern jb_err template_fill(char ** template_ptr, const struct map *exports);
-extern jb_err template_fill_for_cgi(struct client_state *csp,
-                                    const char *templatename,
-                                    struct map *exports,
-                                    struct http_response *rsp);
+extern struct map *default_exports(struct client_state *csp, char *caller);
+extern struct map *map_block_killer(struct map *map, char *name);
+extern char *fill_template(struct client_state *csp, const char *template, struct map *exports);
 
-extern void cgi_init_error_messages(void);
-extern struct http_response *cgi_error_memory(void);
-extern jb_err cgi_error_no_template(struct client_state *csp,
-                                    struct http_response *rsp,
-                                    const char *template_name);
-extern jb_err cgi_error_bad_param(struct client_state *csp,
-                                  struct http_response *rsp);
 
 /*
  * Text generators
  */
-extern void get_http_time(int time_offset, char * buf);
 extern char *make_menu(const char *self);
-extern char *dump_map(const struct map *the_map);
+extern char *dump_map(struct map *map);
+
+#ifdef STATISTICS
+extern struct map *add_stats(struct map *exports);
+#endif /* def STATISTICS */
+
 
 /*
- * Ad replacement images.
+ * Hint: You can encode your own GIFs like that:
+ * perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o,", unpack("C", $c)); }'
  */
-extern const char image_pattern_data[];
-extern const size_t  image_pattern_length;
-extern const char image_blank_data[];
-extern const size_t  image_blank_length;
+
+static const char JBGIF[] =
+   "GIF89aD\000\013\000\360\000\000\000\000\000\377\377\377!"
+   "\371\004\001\000\000\001\000,\000\000\000\000D\000\013\000"
+   "\000\002a\214\217\251\313\355\277\000\200G&K\025\316hC\037"
+   "\200\234\230Y\2309\235S\230\266\206\372J\253<\3131\253\271"
+   "\270\215\342\254\013\203\371\202\264\334P\207\332\020o\266"
+   "N\215I\332=\211\312\3513\266:\026AK)\364\370\365aobr\305"
+   "\372\003S\275\274k2\354\254z\347?\335\274x\306^9\374\276"
+   "\037Q\000\000;";
+
+static const char BLANKGIF[] =
+   "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000"
+   "\000!\371\004\001\000\000\000\000,\000\000\000\000\001"
+   "\000\001\000\000\002\002D\001\000;";
+
 
 /* Revision control strings from this header and associated .c file */
 extern const char cgi_rcs[];
@@ -207,7 +136,7 @@ extern const char cgi_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef CGI_H_INCLUDED */
+#endif /* ndef _CGI_H */
 
 /*
   Local Variables:
diff --git a/cgiedit.c b/cgiedit.c
deleted file mode 100644 (file)
index 51a70f2..0000000
--- a/cgiedit.c
+++ /dev/null
@@ -1,4522 +0,0 @@
-const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.27 2002/03/26 23:06:04 jongfoster Exp $";
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgiedit.c,v $
- *
- * Purpose     :  CGI-based actionsfile editor.
- *
- *                Functions declared include: cgi_edit_*
- *
- *                NOTE: The CGIs in this file use parameter names
- *                such as "f" and "s" which are really *BAD* choices.
- *                However, I'm trying to save bytes in the
- *                edit-actions-list HTML page - the standard actions
- *                file generated a 550kbyte page, which is ridiculous.
- *
- *                Stick to the short names in this file for consistency.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgiedit.c,v $
- *    Revision 1.27  2002/03/26 23:06:04  jongfoster
- *    Removing duplicate @ifs on the toggle page
- *
- *    Revision 1.26  2002/03/26 22:59:17  jongfoster
- *    Fixing /toggle to display status consistently.
- *
- *    Revision 1.25  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.24  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.23  2002/03/24 13:32:41  swa
- *    name change related issues
- *
- *    Revision 1.22  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.21  2002/03/22 18:02:48  jongfoster
- *    Fixing remote toggle
- *
- *    Revision 1.20  2002/03/16 20:28:34  oes
- *    Added descriptions to the filters so users will know what they select in the cgi editor
- *
- *    Revision 1.19  2002/03/16 18:38:14  jongfoster
- *    Stopping stupid or malicious users from breaking the actions
- *    file using the web-based editor.
- *
- *    Revision 1.18  2002/03/16 14:57:44  jongfoster
- *    Full support for enabling/disabling modular filters.
- *
- *    Revision 1.17  2002/03/16 14:26:42  jongfoster
- *    First version of modular filters support - READ ONLY!
- *    Fixing a double-free bug in the out-of-memory handling in map_radio().
- *
- *    Revision 1.16  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.15  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.14  2002/03/05 00:24:51  jongfoster
- *    Patch to always edit the current actions file.
- *
- *    Revision 1.13  2002/03/04 02:07:59  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.12  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.11  2002/01/23 01:03:31  jongfoster
- *    Fixing gcc [CygWin] compiler warnings
- *
- *    Revision 1.10  2002/01/23 00:22:59  jongfoster
- *    Adding new function cgi_edit_actions_section_swap(), to reorder
- *    the actions file.
- *
- *    Adding get_url_spec_param() to get a validated URL pattern.
- *
- *    Moving edit_read_line() out of this file and into loaders.c.
- *
- *    Adding missing html_encode() to many CGI functions.
- *
- *    Moving the functions that #include actionlist.h to the end of the file,
- *    because the Visual C++ 97 debugger gets extremely confused if you try
- *    to debug any code that comes after them in the file.
- *
- *    Major optimizations in cgi_edit_actions_list() to reduce the size of
- *    the generated HTML (down 40% from 550k to 304k), with major side-effects
- *    throughout the editor and templates.  In particular, the length of the
- *    URLs throughout the editor has been drastically reduced, by cutting
- *    paramater names down to 1 character and CGI names down to 3-4
- *    characters, by removing all non-essential CGI paramaters even at the
- *    expense of having to re-read the actions file for the most trivial
- *    page, and by using relative rather than absolute URLs.  This means
- *    that this (typical example):
- *
- *    <a href="http://ijbswa.sourceforge.net/config/edit-actions-url-form?
- *    filename=ijb&amp;ver=1011487572&amp;section=12&amp;pattern=13
- *    &amp;oldval=www.oesterhelt.org%2Fdeanimate-demo">
- *
- *    is now this:
- *
- *    <a href="eau?f=ijb&amp;v=1011487572&amp;p=13">
- *
- *    Revision 1.9  2002/01/17 20:56:22  jongfoster
- *    Replacing hard references to the URL of the config interface
- *    with #defines from project.h
- *
- *    Revision 1.8  2001/11/30 23:35:51  jongfoster
- *    Renaming actionsfile to ijb.action
- *
- *    Revision 1.7  2001/11/13 00:28:24  jongfoster
- *    - Renaming parameters from edit-actions-for-url so that they only
- *      contain legal JavaScript characters.  If we wanted to write
- *      JavaScript that worked with Netscape 4, this is nessacery.
- *      (Note that at the moment the JavaScript doesn't actually work
- *      with Netscape 4, but now this is purely a template issue, not
- *      one affecting code).
- *    - Adding new CGIs for use by non-JavaScript browsers:
- *        edit-actions-url-form
- *        edit-actions-add-url-form
- *        edit-actions-remove-url-form
- *    - Fixing || bug.
- *
- *    Revision 1.6  2001/10/29 03:48:09  david__schmidt
- *    OS/2 native needed a snprintf() routine.  Added one to miscutil, brackedted
- *    by and __OS2__ ifdef.
- *
- *    Revision 1.5  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.4  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.3  2001/10/14 22:12:49  jongfoster
- *    New version of CGI-based actionsfile editor.
- *    Major changes, including:
- *    - Completely new file parser and file output routines
- *    - edit-actions CGI renamed edit-actions-for-url
- *    - All CGIs now need a filename parameter, except for...
- *    - New CGI edit-actions which doesn't need a filename,
- *      to allow you to start the editor up.
- *    - edit-actions-submit now works, and now automatically
- *      redirects you back to the main edit-actions-list handler.
- *
- *    Revision 1.2  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.1  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *
- **********************************************************************/
-\f
-
-#include "config.h"
-
-/*
- * FIXME: Following includes copied from cgi.c - which are actually needed?
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <ctype.h>
-#include <string.h>
-#include <assert.h>
-#include <limits.h>
-#include <sys/stat.h>
-
-#ifdef _WIN32
-#define snprintf _snprintf
-#endif /* def _WIN32 */
-
-#include "project.h"
-#include "cgi.h"
-#include "cgiedit.h"
-#include "cgisimple.h"
-#include "list.h"
-#include "encode.h"
-#include "actions.h"
-#include "miscutil.h"
-#include "errlog.h"
-#include "loaders.h"
-#include "loadcfg.h"
-/* loadcfg.h is for g_bToggleIJB only */
-#include "urlmatch.h"
-
-const char cgiedit_h_rcs[] = CGIEDIT_H_VERSION;
-
-
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-
-struct file_line
-{
-   struct file_line * next;
-   char * raw;
-   char * prefix;
-   char * unprocessed;
-   int type;
-
-   union
-   {
-      struct action_spec action[1];
-
-      struct
-      {
-         char * name;
-         char * svalue;
-         int ivalue;
-      } setting;
-
-      /* Add more data types here... e.g.
-
-
-      struct url_spec url[1];
-
-      struct
-      {
-         struct action_spec action[1];
-         const char * name;
-      } alias;
-
-      */
-
-   } data;
-};
-
-#define FILE_LINE_UNPROCESSED           1
-#define FILE_LINE_BLANK                 2
-#define FILE_LINE_ALIAS_HEADER          3
-#define FILE_LINE_ALIAS_ENTRY           4
-#define FILE_LINE_ACTION                5
-#define FILE_LINE_URL                   6
-#define FILE_LINE_SETTINGS_HEADER       7
-#define FILE_LINE_SETTINGS_ENTRY        8
-#define FILE_LINE_DESCRIPTION_HEADER    9
-#define FILE_LINE_DESCRIPTION_ENTRY    10
-
-
-struct editable_file
-{
-   struct file_line * lines;
-   const char * filename;     /* Full pathname - e.g. "/etc/privoxy/wibble.action" */
-   const char * identifier;   /* Filename stub - e.g. "wibble".  Use for CGI param. */
-                              /* Pre-encoded with url_encode() for ease of use. */
-   const char * version_str;  /* Last modification time, as a string.  For CGI param */
-                              /* Can be used in URL without using url_param(). */
-   unsigned version;          /* Last modification time - prevents chaos with
-                               * the browser's "back" button.  Note that this is a
-                               * time_t cast to an unsigned.  When comparing, always
-                               * cast the time_t to an unsigned, and *NOT* vice-versa.
-                               * This may lose the top few bits, but they're not
-                               * significant anyway.
-                               */
-   int newline;               /* Newline convention - one of the NEWLINE_xxx constants.
-                               * Note that changing this after the file has been
-                               * read in will cause a mess.
-                               */
-   struct file_line * parse_error; /* On parse error, this is the offending line. */
-   const char * parse_error_text;  /* On parse error, this is the problem.
-                                    * (Statically allocated) */
-};
-
-#define CGI_ACTION_PARAM_LEN_MAX 500
-
-/* FIXME: Following non-static functions should be prototyped in .h or made static */
-
-/* Functions to read and write arbitrary config files */
-jb_err edit_read_file(struct client_state *csp,
-                      const struct map *parameters,
-                      int require_version,
-                      const char *suffix,
-                      struct editable_file **pfile);
-jb_err edit_write_file(struct editable_file * file);
-void   edit_free_file(struct editable_file * file);
-
-/* Functions to read and write actions files */
-jb_err edit_parse_actions_file(struct editable_file * file);
-jb_err edit_read_actions_file(struct client_state *csp,
-                              struct http_response *rsp,
-                              const struct map *parameters,
-                              int require_version,
-                              struct editable_file **pfile);
-
-/* Error handlers */
-jb_err cgi_error_modified(struct client_state *csp,
-                          struct http_response *rsp,
-                          const char *filename);
-jb_err cgi_error_parse(struct client_state *csp,
-                       struct http_response *rsp,
-                       struct editable_file *file);
-jb_err cgi_error_file(struct client_state *csp,
-                      struct http_response *rsp,
-                      const char *filename);
-jb_err cgi_error_disabled(struct client_state *csp,
-                          struct http_response *rsp);
-
-/* Internal arbitrary config file support functions */
-static jb_err edit_read_file_lines(FILE *fp, struct file_line ** pfile, int *newline);
-static void edit_free_file_lines(struct file_line * first_line);
-
-/* Internal actions file support functions */
-static int match_actions_file_header_line(const char * line, const char * name);
-static jb_err split_line_on_equals(const char * line, char ** pname, char ** pvalue);
-
-/* Internal parameter parsing functions */
-static jb_err get_file_name_param(struct client_state *csp,
-                                  const struct map *parameters,
-                                  const char *param_name,
-                                  const char *suffix,
-                                  char **pfilename,
-                                  const char **pparam);
-static jb_err get_number_param(struct client_state *csp,
-                               const struct map *parameters,
-                               char *name,
-                               unsigned *pvalue);
-static jb_err get_url_spec_param(struct client_state *csp,
-                                 const struct map *parameters,
-                                 const char *name,
-                                 char **pvalue);
-static jb_err get_string_param(const struct map *parameters,
-                               const char *param_name,
-                               const char **pparam);
-
-/* Internal actionsfile <==> HTML conversion functions */
-static jb_err map_radio(struct map * exports,
-                        const char * optionname,
-                        const char * values,
-                        int value);
-static jb_err actions_to_radio(struct map * exports,
-                               const struct action_spec *action);
-static jb_err actions_from_radio(const struct map * parameters,
-                                 struct action_spec *action);
-
-
-static jb_err map_copy_parameter_html(struct map *out,
-                                      const struct map *in,
-                                      const char *name);
-#if 0 /* unused function */
-static jb_err map_copy_parameter_url(struct map *out,
-                                     const struct map *in,
-                                     const char *name);
-#endif /* unused function */
-
-/*********************************************************************
- *
- * Function    :  map_copy_parameter_html
- *
- * Description :  Copy a CGI parameter from one map to another, HTML
- *                encoding it.
- *
- * Parameters  :
- *          1  :  out = target map
- *          2  :  in = source map
- *          3  :  name = name of cgi parameter to copy
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter doesn't exist
- *                                  in the source map
- *
- *********************************************************************/
-static jb_err map_copy_parameter_html(struct map *out,
-                                      const struct map *in,
-                                      const char *name)
-{
-   const char * value;
-   jb_err err;
-
-   assert(out);
-   assert(in);
-   assert(name);
-
-   value = lookup(in, name);
-   err = map(out, name, 1, html_encode(value), 0);
-
-   if (err)
-   {
-      /* Out of memory */
-      return err;
-   }
-   else if (*value == '\0')
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-   else
-   {
-      return JB_ERR_OK;
-   }
-}
-
-
-#if 0 /* unused function */
-/*********************************************************************
- *
- * Function    :  map_copy_parameter_html
- *
- * Description :  Copy a CGI parameter from one map to another, URL
- *                encoding it.
- *
- * Parameters  :
- *          1  :  out = target map
- *          2  :  in = source map
- *          3  :  name = name of cgi parameter to copy
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter doesn't exist
- *                                  in the source map
- *
- *********************************************************************/
-static jb_err map_copy_parameter_url(struct map *out,
-                                     const struct map *in,
-                                     const char *name)
-{
-   const char * value;
-   jb_err err;
-
-   assert(out);
-   assert(in);
-   assert(name);
-
-   value = lookup(in, name);
-   err = map(out, name, 1, url_encode(value), 0);
-
-   if (err)
-   {
-      /* Out of memory */
-      return err;
-   }
-   else if (*value == '\0')
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-   else
-   {
-      return JB_ERR_OK;
-   }
-}
-#endif /* 0 - unused function */
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_url_form
- *
- * Description :  CGI function that displays a form for
- *                edit-actions-url
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           p : (pattern) Line number of pattern to edit
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_url_form(struct client_state *csp,
-                                 struct http_response *rsp,
-                                 const struct map *parameters)
-{
-   struct map * exports;
-   unsigned patternid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != patternid)
-     || (patternid < 1)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-   if (!err) err = map(exports, "p", 1, url_encode(lookup(parameters, "p")), 0);
-   if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0);
-
-   edit_free_file(file);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-url-form", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_add_url_form
- *
- * Description :  CGI function that displays a form for
- *                edit-actions-url
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           s : (section) Line number of section to edit
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_add_url_form(struct client_state *csp,
-                                     struct http_response *rsp,
-                                     const struct map *parameters)
-{
-   struct map *exports;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map_copy_parameter_html(exports, parameters, "f");
-   if (!err) err = map_copy_parameter_html(exports, parameters, "v");
-   if (!err) err = map_copy_parameter_html(exports, parameters, "s");
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-add-url-form", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_remove_url_form
- *
- * Description :  CGI function that displays a form for
- *                edit-actions-url
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           p : (pattern) Line number of pattern to edit
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_remove_url_form(struct client_state *csp,
-                                     struct http_response *rsp,
-                                     const struct map *parameters)
-{
-   struct map * exports;
-   unsigned patternid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != patternid)
-     || (patternid < 1)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-   if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0);
-   if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0);
-
-   edit_free_file(file);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-remove-url-form", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_write_file
- *
- * Description :  Write a complete file to disk.
- *
- * Parameters  :
- *          1  :  filename = File to write to.
- *          2  :  file = Data structure to write.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_FILE   on error writing to file.
- *                JB_ERR_MEMORY on out of memory
- *
- *********************************************************************/
-jb_err edit_write_file(struct editable_file * file)
-{
-   FILE * fp;
-   struct file_line * cur_line;
-   struct stat statbuf[1];
-   char version_buf[22]; /* 22 = ceil(log10(2^64)) + 2 = max number of
-                            digits in time_t, assuming this is a 64-bit
-                            machine, plus null terminator, plus one
-                            for paranoia */
-
-   assert(file);
-   assert(file->filename);
-
-#if defined(AMIGA) || defined(__OS2__)
-   if (NULL == (fp = fopen(file->filename, "w")))
-#else
-   if (NULL == (fp = fopen(file->filename, "wt")))
-#endif /* def AMIGA */
-   {
-      return JB_ERR_FILE;
-   }
-
-   cur_line = file->lines;
-   while (cur_line != NULL)
-   {
-      if (cur_line->raw)
-      {
-         if (fputs(cur_line->raw, fp) < 0)
-         {
-            fclose(fp);
-            return JB_ERR_FILE;
-         }
-      }
-      else
-      {
-         if (cur_line->prefix)
-         {
-            if (fputs(cur_line->prefix, fp) < 0)
-            {
-               fclose(fp);
-               return JB_ERR_FILE;
-            }
-         }
-         if (cur_line->unprocessed)
-         {
-            /* This should be a single line - sanity check. */
-            assert(NULL == strchr(cur_line->unprocessed, '\r'));
-            assert(NULL == strchr(cur_line->unprocessed, '\n'));
-
-            if (NULL != strchr(cur_line->unprocessed, '#'))
-            {
-               /* Must quote '#' characters */
-               int numhash = 0;
-               int len;
-               char * src;
-               char * dest;
-               char * str;
-
-               /* Count number of # characters, so we know length of output string */
-               src = cur_line->unprocessed;
-               while (NULL != (src = strchr(src, '#')))
-               {
-                  numhash++;
-                  src++;
-               }
-               assert(numhash > 0);
-
-               /* Allocate new memory for string */
-               len = strlen(cur_line->unprocessed);
-               if (NULL == (str = malloc((size_t) len + 1 + numhash)))
-               {
-                  /* Uh oh, just trashed file! */
-                  fclose(fp);
-                  return JB_ERR_MEMORY;
-               }
-
-               /* Loop through string from end */
-               src  = cur_line->unprocessed + len;
-               dest = str + len + numhash;
-               for ( ; len >= 0; len--)
-               {
-                  if ((*dest-- = *src--) == '#')
-                  {
-                     *dest-- = '\\';
-                     numhash--;
-                     assert(numhash >= 0);
-                  }
-               }
-               assert(numhash == 0);
-               assert(src  + 1 == cur_line->unprocessed);
-               assert(dest + 1 == str);
-
-               if (fputs(str, fp) < 0)
-               {
-                  free(str);
-                  fclose(fp);
-                  return JB_ERR_FILE;
-               }
-
-               free(str);
-            }
-            else
-            {
-               /* Can write without quoting '#' characters. */
-               if (fputs(cur_line->unprocessed, fp) < 0)
-               {
-                  fclose(fp);
-                  return JB_ERR_FILE;
-               }
-            }
-            if (fputs(NEWLINE(file->newline), fp) < 0)
-            {
-               fclose(fp);
-               return JB_ERR_FILE;
-            }
-         }
-         else
-         {
-            /* FIXME: Write data from file->data->whatever */
-            assert(0);
-         }
-      }
-      cur_line = cur_line->next;
-   }
-
-   fclose(fp);
-
-
-   /* Update the version stamp in the file structure, since we just
-    * wrote to the file & changed it's date.
-    */
-   if (stat(file->filename, statbuf) < 0)
-   {
-      /* Error, probably file not found. */
-      return JB_ERR_FILE;
-   }
-   file->version = (unsigned)statbuf->st_mtime;
-
-   /* Correct file->version_str */
-   freez(file->version_str);
-   snprintf(version_buf, 22, "%u", file->version);
-   version_buf[21] = '\0';
-   file->version_str = strdup(version_buf);
-   if (version_buf == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_free_file
- *
- * Description :  Free a complete file in memory.
- *
- * Parameters  :
- *          1  :  file = Data structure to free.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void edit_free_file(struct editable_file * file)
-{
-   if (!file)
-   {
-      /* Silently ignore NULL pointer */
-      return;
-   }
-
-   edit_free_file_lines(file->lines);
-   freez(file->filename);
-   freez(file->identifier);
-   freez(file->version_str);
-   file->version = 0;
-   file->parse_error_text = NULL; /* Statically allocated */
-   file->parse_error = NULL;
-
-   free(file);
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_free_file
- *
- * Description :  Free an entire linked list of file lines.
- *
- * Parameters  :
- *          1  :  first_line = Data structure to free.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-static void edit_free_file_lines(struct file_line * first_line)
-{
-   struct file_line * next_line;
-
-   while (first_line != NULL)
-   {
-      next_line = first_line->next;
-      first_line->next = NULL;
-      freez(first_line->raw);
-      freez(first_line->prefix);
-      freez(first_line->unprocessed);
-      switch(first_line->type)
-      {
-         case 0: /* special case if memory zeroed */
-         case FILE_LINE_UNPROCESSED:
-         case FILE_LINE_BLANK:
-         case FILE_LINE_ALIAS_HEADER:
-         case FILE_LINE_SETTINGS_HEADER:
-         case FILE_LINE_DESCRIPTION_HEADER:
-         case FILE_LINE_DESCRIPTION_ENTRY:
-         case FILE_LINE_ALIAS_ENTRY:
-         case FILE_LINE_URL:
-            /* No data is stored for these */
-            break;
-
-         case FILE_LINE_ACTION:
-            free_action(first_line->data.action);
-            break;
-
-         case FILE_LINE_SETTINGS_ENTRY:
-            freez(first_line->data.setting.name);
-            freez(first_line->data.setting.svalue);
-            break;
-         default:
-            /* Should never happen */
-            assert(0);
-            break;
-      }
-      first_line->type = 0; /* paranoia */
-      free(first_line);
-      first_line = next_line;
-   }
-}
-
-
-/*********************************************************************
- *
- * Function    :  match_actions_file_header_line
- *
- * Description :  Match an actions file {{header}} line
- *
- * Parameters  :
- *          1  :  line = String from file
- *          2  :  name = Header to match against
- *
- * Returns     :  0 iff they match.
- *
- *********************************************************************/
-static int match_actions_file_header_line(const char * line, const char * name)
-{
-   size_t len;
-
-   assert(line);
-   assert(name);
-
-   /* Look for "{{" */
-   if ((line[0] != '{') || (line[1] != '{'))
-   {
-      return 1;
-   }
-   line += 2;
-
-   /* Look for optional whitespace */
-   while ( (*line == ' ') || (*line == '\t') )
-   {
-      line++;
-   }
-
-   /* Look for the specified name (case-insensitive) */
-   len = strlen(name);
-   if (0 != strncmpic(line, name, len))
-   {
-      return 1;
-   }
-   line += len;
-
-   /* Look for optional whitespace */
-   while ( (*line == ' ') || (*line == '\t') )
-   {
-      line++;
-   }
-
-   /* Look for "}}" and end of string*/
-   if ((line[0] != '}') || (line[1] != '}') || (line[2] != '\0'))
-   {
-      return 1;
-   }
-
-   /* It matched!! */
-   return 0;
-}
-
-
-/*********************************************************************
- *
- * Function    :  match_actions_file_header_line
- *
- * Description :  Match an actions file {{header}} line
- *
- * Parameters  :
- *          1  :  line = String from file.  Must not start with
- *                       whitespace (else infinite loop!)
- *          2  :  name = Destination for name
- *          2  :  name = Destination for value
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_PARSE  if there's no "=" sign, or if there's
- *                              nothing before the "=" sign (but empty
- *                              values *after* the "=" sign are legal).
- *
- *********************************************************************/
-static jb_err split_line_on_equals(const char * line, char ** pname, char ** pvalue)
-{
-   const char * name_end;
-   const char * value_start;
-   size_t name_len;
-
-   assert(line);
-   assert(pname);
-   assert(pvalue);
-   assert(*line != ' ');
-   assert(*line != '\t');
-
-   *pname = NULL;
-   *pvalue = NULL;
-
-   value_start = strchr(line, '=');
-   if ((value_start == NULL) || (value_start == line))
-   {
-      return JB_ERR_PARSE;
-   }
-
-   name_end = value_start - 1;
-
-   /* Eat any whitespace before the '=' */
-   while ((*name_end == ' ') || (*name_end == '\t'))
-   {
-      /*
-       * we already know we must have at least 1 non-ws char
-       * at start of buf - no need to check
-       */
-      name_end--;
-   }
-
-   name_len = name_end - line + 1; /* Length excluding \0 */
-   if (NULL == (*pname = (char *) malloc(name_len + 1)))
-   {
-      return JB_ERR_MEMORY;
-   }
-   strncpy(*pname, line, name_len);
-   (*pname)[name_len] = '\0';
-
-   /* Eat any the whitespace after the '=' */
-   value_start++;
-   while ((*value_start == ' ') || (*value_start == '\t'))
-   {
-      value_start++;
-   }
-
-   if (NULL == (*pvalue = strdup(value_start)))
-   {
-      free(*pname);
-      *pname = NULL;
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_parse_actions_file
- *
- * Description :  Parse an actions file in memory.
- *
- *                Passed linked list must have the "data" member
- *                zeroed, and must contain valid "next" and
- *                "unprocessed" fields.  The "raw" and "prefix"
- *                fields are ignored, and "type" is just overwritten.
- *
- *                Note that on error the file may have been
- *                partially parsed.
- *
- * Parameters  :
- *          1  :  file = Actions file to be parsed in-place.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_PARSE  on error
- *
- *********************************************************************/
-jb_err edit_parse_actions_file(struct editable_file * file)
-{
-   struct file_line * cur_line;
-   size_t len;
-   const char * text; /* Text from a line */
-   char * name;  /* For lines of the form name=value */
-   char * value; /* For lines of the form name=value */
-   struct action_alias * alias_list = NULL;
-   jb_err err = JB_ERR_OK;
-
-   /* alias_list contains the aliases defined in this file.
-    * It might be better to use the "file_line.data" fields
-    * in the relavent places instead.
-    */
-
-   cur_line = file->lines;
-
-   /* A note about blank line support: Blank lines should only
-    * ever occur as the last line in the file.  This function
-    * is more forgiving than that - FILE_LINE_BLANK can occur
-    * anywhere.
-    */
-
-   /* Skip leading blanks.  Should only happen if file is
-    * empty (which is valid, but pointless).
-    */
-   while ( (cur_line != NULL)
-        && (cur_line->unprocessed[0] == '\0') )
-   {
-      /* Blank line */
-      cur_line->type = FILE_LINE_BLANK;
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line != NULL)
-     && (cur_line->unprocessed[0] != '{') )
-   {
-      /* File doesn't start with a header */
-      file->parse_error = cur_line;
-      file->parse_error_text = "First (non-comment) line of the file must contain a header.";
-      return JB_ERR_PARSE;
-   }
-
-   if ( (cur_line != NULL) && (0 ==
-      match_actions_file_header_line(cur_line->unprocessed, "settings") ) )
-   {
-      cur_line->type = FILE_LINE_SETTINGS_HEADER;
-
-      cur_line = cur_line->next;
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            cur_line->type = FILE_LINE_SETTINGS_ENTRY;
-
-            err = split_line_on_equals(cur_line->unprocessed,
-                     &cur_line->data.setting.name,
-                     &cur_line->data.setting.svalue);
-            if (err == JB_ERR_MEMORY)
-            {
-               return err;
-            }
-            else if (err != JB_ERR_OK)
-            {
-               /* Line does not contain a name=value pair */
-               file->parse_error = cur_line;
-               file->parse_error_text = "Expected a name=value pair on this {{description}} line, but couldn't find one.";
-               return JB_ERR_PARSE;
-            }
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   }
-
-   if ( (cur_line != NULL) && (0 ==
-      match_actions_file_header_line(cur_line->unprocessed, "description") ) )
-   {
-      cur_line->type = FILE_LINE_DESCRIPTION_HEADER;
-
-      cur_line = cur_line->next;
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            cur_line->type = FILE_LINE_DESCRIPTION_ENTRY;
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   }
-
-   if ( (cur_line != NULL) && (0 ==
-      match_actions_file_header_line(cur_line->unprocessed, "alias") ) )
-   {
-      cur_line->type = FILE_LINE_ALIAS_HEADER;
-
-      cur_line = cur_line->next;
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            /* define an alias */
-            struct action_alias * new_alias;
-
-            cur_line->type = FILE_LINE_ALIAS_ENTRY;
-
-            err = split_line_on_equals(cur_line->unprocessed, &name, &value);
-            if (err == JB_ERR_MEMORY)
-            {
-               return err;
-            }
-            else if (err != JB_ERR_OK)
-            {
-               /* Line does not contain a name=value pair */
-               file->parse_error = cur_line;
-               file->parse_error_text = "Expected a name=value pair on this {{alias}} line, but couldn't find one.";
-               return JB_ERR_PARSE;
-            }
-
-            if ((new_alias = zalloc(sizeof(*new_alias))) == NULL)
-            {
-               /* Out of memory */
-               free(name);
-               free(value);
-               free_alias_list(alias_list);
-               return JB_ERR_MEMORY;
-            }
-
-            err = get_actions(value, alias_list, new_alias->action);
-            if (err)
-            {
-               /* Invalid action or out of memory */
-               free(name);
-               free(value);
-               free(new_alias);
-               free_alias_list(alias_list);
-               if (err == JB_ERR_MEMORY)
-               {
-                  return err;
-               }
-               else
-               {
-                  /* Line does not contain a name=value pair */
-                  file->parse_error = cur_line;
-                  file->parse_error_text = "This alias does not specify a valid set of actions.";
-                  return JB_ERR_PARSE;
-               }
-            }
-
-            free(value);
-
-            new_alias->name = name;
-
-            /* add to list */
-            new_alias->next = alias_list;
-            alias_list = new_alias;
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   }
-
-   /* Header done, process the main part of the file */
-   while (cur_line != NULL)
-   {
-      /* At this point, (cur_line->unprocessed[0] == '{') */
-      assert(cur_line->unprocessed[0] == '{');
-      text = cur_line->unprocessed + 1;
-      len = strlen(text) - 1;
-      if (text[len] != '}')
-      {
-         /* No closing } on header */
-         free_alias_list(alias_list);
-         file->parse_error = cur_line;
-         file->parse_error_text = "Headers starting with '{' must have a "
-            "closing bracket ('}').  Headers starting with two brackets ('{{') "
-            "must close with two brackets ('}}').";
-         return JB_ERR_PARSE;
-      }
-
-      if (text[0] == '{')
-      {
-         /* An invalid {{ header.  */
-         free_alias_list(alias_list);
-         file->parse_error = cur_line;
-         file->parse_error_text = "Unknown or unexpected two-bracket header.  "
-            "Please remember that the system (two-bracket) headers must "
-            "appear in the order {{settings}}, {{description}}, {{alias}}, "
-            "and must appear before any actions (one-bracket) headers.  "
-            "Also note that system headers may not be repeated.";
-         return JB_ERR_PARSE;
-      }
-
-      while ( (*text == ' ') || (*text == '\t') )
-      {
-         text++;
-         len--;
-      }
-      while ( (len > 0)
-           && ( (text[len - 1] == ' ')
-             || (text[len - 1] == '\t') ) )
-      {
-         len--;
-      }
-
-      cur_line->type = FILE_LINE_ACTION;
-
-      /* Remove {} and make copy */
-      if (NULL == (value = (char *) malloc(len + 1)))
-      {
-         /* Out of memory */
-         free_alias_list(alias_list);
-         return JB_ERR_MEMORY;
-      }
-      strncpy(value, text, len);
-      value[len] = '\0';
-
-      /* Get actions */
-      err = get_actions(value, alias_list, cur_line->data.action);
-      if (err)
-      {
-         /* Invalid action or out of memory */
-         free(value);
-         free_alias_list(alias_list);
-         if (err == JB_ERR_MEMORY)
-         {
-            return err;
-         }
-         else
-         {
-            /* Line does not contain a name=value pair */
-            file->parse_error = cur_line;
-            file->parse_error_text = "This header does not specify a valid set of actions.";
-            return JB_ERR_PARSE;
-         }
-      }
-
-      /* Done with string - it was clobbered anyway */
-      free(value);
-
-      /* Process next line */
-      cur_line = cur_line->next;
-
-      /* Loop processing URL patterns */
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            /* Could parse URL here, but this isn't currently needed */
-
-            cur_line->type = FILE_LINE_URL;
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   } /* End main while(cur_line != NULL) loop */
-
-   free_alias_list(alias_list);
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_read_file_lines
- *
- * Description :  Read all the lines of a file into memory.
- *                Handles whitespace, comments and line continuation.
- *
- * Parameters  :
- *          1  :  fp = File to read from.  On return, this will be
- *                     at EOF but it will not have been closed.
- *          2  :  pfile = Destination for a linked list of file_lines.
- *                        Will be set to NULL on error.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-jb_err edit_read_file_lines(FILE *fp, struct file_line ** pfile, int *newline)
-{
-   struct file_line * first_line; /* Keep for return value or to free */
-   struct file_line * cur_line;   /* Current line */
-   struct file_line * prev_line;  /* Entry with prev_line->next = cur_line */
-   jb_err rval;
-
-   assert(fp);
-   assert(pfile);
-
-   *pfile = NULL;
-
-   cur_line = first_line = zalloc(sizeof(struct file_line));
-   if (cur_line == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   cur_line->type = FILE_LINE_UNPROCESSED;
-
-   rval = edit_read_line(fp, &cur_line->raw, &cur_line->prefix, &cur_line->unprocessed, newline, NULL);
-   if (rval)
-   {
-      /* Out of memory or empty file. */
-      /* Note that empty file is not an error we propogate up */
-      free(cur_line);
-      return ((rval == JB_ERR_FILE) ? JB_ERR_OK : rval);
-   }
-
-   do
-   {
-      prev_line = cur_line;
-      cur_line = prev_line->next = zalloc(sizeof(struct file_line));
-      if (cur_line == NULL)
-      {
-         /* Out of memory */
-         edit_free_file_lines(first_line);
-         return JB_ERR_MEMORY;
-      }
-
-      cur_line->type = FILE_LINE_UNPROCESSED;
-
-      rval = edit_read_line(fp, &cur_line->raw, &cur_line->prefix, &cur_line->unprocessed, newline, NULL);
-      if ((rval != JB_ERR_OK) && (rval != JB_ERR_FILE))
-      {
-         /* Out of memory */
-         edit_free_file_lines(first_line);
-         return JB_ERR_MEMORY;
-      }
-
-   }
-   while (rval != JB_ERR_FILE);
-
-   /* EOF */
-
-   /* We allocated one too many - free it */
-   prev_line->next = NULL;
-   free(cur_line);
-
-   *pfile = first_line;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_read_file
- *
- * Description :  Read a complete file into memory.
- *                Handles CGI parameter parsing.  If requested, also
- *                checks the file's modification timestamp.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters.
- *          3  :  require_version = true to check "ver" parameter.
- *          4  :  suffix = File extension, e.g. ".action".
- *          5  :  pfile = Destination for the file.  Will be set
- *                        to NULL on error.
- *
- * CGI Parameters :
- *    filename :  The name of the file to read, without the
- *                path or ".action" extension.
- *         ver :  (Only if require_version is nonzero)
- *                Timestamp of the actions file.  If wrong, this
- *                function fails with JB_ERR_MODIFIED.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *                JB_ERR_FILE   if the file cannot be opened or
- *                              contains no data
- *                JB_ERR_MODIFIED if version checking was requested and
- *                                failed - the file was modified outside
- *                                of this CGI editor instance.
- *
- *********************************************************************/
-jb_err edit_read_file(struct client_state *csp,
-                      const struct map *parameters,
-                      int require_version,
-                      const char *suffix,
-                      struct editable_file **pfile)
-{
-   struct file_line * lines;
-   FILE * fp;
-   jb_err err;
-   char * filename;
-   const char * identifier;
-   struct editable_file * file;
-   unsigned version = 0;
-   struct stat statbuf[1];
-   char version_buf[22];
-   int newline = NEWLINE_UNKNOWN;
-
-   assert(csp);
-   assert(parameters);
-   assert(pfile);
-
-   *pfile = NULL;
-
-   err = get_file_name_param(csp, parameters, "f", suffix,
-                             &filename, &identifier);
-   if (err)
-   {
-      return err;
-   }
-
-   if (stat(filename, statbuf) < 0)
-   {
-      /* Error, probably file not found. */
-      free(filename);
-      return JB_ERR_FILE;
-   }
-   version = (unsigned) statbuf->st_mtime;
-
-   if (require_version)
-   {
-      unsigned specified_version;
-      err = get_number_param(csp, parameters, "v", &specified_version);
-      if (err)
-      {
-         free(filename);
-         return err;
-      }
-
-      if (version != specified_version)
-      {
-         return JB_ERR_MODIFIED;
-      }
-   }
-
-#if defined(AMIGA) || defined(__OS2__)
-   if (NULL == (fp = fopen(filename,"r")))
-#else
-   if (NULL == (fp = fopen(filename,"rt")))
-#endif /* def AMIGA */
-   {
-      free(filename);
-      return JB_ERR_FILE;
-   }
-
-   err = edit_read_file_lines(fp, &lines, &newline);
-
-   fclose(fp);
-
-   if (err)
-   {
-      free(filename);
-      return err;
-   }
-
-   file = (struct editable_file *) zalloc(sizeof(*file));
-   if (err)
-   {
-      free(filename);
-      edit_free_file_lines(lines);
-      return err;
-   }
-
-   file->lines = lines;
-   file->newline = newline;
-   file->filename = filename;
-   file->version = version;
-   file->identifier = url_encode(identifier);
-
-   if (file->identifier == NULL)
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Correct file->version_str */
-   freez(file->version_str);
-   snprintf(version_buf, 22, "%u", file->version);
-   version_buf[21] = '\0';
-   file->version_str = strdup(version_buf);
-   if (version_buf == NULL)
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   *pfile = file;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_read_actions_file
- *
- * Description :  Read a complete actions file into memory.
- *                Handles CGI parameter parsing.  If requested, also
- *                checks the file's modification timestamp.
- *
- *                If this function detects an error in the categories
- *                JB_ERR_FILE, JB_ERR_MODIFIED, or JB_ERR_PARSE,
- *                then it handles it by filling in the specified
- *                response structure and returning JB_ERR_FILE.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = HTTP response.  Only filled in on error.
- *          2  :  parameters = map of cgi parameters.
- *          3  :  require_version = true to check "ver" parameter.
- *          4  :  pfile = Destination for the file.  Will be set
- *                        to NULL on error.
- *
- * CGI Parameters :
- *    filename :  The name of the actions file to read, without the
- *                path or ".action" extension.
- *         ver :  (Only if require_version is nonzero)
- *                Timestamp of the actions file.  If wrong, this
- *                function fails with JB_ERR_MODIFIED.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *                JB_ERR_FILE  if the file does not contain valid data,
- *                             or if file cannot be opened or
- *                             contains no data, or if version
- *                             checking was requested and failed.
- *
- *********************************************************************/
-jb_err edit_read_actions_file(struct client_state *csp,
-                              struct http_response *rsp,
-                              const struct map *parameters,
-                              int require_version,
-                              struct editable_file **pfile)
-{
-   jb_err err;
-   struct editable_file *file;
-
-   assert(csp);
-   assert(parameters);
-   assert(pfile);
-
-   *pfile = NULL;
-
-   err = edit_read_file(csp, parameters, require_version, ".action", &file);
-   if (err)
-   {
-      /* Try to handle if possible */
-      if (err == JB_ERR_FILE)
-      {
-         err = cgi_error_file(csp, rsp, lookup(parameters, "f"));
-      }
-      else if (err == JB_ERR_MODIFIED)
-      {
-         err = cgi_error_modified(csp, rsp, lookup(parameters, "f"));
-      }
-      if (err == JB_ERR_OK)
-      {
-         /*
-          * Signal to higher-level CGI code that there was a problem but we
-          * handled it, they should just return JB_ERR_OK.
-          */
-         err = JB_ERR_FILE;
-      }
-      return err;
-   }
-
-   err = edit_parse_actions_file(file);
-   if (err)
-   {
-      if (err == JB_ERR_PARSE)
-      {
-         err = cgi_error_parse(csp, rsp, file);
-         if (err == JB_ERR_OK)
-         {
-            /*
-             * Signal to higher-level CGI code that there was a problem but we
-             * handled it, they should just return JB_ERR_OK.
-             */
-            err = JB_ERR_FILE;
-         }
-      }
-      edit_free_file(file);
-      return err;
-   }
-
-   *pfile = file;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_file_name_param
- *
- * Description :  Get the name of the file to edit from the parameters
- *                passed to a CGI function.  This function handles
- *                security checks such as blocking urls containing
- *                "/" or ".", prepending the config file directory,
- *                and adding the specified suffix.
- *
- *                (This is an essential security check, otherwise
- *                users may be able to pass "../../../etc/passwd"
- *                and overwrite the password file [linux], "prn:"
- *                and print random data [Windows], etc...)
- *
- *                This function only allows filenames contining the
- *                characters '-', '_', 'A'-'Z', 'a'-'z', and '0'-'9'.
- *                That's probably too restrictive but at least it's
- *                secure.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters
- *          3  :  param_name = The name of the parameter to read
- *          4  :  suffix = File extension, e.g. ".actions"
- *          5  :  pfilename = destination for full filename.  Caller
- *                free()s.  Set to NULL on error.
- *          6  :  pparam = destination for partial filename,
- *                suitable for use in another URL.  Allocated as part
- *                of the map "parameters", so don't free it.
- *                Set to NULL if not specified.
- *
- * Returns     :  JB_ERR_OK         on success
- *                JB_ERR_MEMORY     on out-of-memory
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-static jb_err get_file_name_param(struct client_state *csp,
-                                  const struct map *parameters,
-                                  const char *param_name,
-                                  const char *suffix,
-                                  char **pfilename,
-                                  const char **pparam)
-{
-   const char *param;
-   const char *s;
-#if 0 /* Patch to make 3.0.0 work properly. */
-   char *name;
-#endif /* 0 - Patch to make 3.0.0 work properly. */
-   char *fullpath;
-   char ch;
-   int len;
-
-   assert(csp);
-   assert(parameters);
-   assert(suffix);
-   assert(pfilename);
-   assert(pparam);
-
-   *pfilename = NULL;
-   *pparam = NULL;
-
-   param = lookup(parameters, param_name);
-   if (!*param)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   *pparam = param;
-
-   len = strlen(param);
-   if (len >= FILENAME_MAX)
-   {
-      /* Too long. */
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Check every character to see if it's legal */
-   s = param;
-   while ((ch = *s++) != '\0')
-   {
-      if ( ((ch < 'A') || (ch > 'Z'))
-        && ((ch < 'a') || (ch > 'z'))
-        && ((ch < '0') || (ch > '9'))
-        && (ch != '-')
-        && (ch != '_') )
-      {
-         /* Probable hack attempt. */
-         return JB_ERR_CGI_PARAMS;
-      }
-   }
-
-   /*
-    * FIXME Following is a hack to make 3.0.0 work properly.
-    * Change "#if 0" --> "#if 1" below when we have modular action
-    * files.
-    *    -- Jon
-    */
-#if 0 /* Patch to make 3.0.0 work properly. */
-   /* Append extension */
-   name = malloc(len + strlen(suffix) + 1);
-   if (name == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-   strcpy(name, param);
-   strcpy(name + len, suffix);
-
-   /* Prepend path */
-   fullpath = make_path(csp->config->confdir, name);
-   free(name);
-#else /* 1 - Patch to make 3.0.0 work properly. */
-   if ((csp->actions_list == NULL)
-    || (csp->actions_list->filename == NULL))
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   fullpath = ( (csp->actions_list && csp->actions_list->filename)
-             ? strdup(csp->actions_list->filename) : NULL);
-#endif /* 1 - Patch to make 3.0.0 work properly. */
-   if (fullpath == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   /* Success */
-   *pfilename = fullpath;
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_char_param
- *
- * Description :  Get a single-character parameter passed to a CGI
- *                function.
- *
- * Parameters  :
- *          1  :  parameters = map of cgi parameters
- *          2  :  param_name = The name of the parameter to read
- *
- * Returns     :  Uppercase character on success, '\0' on error.
- *
- *********************************************************************/
-static char get_char_param(const struct map *parameters,
-                           const char *param_name)
-{
-   char ch;
-
-   assert(parameters);
-   assert(param_name);
-
-   ch = *(lookup(parameters, param_name));
-   if ((ch >= 'a') && (ch <= 'z'))
-   {
-      ch = ch - 'a' + 'A';
-   }
-
-   return ch;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_string_param
- *
- * Description :  Get a string paramater, to be used as an
- *                ACTION_STRING or ACTION_MULTI paramater.
- *                Validates the input to prevent stupid/malicious
- *                users from corrupting their action file.
- *
- * Parameters  :
- *          1  :  parameters = map of cgi parameters
- *          2  :  param_name = The name of the parameter to read
- *          3  :  pparam = destination for paramater.  Allocated as
- *                part of the map "parameters", so don't free it.
- *                Set to NULL if not specified.
- *
- * Returns     :  JB_ERR_OK         on success, or if the paramater
- *                                  was not specified.
- *                JB_ERR_MEMORY     on out-of-memory.
- *                JB_ERR_CGI_PARAMS if the paramater is not valid.
- *
- *********************************************************************/
-static jb_err get_string_param(const struct map *parameters,
-                               const char *param_name,
-                               const char **pparam)
-{
-   const char *param;
-   const char *s;
-   char ch;
-
-   assert(parameters);
-   assert(param_name);
-   assert(pparam);
-
-   *pparam = NULL;
-
-   param = lookup(parameters, param_name);
-   if (!*param)
-   {
-      return JB_ERR_OK;
-   }
-
-   if (strlen(param) >= CGI_ACTION_PARAM_LEN_MAX)
-   {
-      /*
-       * Too long.
-       *
-       * Note that the length limit is arbitrary, it just seems
-       * sensible to limit it to *something*.  There's no
-       * technical reason for any limit at all.
-       */
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Check every character to see if it's legal */
-   s = param;
-   while ((ch = *s++) != '\0')
-   {
-      if ( ((unsigned char)ch < (unsigned char)' ')
-        || (ch == '}') )
-      {
-         /* Probable hack attempt, or user accidentally used '}'. */
-         return JB_ERR_CGI_PARAMS;
-      }
-   }
-
-   /* Success */
-   *pparam = param;
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_number_param
- *
- * Description :  Get a non-negative integer from the parameters
- *                passed to a CGI function.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters
- *          3  :  name = Name of CGI parameter to read
- *          4  :  pvalue = destination for value.
- *                         Set to -1 on error.
- *
- * Returns     :  JB_ERR_OK         on success
- *                JB_ERR_MEMORY     on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-static jb_err get_number_param(struct client_state *csp,
-                               const struct map *parameters,
-                               char *name,
-                               unsigned *pvalue)
-{
-   const char *param;
-   char ch;
-   unsigned value;
-
-   assert(csp);
-   assert(parameters);
-   assert(name);
-   assert(pvalue);
-
-   *pvalue = 0; 
-
-   param = lookup(parameters, name);
-   if (!*param)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* We don't use atoi because I want to check this carefully... */
-
-   value = 0;
-   while ((ch = *param++) != '\0')
-   {
-      if ((ch < '0') || (ch > '9'))
-      {
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      ch -= '0';
-
-      /* Note:
-       *
-       * <limits.h> defines UINT_MAX
-       *
-       * (UINT_MAX - ch) / 10 is the largest number that
-       *     can be safely multiplied by 10 then have ch added.
-       */
-      if (value > ((UINT_MAX - (unsigned)ch) / 10U))
-      {
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      value = value * 10 + ch;
-   }
-
-   /* Success */
-   *pvalue = value;
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_url_spec_param
- *
- * Description :  Get a URL pattern from the parameters
- *                passed to a CGI function.  Removes leading/trailing
- *                spaces and validates it.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters
- *          3  :  name = Name of CGI parameter to read
- *          4  :  pvalue = destination for value.  Will be malloc()'d.
- *                         Set to NULL on error.
- *
- * Returns     :  JB_ERR_OK         on success
- *                JB_ERR_MEMORY     on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-static jb_err get_url_spec_param(struct client_state *csp,
-                                 const struct map *parameters,
-                                 const char *name,
-                                 char **pvalue)
-{
-   const char *orig_param;
-   char *param;
-   char *s;
-   struct url_spec compiled[1];
-   jb_err err;
-
-   assert(csp);
-   assert(parameters);
-   assert(name);
-   assert(pvalue);
-
-   *pvalue = NULL;
-
-   orig_param = lookup(parameters, name);
-   if (!*orig_param)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Copy and trim whitespace */
-   param = strdup(orig_param);
-   if (param == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-   chomp(param);
-
-   /* Must be non-empty, and can't allow 1st character to be '{' */
-   if (param[0] == '\0' || param[0] == '{')
-   {
-      free(param);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Check for embedded newlines */
-   for (s = param; *s != '\0'; s++)
-   {
-      if ((*s == '\r') || (*s == '\n'))
-      {
-         free(param);
-         return JB_ERR_CGI_PARAMS;
-      }
-   }
-
-   /* Check that regex is valid */
-   s = strdup(param);
-   if (s == NULL)
-   {
-      free(param);
-      return JB_ERR_MEMORY;
-   }
-   err = create_url_spec(compiled, s);
-   free(s);
-   if (err)
-   {
-      free(param);
-      return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS;
-   }
-   free_url_spec(compiled);
-
-   if (param[strlen(param) - 1] == '\\')
-   {
-      /*
-       * Must protect trailing '\\' from becoming line continuation character.
-       * Two methods: 1) If it's a domain only, add a trailing '/'.
-       * 2) For path, add the do-nothing PCRE expression (?:) to the end
-       */
-      if (strchr(param, '/') == NULL)
-      {
-         err = string_append(&param, "/");
-      }
-      else
-      {
-         err = string_append(&param, "(?:)");
-      }
-      if (err)
-      {
-         return err;
-      }
-
-      /* Check that the modified regex is valid */
-      s = strdup(param);
-      if (s == NULL)
-      {
-         free(param);
-         return JB_ERR_MEMORY;
-      }
-      err = create_url_spec(compiled, s);
-      free(s);
-      if (err)
-      {
-         free(param);
-         return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS;
-      }
-      free_url_spec(compiled);
-   }
-
-   *pvalue = param;
-   return JB_ERR_OK;
-}
-
-/*********************************************************************
- *
- * Function    :  map_radio
- *
- * Description :  Map a set of radio button values.  E.g. if you have
- *                3 radio buttons, declare them as:
- *                  <option type="radio" name="xyz" @xyz-a@>
- *                  <option type="radio" name="xyz" @xyz-b@>
- *                  <option type="radio" name="xyz" @xyz-c@>
- *                Then map one of the @xyz-?@ variables to "checked"
- *                and all the others to empty by calling:
- *                map_radio(exports, "xyz", "abc", sel)
- *                Where 'sel' is 'a', 'b', or 'c'.
- *
- * Parameters  :
- *          1  :  exports = Exports map to modify.
- *          2  :  optionname = name for map
- *          3  :  values = null-terminated list of values;
- *          4  :  value = Selected value.
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-static jb_err map_radio(struct map * exports,
-                        const char * optionname,
-                        const char * values,
-                        int value)
-{
-   size_t len;
-   char * buf;
-   char * p;
-   char c;
-
-   assert(exports);
-   assert(optionname);
-   assert(values);
-
-   len = strlen(optionname);
-   buf = malloc(len + 3);
-   if (buf == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   strcpy(buf, optionname);
-   p = buf + len;
-   *p++ = '-';
-   p[1] = '\0';
-
-   while ((c = *values++) != '\0')
-   {
-      if (c != value)
-      {
-         *p = c;
-         if (map(exports, buf, 1, "", 1))
-         {
-            return JB_ERR_MEMORY;
-         }
-      }
-   }
-
-   *p = value;
-   return map(exports, buf, 0, "checked", 1);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_modified
- *
- * Description :  CGI function that is called when a file is modified
- *                outside the CGI editor.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  filename = The file that was modified.
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_modified(struct client_state *csp,
-                          struct http_response *rsp,
-                          const char *filename)
-{
-   struct map *exports;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(filename);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, html_encode(filename), 0);
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-modified", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_parse
- *
- * Description :  CGI function that is called when a file cannot
- *                be parsed by the CGI editor.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  file = The file that was modified.
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_parse(struct client_state *csp,
-                       struct http_response *rsp,
-                       struct editable_file *file)
-{
-   struct map *exports;
-   jb_err err;
-   struct file_line *cur_line;
-
-   assert(csp);
-   assert(rsp);
-   assert(file);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "parse-error", 1, html_encode(file->parse_error_text), 0);
-
-   cur_line = file->parse_error;
-   assert(cur_line);
-
-   if (!err) err = map(exports, "line-raw", 1, html_encode(cur_line->raw), 0);
-   if (!err) err = map(exports, "line-data", 1, html_encode(cur_line->unprocessed), 0);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-parse", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_file
- *
- * Description :  CGI function that is called when a file cannot be
- *                opened by the CGI editor.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  filename = The file that was modified.
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_file(struct client_state *csp,
-                      struct http_response *rsp,
-                      const char *filename)
-{
-   struct map *exports;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(filename);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, html_encode(filename), 0);
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-file", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_bad_param
- *
- * Description :  CGI function that is called if the parameters
- *                (query string) for a CGI were wrong.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_disabled(struct client_state *csp,
-                          struct http_response *rsp)
-{
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-disabled", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions
- *
- * Description :  CGI function that allows the user to choose which
- *                actions file to edit.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error
- *
- *********************************************************************/
-jb_err cgi_edit_actions(struct client_state *csp,
-                        struct http_response *rsp,
-                        const struct map *parameters)
-{
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   /* FIXME: Incomplete */
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-   if (enlist_unique_header(rsp->headers, "Location",
-      CGI_PREFIX "edit-actions-list?f=default"))
-   {
-      free(rsp->status);
-      rsp->status = NULL;
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_list
- *
- * Description :  CGI function that edits the actions list.
- *                FIXME: This function shouldn't FATAL ever.
- *                FIXME: This function doesn't check the retval of map()
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : filename
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_FILE   if the file cannot be opened or
- *                              contains no data
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_list(struct client_state *csp,
-                             struct http_response *rsp,
-                             const struct map *parameters)
-{
-   char * section_template;
-   char * url_template;
-   char * sections;
-   char * urls;
-   char buf[50];
-   char * s;
-   struct map * exports;
-   struct map * section_exports;
-   struct map * url_exports;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number = 0;
-   unsigned prev_section_line_number = ((unsigned) (-1));
-   int url_1_2;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 0, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-
-   if (err)
-   {
-      edit_free_file(file);
-      free_map(exports);
-      return err;
-   }
-
-   /* Should do all global exports above this point */
-
-   err = template_load(csp, &section_template, "edit-actions-list-section");
-   if (err)
-   {
-      edit_free_file(file);
-      free_map(exports);
-      if (err == JB_ERR_FILE)
-      {
-         return cgi_error_no_template(csp, rsp, "edit-actions-list-section");
-      }
-      return err;
-   }
-
-   err = template_load(csp, &url_template, "edit-actions-list-url");
-   if (err)
-   {
-      free(section_template);
-      edit_free_file(file);
-      free_map(exports);
-      if (err == JB_ERR_FILE)
-      {
-         return cgi_error_no_template(csp, rsp, "edit-actions-list-url");
-      }
-      return err;
-   }
-
-   err = template_fill(&section_template, exports);
-   if (err)
-   {
-      free(url_template);
-      edit_free_file(file);
-      free_map(exports);
-      free(url_template);
-      return err;
-   }
-
-   err = template_fill(&url_template, exports);
-   if (err)
-   {
-      free(section_template);
-      edit_free_file(file);
-      free_map(exports);
-      return err;
-   }
-
-   /* Find start of actions in file */
-   cur_line = file->lines;
-   line_number = 1;
-   while ((cur_line != NULL) && (cur_line->type != FILE_LINE_ACTION))
-   {
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if (NULL == (sections = strdup("")))
-   {
-      free(section_template);
-      free(url_template);
-      edit_free_file(file);
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   while ((cur_line != NULL) && (cur_line->type == FILE_LINE_ACTION))
-   {
-      if (NULL == (section_exports = new_map()))
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      snprintf(buf, 50, "%d", line_number);
-      err = map(section_exports, "s", 1, buf, 1);
-      if (!err) err = map(section_exports, "actions", 1,
-                          actions_to_html(cur_line->data.action), 0);
-
-      if ( (!err)
-        && (cur_line->next != NULL)
-        && (cur_line->next->type == FILE_LINE_URL))
-      {
-         /* This section contains at least one URL, don't allow delete */
-         err = map_block_killer(section_exports, "empty-section");
-      }
-      else
-      {
-         if (!err) err = map_block_keep(section_exports, "empty-section");
-      }
-
-      if (prev_section_line_number != ((unsigned)(-1)))
-      {
-         /* Not last section */
-         snprintf(buf, 50, "%d", prev_section_line_number);
-         if (!err) err = map(section_exports, "s-prev", 1, buf, 1);
-         if (!err) err = map_block_keep(section_exports, "s-prev-exists");
-      }
-      else
-      {
-         /* Last section */
-         if (!err) err = map_block_killer(section_exports, "s-prev-exists");
-      }
-      prev_section_line_number = line_number;
-
-      if (err)
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return err;
-      }
-
-      /* Should do all section-specific exports above this point */
-
-      if (NULL == (urls = strdup("")))
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return JB_ERR_MEMORY;
-      }
-
-      url_1_2 = 2;
-
-      cur_line = cur_line->next;
-      line_number++;
-
-      while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL))
-      {
-         if (NULL == (url_exports = new_map()))
-         {
-            free(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            return JB_ERR_MEMORY;
-         }
-
-         snprintf(buf, 50, "%d", line_number);
-         err = map(url_exports, "p", 1, buf, 1);
-
-         snprintf(buf, 50, "%d", url_1_2);
-         if (!err) err = map(url_exports, "url-1-2", 1, buf, 1);
-
-         if (!err) err = map(url_exports, "url-html", 1,
-                             html_encode(cur_line->unprocessed), 0);
-         if (!err) err = map(url_exports, "url", 1,
-                             url_encode(cur_line->unprocessed), 0);
-
-         if (err)
-         {
-            free(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            free_map(url_exports);
-            return err;
-         }
-
-         if (NULL == (s = strdup(url_template)))
-         {
-            free(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            free_map(url_exports);
-            return JB_ERR_MEMORY;
-         }
-
-         err = template_fill(&s, section_exports);
-         if (!err) err = template_fill(&s, url_exports);
-         if (!err) err = string_append(&urls, s);
-
-         free_map(url_exports);
-         freez(s);
-
-         if (err)
-         {
-            freez(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            return err;
-         }
-
-         url_1_2 = 3 - url_1_2;
-
-         cur_line = cur_line->next;
-         line_number++;
-      }
-
-      err = map(section_exports, "urls", 1, urls, 0);
-
-      /* Could also do section-specific exports here, but it wouldn't be as fast */
-
-      if ( (cur_line != NULL)
-        && (cur_line->type == FILE_LINE_ACTION))
-      {
-         /* Not last section */
-         snprintf(buf, 50, "%d", line_number);
-         if (!err) err = map(section_exports, "s-next", 1, buf, 1);
-         if (!err) err = map_block_keep(section_exports, "s-next-exists");
-      }
-      else
-      {
-         /* Last section */
-         if (!err) err = map_block_killer(section_exports, "s-next-exists");
-      }
-
-      if (err)
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return err;
-      }
-
-      if (NULL == (s = strdup(section_template)))
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return JB_ERR_MEMORY;
-      }
-
-      err = template_fill(&s, section_exports);
-      if (!err) err = string_append(&sections, s);
-
-      freez(s);
-      free_map(section_exports);
-
-      if (err)
-      {
-         freez(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         return err;
-      }
-   }
-
-   edit_free_file(file);
-   free(section_template);
-   free(url_template);
-
-   err = map(exports, "sections", 1, sections, 0);
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   /* Could also do global exports here, but it wouldn't be as fast */
-
-   return template_fill_for_cgi(csp, "edit-actions-list", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions
- *
- * Description :  CGI function that edits the Actions list.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_for_url(struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters)
-{
-   struct map * exports;
-   unsigned sectionid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   jb_err err;
-   struct file_list *filter_file;
-   struct re_filterfile_spec *filter_group;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < sectionid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != sectionid)
-     || (sectionid < 1)
-     || (cur_line->type != FILE_LINE_ACTION))
-   {
-      /* Invalid "sectionid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-   if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0);
-
-   if (!err) err = actions_to_radio(exports, cur_line->data.action);
-
-   filter_file = csp->rlist;
-   filter_group = ((filter_file != NULL) ? filter_file->f : NULL);
-
-   if (!err) err = map_conditional(exports, "any-filters-defined", (filter_group != NULL));
-
-   if (err)
-   {
-      edit_free_file(file);
-      free_map(exports);
-      return err;
-   }
-
-   if (filter_group == NULL)
-   {
-      err = map(exports, "filter-params", 1, "", 1);
-   }
-   else
-   {
-      /* We have some entries in the filter list */
-      char * result;
-      int index = 0;
-      char * filter_template;
-
-      err = template_load(csp, &filter_template, "edit-actions-for-url-filter");
-      if (err)
-      {
-         edit_free_file(file);
-         free_map(exports);
-         if (err == JB_ERR_FILE)
-         {
-            return cgi_error_no_template(csp, rsp, "edit-actions-for-url-filter");
-         }
-         return err;
-      }
-
-      result = strdup("");
-
-      for (;(!err) && (filter_group != NULL); filter_group = filter_group->next)
-      {
-         char current_mode = 'x';
-         struct list_entry *filter_name;
-         char * this_line;
-         struct map *line_exports;
-         char number[20];
-
-         filter_name = cur_line->data.action->multi_add[ACTION_MULTI_FILTER]->first;
-         while ((filter_name != NULL)
-             && (0 != strcmp(filter_group->name, filter_name->str)))
-         {
-              filter_name = filter_name->next;
-         }
-
-         if (filter_name != NULL)
-         {
-            current_mode = 'y';
-         }
-         else
-         {
-            filter_name = cur_line->data.action->multi_remove[ACTION_MULTI_FILTER]->first;
-            while ((filter_name != NULL)
-                && (0 != strcmp(filter_group->name, filter_name->str)))
-            {
-                 filter_name = filter_name->next;
-            }
-            if (filter_name != NULL)
-            {
-               current_mode = 'n';
-            }
-         }
-
-         /* Generate a unique serial number */
-         snprintf(number, sizeof(number), "%x", index++);
-         number[sizeof(number) - 1] = '\0';
-
-         line_exports = new_map();
-         if (line_exports == NULL)
-         {
-            err = JB_ERR_MEMORY;
-            freez(result);
-         }
-         else
-         {
-            if (!err) err = map(line_exports, "index", 1, number, 1);
-            if (!err) err = map(line_exports, "name",  1, filter_group->name, 1);
-            if (!err) err = map(line_exports, "description",  1, filter_group->description, 1);
-            if (!err) err = map_radio(line_exports, "this-filter", "ynx", current_mode);
-
-            this_line = NULL;
-            if (!err)
-            {
-               this_line = strdup(filter_template);
-               if (this_line == NULL) err = JB_ERR_MEMORY;
-            }
-            if (!err) err = template_fill(&this_line, line_exports);
-            string_join(&result, this_line);
-
-            free_map(line_exports);
-         }
-      }
-      if (!err)
-      {
-         err = map(exports, "filter-params", 1, result, 0);
-      }
-      else
-      {
-         freez(result);
-      }
-   }
-
-   if (!err) err = map_radio(exports, "filter-all", "nx",
-      (cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER] ? 'n' : 'x'));
-
-   edit_free_file(file);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-for-url", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_submit
- *
- * Description :  CGI function that actually edits the Actions list.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_submit(struct client_state *csp,
-                               struct http_response *rsp,
-                               const struct map *parameters)
-{
-   unsigned sectionid;
-   char * actiontext;
-   char * newtext;
-   size_t len;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-   int index;
-   char ch;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < sectionid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != sectionid)
-     || (sectionid < 1)
-     || (cur_line->type != FILE_LINE_ACTION))
-   {
-      /* Invalid "sectionid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   err = actions_from_radio(parameters, cur_line->data.action);
-   if(err)
-   {
-      /* Out of memory */
-      edit_free_file(file);
-      return err;
-   }
-
-   ch = get_char_param(parameters, "filter_all");
-   if (ch == 'N')
-   {
-      list_remove_all(cur_line->data.action->multi_add[ACTION_MULTI_FILTER]);
-      list_remove_all(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER]);
-      cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER] = 1;
-   }
-   else if (ch == 'X')
-   {
-      cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER] = 0;
-   }
-
-   for (index = 0; !err; index++)
-   {
-      char key_value[30];
-      char key_name[30];
-      const char *name;
-      char value;
-
-      /* Generate the keys */
-      snprintf(key_value, sizeof(key_value), "filter_r%x", index);
-      key_value[sizeof(key_value) - 1] = '\0';
-      snprintf(key_name, sizeof(key_name), "filter_n%x", index);
-      key_name[sizeof(key_name) - 1] = '\0';
-
-      err = get_string_param(parameters, key_name, &name);
-      if (err) break;
-
-      if (name == NULL)
-      {
-         /* End of list */
-         break;
-      }
-
-
-      value = get_char_param(parameters, key_value);
-      if (value == 'Y')
-      {
-         list_remove_item(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         if (!err) err = enlist(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         list_remove_item(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-      }
-      else if (value == 'N')
-      {
-         list_remove_item(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         if (!cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER])
-         {
-            list_remove_item(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-            if (!err) err = enlist(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-         }
-      }
-      else if (value == 'X')
-      {
-         list_remove_item(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         list_remove_item(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-      }
-   }
-
-   if(err)
-   {
-      /* Out of memory */
-      edit_free_file(file);
-      return err;
-   }
-
-   if (NULL == (actiontext = actions_to_text(cur_line->data.action)))
-   {
-      /* Out of memory */
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   len = strlen(actiontext);
-   if (len == 0)
-   {
-      /*
-       * Empty action - must special-case this.
-       * Simply setting len to 1 is sufficient...
-       */
-      len = 1;
-   }
-
-   if (NULL == (newtext = malloc(len + 2)))
-   {
-      /* Out of memory */
-      free(actiontext);
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-   strcpy(newtext, actiontext);
-   free(actiontext);
-   newtext[0]       = '{';
-   newtext[len]     = '}';
-   newtext[len + 1] = '\0';
-
-   freez(cur_line->raw);
-   freez(cur_line->unprocessed);
-   cur_line->unprocessed = newtext;
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_url
- *
- * Description :  CGI function that actually edits a URL pattern in
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *    filename : Identifies the file to edit
- *         ver : File's last-modified time
- *     section : Line number of section to edit
- *     pattern : Line number of pattern to edit
- *      newval : New value for pattern
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_url(struct client_state *csp,
-                            struct http_response *rsp,
-                            const struct map *parameters)
-{
-   unsigned patternid;
-   char * new_pattern;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-   if (patternid < 1U)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   err = get_url_spec_param(csp, parameters, "u", &new_pattern);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      free(new_pattern);
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   while ((cur_line != NULL) && (line_number < patternid))
-   {
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      free(new_pattern);
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the line to edit is in cur_line */
-
-   freez(cur_line->raw);
-   freez(cur_line->unprocessed);
-   cur_line->unprocessed = new_pattern;
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_add_url
- *
- * Description :  CGI function that actually adds a URL pattern to
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *    filename : Identifies the file to edit
- *         ver : File's last-modified time
- *     section : Line number of section to edit
- *      newval : New pattern
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_add_url(struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters)
-{
-   unsigned sectionid;
-   char * new_pattern;
-   struct file_line * new_line;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-   if (sectionid < 1U)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   err = get_url_spec_param(csp, parameters, "u", &new_pattern);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      free(new_pattern);
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   while ((cur_line != NULL) && (line_number < sectionid))
-   {
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_ACTION))
-   {
-      /* Invalid "sectionid" parameter */
-      free(new_pattern);
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the section header is in cur_line - add after this. */
-
-   /* Allocate the new line */
-   new_line = (struct file_line *)zalloc(sizeof(*new_line));
-   if (new_line == NULL)
-   {
-      free(new_pattern);
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Fill in the data members of the new line */
-   new_line->raw = NULL;
-   new_line->prefix = NULL;
-   new_line->unprocessed = new_pattern;
-   new_line->type = FILE_LINE_URL;
-
-   /* Link new_line into the list, after cur_line */
-   new_line->next = cur_line->next;
-   cur_line->next = new_line;
-
-   /* Done making changes, now commit */
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_remove_url
- *
- * Description :  CGI function that actually removes a URL pattern from
- *                the actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           p : (pattern) Line number of pattern to remove
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_remove_url(struct client_state *csp,
-                                   struct http_response *rsp,
-                                   const struct map *parameters)
-{
-   unsigned patternid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   struct file_line * prev_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   prev_line = NULL;
-   cur_line = file->lines;
-
-   while ((cur_line != NULL) && (line_number < patternid))
-   {
-      prev_line = cur_line;
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (prev_line == NULL)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the line to remove is in cur_line, and the previous
-    * one is in prev_line
-    */
-
-   /* Unlink cur_line */
-   prev_line->next = cur_line->next;
-   cur_line->next = NULL;
-
-   /* Free cur_line */
-   edit_free_file_lines(cur_line);
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_section_remove
- *
- * Description :  CGI function that actually removes a whole section from
- *                the actions file.  The section must be empty first
- *                (else JB_ERR_CGI_PARAMS).
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           s : (section) Line number of section to edit
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_section_remove(struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters)
-{
-   unsigned sectionid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   struct file_line * prev_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   prev_line = NULL;
-   while ((cur_line != NULL) && (line_number < sectionid))
-   {
-      prev_line = cur_line;
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_ACTION) )
-   {
-      /* Invalid "sectionid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if ( (cur_line->next != NULL)
-     && (cur_line->next->type == FILE_LINE_URL) )
-   {
-      /* Section not empty. */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the line to remove is in cur_line, and the previous
-    * one is in prev_line
-    */
-
-   /* Unlink cur_line */
-   if (prev_line == NULL)
-   {
-      /* Removing the first line from the file */
-      file->lines = cur_line->next;
-   }
-   else
-   {
-      prev_line->next = cur_line->next;
-   }
-   cur_line->next = NULL;
-
-   /* Free cur_line */
-   edit_free_file_lines(cur_line);
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_section_add
- *
- * Description :  CGI function that adds a new empty section to
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           s : (section) Line number of section to add after, 0 for
- *               start of file.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_section_add(struct client_state *csp,
-                                    struct http_response *rsp,
-                                    const struct map *parameters)
-{
-   unsigned sectionid;
-   struct file_line * new_line;
-   char * new_text;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   if (sectionid < 1U)
-   {
-      /* Add to start of file */
-      if (cur_line != NULL)
-      {
-         /* There's something in the file, find the line before the first
-          * action.
-          */
-         while ( (cur_line->next != NULL)
-              && (cur_line->next->type != FILE_LINE_ACTION) )
-         {
-            cur_line = cur_line->next;
-            line_number++;
-         }
-      }
-   }
-   else
-   {
-      /* Add after stated section. */
-      while ((cur_line != NULL) && (line_number < sectionid))
-      {
-         cur_line = cur_line->next;
-         line_number++;
-      }
-
-      if ( (cur_line == NULL)
-        || (cur_line->type != FILE_LINE_ACTION))
-      {
-         /* Invalid "sectionid" parameter */
-         edit_free_file(file);
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      /* Skip through the section to find the last line in it. */
-      while ( (cur_line->next != NULL)
-           && (cur_line->next->type != FILE_LINE_ACTION) )
-      {
-         cur_line = cur_line->next;
-         line_number++;
-      }
-   }
-
-   /* At this point, the last line in the previous section is in cur_line
-    * - add after this.  (Or if we need to add as the first line, cur_line
-    * will be NULL).
-    */
-
-   new_text = strdup("{}");
-   if (NULL == new_text)
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Allocate the new line */
-   new_line = (struct file_line *)zalloc(sizeof(*new_line));
-   if (new_line == NULL)
-   {
-      free(new_text);
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Fill in the data members of the new line */
-   new_line->raw = NULL;
-   new_line->prefix = NULL;
-   new_line->unprocessed = new_text;
-   new_line->type = FILE_LINE_ACTION;
-
-   if (cur_line != NULL)
-   {
-      /* Link new_line into the list, after cur_line */
-      new_line->next = cur_line->next;
-      cur_line->next = new_line;
-   }
-   else
-   {
-      /* Link new_line into the list, as first line */
-      new_line->next = file->lines;
-      file->lines = new_line;
-   }
-
-   /* Done making changes, now commit */
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_section_swap
- *
- * Description :  CGI function that swaps the order of two sections
- *                in the actions file.  Note that this CGI can actually
- *                swap any two arbitrary sections, but the GUI interface
- *                currently only allows consecutive sections to be
- *                specified.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *          s1 : (section1) Line number of first section to swap
- *          s2 : (section2) Line number of second section to swap
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_section_swap(struct client_state *csp,
-                                     struct http_response *rsp,
-                                     const struct map *parameters)
-{
-   unsigned section1;
-   unsigned section2;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   struct file_line * prev_line;
-   struct file_line * line_before_section1;
-   struct file_line * line_start_section1;
-   struct file_line * line_end_section1;
-   struct file_line * line_after_section1;
-   struct file_line * line_before_section2;
-   struct file_line * line_start_section2;
-   struct file_line * line_end_section2;
-   struct file_line * line_after_section2;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s1", &section1);
-   if (!err) err = get_number_param(csp, parameters, "s2", &section2);
-   if (err)
-   {
-      return err;
-   }
-
-   if (section1 > section2)
-   {
-      unsigned temp = section2;
-      section2 = section1;
-      section1 = temp;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   /* Start at the beginning... */
-   line_number = 1;
-   cur_line = file->lines;
-   prev_line = NULL;
-
-   /* ... find section1 ... */
-   while ((cur_line != NULL) && (line_number < section1))
-   {
-      prev_line = cur_line;
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_ACTION) )
-   {
-      /* Invalid "section1" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* If no-op, we've validated params and can skip the rest. */
-   if (section1 != section2)
-   {
-      /* ... find the end of section1 ... */
-      line_before_section1 = prev_line;
-      line_start_section1 = cur_line;
-      do
-      {
-         prev_line = cur_line;
-         cur_line = cur_line->next;
-         line_number++;
-      }
-      while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL));
-      line_end_section1 = prev_line;
-      line_after_section1 = cur_line;
-
-      /* ... find section2 ... */
-      while ((cur_line != NULL) && (line_number < section2))
-      {
-         prev_line = cur_line;
-         cur_line = cur_line->next;
-         line_number++;
-      }
-
-      if ( (cur_line == NULL)
-        || (cur_line->type != FILE_LINE_ACTION) )
-      {
-         /* Invalid "section2" parameter */
-         edit_free_file(file);
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      /* ... find the end of section2 ... */
-      line_before_section2 = prev_line;
-      line_start_section2 = cur_line;
-      do
-      {
-         prev_line = cur_line;
-         cur_line = cur_line->next;
-         line_number++;
-      }
-      while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL));
-      line_end_section2 = prev_line;
-      line_after_section2 = cur_line;
-
-      /* Now have all the pointers we need. Do the swap. */
-
-      /* Change the pointer to section1 to point to section2 instead */
-      if (line_before_section1 == NULL)
-      {
-         file->lines = line_start_section2;
-      }
-      else
-      {
-         line_before_section1->next = line_start_section2;
-      }
-
-      if (line_before_section2 == line_end_section1)
-      {
-         /* Consecutive sections */
-         line_end_section2->next = line_start_section1;
-      }
-      else
-      {
-         line_end_section2->next = line_after_section1;
-         line_before_section2->next = line_start_section1;
-      }
-
-      /* Set the pointer from the end of section1 to the rest of the file */
-      line_end_section1->next = line_after_section2;
-
-      err = edit_write_file(file);
-      if (err)
-      {
-         /* Error writing file */
-         edit_free_file(file);
-         return err;
-      }
-   } /* END if (section1 != section2) */
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_toggle
- *
- * Description :  CGI function that adds a new empty section to
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *         set : If present, how to change toggle setting:
- *               "enable", "disable", "toggle", or none (default).
- *        mini : If present, use mini reply template.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-jb_err cgi_toggle(struct client_state *csp,
-                  struct http_response *rsp,
-                  const struct map *parameters)
-{
-   struct map *exports;
-   char mode;
-   const char *template_name;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_TOGGLE))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   mode = get_char_param(parameters, "set");
-
-   if (mode == 'E')
-   {
-      /* Enable */
-      g_bToggleIJB = 1;
-   }
-   else if (mode == 'D')
-   {
-      /* Disable */
-      g_bToggleIJB = 0;
-   }
-   else if (mode == 'T')
-   {
-      /* Toggle */
-      g_bToggleIJB = !g_bToggleIJB;
-   }
-
-   if (NULL == (exports = default_exports(csp, "toggle")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   template_name = (get_char_param(parameters, "mini")
-                 ? "toggle-mini"
-                 : "toggle");
-
-   return template_fill_for_cgi(csp, template_name, exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  javascriptify
- *
- * Description :  Converts a string into a form JavaScript will like.
- *
- *                Netscape 4's JavaScript sucks - it doesn't use 
- *                "id" parameters, so you have to set the "name"
- *                used to submit a form element to something JavaScript
- *                will like.  (Or access the elements by index in an
- *                array.  That array contains >60 elements and will
- *                be changed whenever we add a new action to the
- *                editor, so I'm NOT going to use indexes that have
- *                to be figured out by hand.)
- *
- *                Currently the only thing we have to worry about
- *                is "-" ==> "_" conversion.
- *
- *                This is a length-preserving operation so it is
- *                carried out in-place, no memory is allocated
- *                or freed.
- *
- * Parameters  :
- *          1  :  identifier = String to make JavaScript-friendly.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-static void javascriptify(char * identifier)
-{
-   char * p = identifier;
-   while (NULL != (p = strchr(p, '-')))
-   {
-      *p++ = '_';
-   }
-}
-
-
-/*********************************************************************
- *
- * Function    :  actions_to_radio
- *
- * Description :  Converts a actionsfile entry into settings for
- *                radio buttons and edit boxes on a HTML form.
- *
- * Parameters  :
- *          1  :  exports = List of substitutions to add to.
- *          2  :  action  = Action to read
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-static jb_err actions_to_radio(struct map * exports,
-                               const struct action_spec *action)
-{
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   int mapped_param;
-   int checked;
-   char current_mode;
-
-   assert(exports);
-   assert(action);
-
-   mask = action->mask;
-   add  = action->add;
-
-   /* sanity - prevents "-feature +feature" */
-   mask |= add;
-
-
-#define DEFINE_ACTION_BOOL(name, bit)                 \
-   if (!(mask & bit))                                 \
-   {                                                  \
-      current_mode = 'n';                             \
-   }                                                  \
-   else if (add & bit)                                \
-   {                                                  \
-      current_mode = 'y';                             \
-   }                                                  \
-   else                                               \
-   {                                                  \
-      current_mode = 'x';                             \
-   }                                                  \
-   if (map_radio(exports, name, "ynx", current_mode)) \
-   {                                                  \
-      return JB_ERR_MEMORY;                           \
-   }
-
-#define DEFINE_ACTION_STRING(name, bit, index)        \
-   DEFINE_ACTION_BOOL(name, bit);                     \
-   mapped_param = 0;
-
-#define DEFINE_CGI_PARAM_RADIO(name, bit, index, value, is_default)  \
-   if (add & bit)                                                    \
-   {                                                                 \
-      checked = !strcmp(action->string[index], value);               \
-   }                                                                 \
-   else                                                              \
-   {                                                                 \
-      checked = is_default;                                          \
-   }                                                                 \
-   mapped_param |= checked;                                          \
-   if (map(exports, name "-param-" value, 1, (checked ? "checked" : ""), 1)) \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }
-
-#define DEFINE_CGI_PARAM_CUSTOM(name, bit, index, default_val)       \
-   if (map(exports, name "-param-custom", 1,                         \
-           ((!mapped_param) ? "checked" : ""), 1))                   \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }                                                                 \
-   if (map(exports, name "-param", 1,                                \
-           (((add & bit) && !mapped_param) ?                         \
-           action->string[index] : default_val), 1))                 \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }
-
-#define DEFINE_CGI_PARAM_NO_RADIO(name, bit, index, default_val)     \
-   if (map(exports, name "-param", 1,                                \
-           ((add & bit) ? action->string[index] : default_val), 1))  \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }
-
-#define DEFINE_ACTION_MULTI(name, index)              \
-   if (action->multi_add[index]->first)               \
-   {                                                  \
-      current_mode = 'y';                             \
-   }                                                  \
-   else if (action->multi_remove_all[index])          \
-   {                                                  \
-      current_mode = 'n';                             \
-   }                                                  \
-   else if (action->multi_remove[index]->first)       \
-   {                                                  \
-      current_mode = 'y';                             \
-   }                                                  \
-   else                                               \
-   {                                                  \
-      current_mode = 'x';                             \
-   }                                                  \
-   if (map_radio(exports, name, "ynx", current_mode)) \
-   {                                                  \
-      return JB_ERR_MEMORY;                           \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-#undef DEFINE_CGI_PARAM_CUSTOM
-#undef DEFINE_CGI_PARAM_RADIO
-#undef DEFINE_CGI_PARAM_NO_RADIO
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  actions_from_radio
- *
- * Description :  Converts a map of parameters passed to a CGI function
- *                into an actionsfile entry.
- *
- * Parameters  :
- *          1  :  parameters = parameters to the CGI call
- *          2  :  action  = Action to change.  Must be valid before
- *                          the call, actions not specified will be
- *                          left unchanged.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-static jb_err actions_from_radio(const struct map * parameters,
-                                 struct action_spec *action)
-{
-   static int first_time = 1;
-   const char * param;
-   char * param_dup;
-   char ch;
-   const char * js_name;
-   jb_err err = JB_ERR_OK;
-
-   assert(parameters);
-   assert(action);
-
-   /* Statics are generally a potential race condition,
-    * but in this case we're safe and don't need semaphores.
-    * Be careful if you modify this function.
-    * - Jon
-    */
-
-#define JAVASCRIPTIFY(dest_var, string)               \
-   {                                                  \
-      static char js_name_arr[] = string;             \
-      if (first_time)                                 \
-      {                                               \
-         javascriptify(js_name_arr);                  \
-      }                                               \
-      dest_var = js_name_arr;                         \
-   }                                                  \
-
-#define DEFINE_ACTION_BOOL(name, bit)                 \
-   JAVASCRIPTIFY(js_name, name);                      \
-   ch = get_char_param(parameters, js_name);          \
-   if (ch == 'Y')                                     \
-   {                                                  \
-      action->add  |= bit;                            \
-      action->mask |= bit;                            \
-   }                                                  \
-   else if (ch == 'N')                                \
-   {                                                  \
-      action->add  &= ~bit;                           \
-      action->mask &= ~bit;                           \
-   }                                                  \
-   else if (ch == 'X')                                \
-   {                                                  \
-      action->add  &= ~bit;                           \
-      action->mask |= bit;                            \
-   }                                                  \
-
-#define DEFINE_ACTION_STRING(name, bit, index)                 \
-   JAVASCRIPTIFY(js_name, name);                               \
-   ch = get_char_param(parameters, js_name);                   \
-   if (ch == 'Y')                                              \
-   {                                                           \
-      param = NULL;                                            \
-      JAVASCRIPTIFY(js_name, name "-mode");                    \
-      if (!err) err = get_string_param(parameters, js_name, &param);    \
-      if ((param == NULL) || (0 == strcmp(param, "CUSTOM")))            \
-      {                                                                 \
-         JAVASCRIPTIFY(js_name, name "-param");                         \
-         if (!err) err = get_string_param(parameters, js_name, &param); \
-      }                                                        \
-      if (param != NULL)                                       \
-      {                                                        \
-         if (NULL == (param_dup = strdup(param)))              \
-         {                                                     \
-            return JB_ERR_MEMORY;                              \
-         }                                                     \
-         freez(action->string[index]);                         \
-         action->add  |= bit;                                  \
-         action->mask |= bit;                                  \
-         action->string[index] = param_dup;                    \
-      }                                                        \
-   }                                                           \
-   else if (ch == 'N')                                         \
-   {                                                           \
-      if (action->add & bit)                                   \
-      {                                                        \
-         freez(action->string[index]);                         \
-      }                                                        \
-      action->add  &= ~bit;                                    \
-      action->mask &= ~bit;                                    \
-   }                                                           \
-   else if (ch == 'X')                                         \
-   {                                                           \
-      if (action->add & bit)                                   \
-      {                                                        \
-         freez(action->string[index]);                         \
-      }                                                        \
-      action->add  &= ~bit;                                    \
-      action->mask |= bit;                                     \
-   }                                                           \
-
-#define DEFINE_ACTION_MULTI(name, index)                       \
-   JAVASCRIPTIFY(js_name, name);                               \
-   ch = get_char_param(parameters, js_name);                   \
-   if (ch == 'Y')                                              \
-   {                                                           \
-      /* FIXME */                                              \
-   }                                                           \
-   else if (ch == 'N')                                         \
-   {                                                           \
-      list_remove_all(action->multi_add[index]);               \
-      list_remove_all(action->multi_remove[index]);            \
-      action->multi_remove_all[index] = 1;                     \
-   }                                                           \
-   else if (ch == 'X')                                         \
-   {                                                           \
-      list_remove_all(action->multi_add[index]);               \
-      list_remove_all(action->multi_remove[index]);            \
-      action->multi_remove_all[index] = 0;                     \
-   }                                                           \
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for URL parsing */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-#undef JAVASCRIPTIFY
-
-   first_time = 0;
-
-   return err;
-}
-
-
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/cgiedit.h b/cgiedit.h
deleted file mode 100644 (file)
index 72721c2..0000000
--- a/cgiedit.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef CGIEDIT_H_INCLUDED
-#define CGIEDIT_H_INCLUDED
-#define CGIEDIT_H_VERSION "$Id: cgiedit.h,v 1.6 2002/03/24 13:25:43 swa Exp $"
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgiedit.h,v $
- *
- * Purpose     :  CGI-based actionsfile editor.
- *                
- *                Functions declared include:
- * 
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgiedit.h,v $
- *    Revision 1.6  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.5  2002/01/22 23:24:48  jongfoster
- *    Adding edit-actions-section-swap
- *
- *    Revision 1.4  2001/11/13 00:28:51  jongfoster
- *    Adding new CGIs for use by non-JavaScript browsers:
- *      edit-actions-url-form
- *      edit-actions-add-url-form
- *      edit-actions-remove-url-form
- *
- *    Revision 1.3  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.2  2001/10/14 22:12:49  jongfoster
- *    New version of CGI-based actionsfile editor.
- *    Major changes, including:
- *    - Completely new file parser and file output routines
- *    - edit-actions CGI renamed edit-actions-for-url
- *    - All CGIs now need a filename parameter, except for...
- *    - New CGI edit-actions which doesn't need a filename,
- *      to allow you to start the editor up.
- *    - edit-actions-submit now works, and now automatically
- *      redirects you back to the main edit-actions-list handler.
- *
- *    Revision 1.1  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *
- **********************************************************************/
-\f
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * CGI functions
- */
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-extern jb_err cgi_edit_actions        (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_for_url(struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_list   (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_submit (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_url    (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_url_form(struct client_state *csp,
-                                        struct http_response *rsp,
-                                        const struct map *parameters);
-extern jb_err cgi_edit_actions_add_url(struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_add_url_form(struct client_state *csp,
-                                            struct http_response *rsp,
-                                            const struct map *parameters);
-extern jb_err cgi_edit_actions_remove_url    (struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_edit_actions_remove_url_form(struct client_state *csp,
-                                            struct http_response *rsp,
-                                            const struct map *parameters);
-extern jb_err cgi_edit_actions_section_remove(struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_edit_actions_section_add   (struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_edit_actions_section_swap  (struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_toggle(struct client_state *csp,
-                         struct http_response *rsp,
-                         const struct map *parameters);
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char cgiedit_rcs[];
-extern const char cgiedit_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef CGI_H_INCLUDED */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/cgisimple.c b/cgisimple.c
deleted file mode 100644 (file)
index 733c350..0000000
+++ /dev/null
@@ -1,1303 +0,0 @@
-const char cgisimple_rcs[] = "$Id: cgisimple.c,v 1.22 2002/03/24 16:18:15 jongfoster Exp $";
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgisimple.c,v $
- *
- * Purpose     :  Simple CGIs to get information about Privoxy's
- *                status.
- *                
- *                Functions declared include:
- * 
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgisimple.c,v $
- *    Revision 1.22  2002/03/24 16:18:15  jongfoster
- *    Removing old logo
- *
- *    Revision 1.21  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.20  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.19  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.18  2002/03/12 01:44:49  oes
- *    Changed default for "blocked" image from jb logo to checkboard pattern
- *
- *    Revision 1.17  2002/03/08 16:43:18  oes
- *    Added choice beween GIF and PNG built-in images
- *
- *    Revision 1.16  2002/03/07 03:48:38  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.15  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.14  2002/03/02 04:14:50  david__schmidt
- *    Clean up a little CRLF unpleasantness that suddenly appeared
- *
- *    Revision 1.13  2002/02/21 00:10:37  jongfoster
- *    Adding send-banner?type=auto option
- *
- *    Revision 1.12  2002/01/23 01:03:32  jongfoster
- *    Fixing gcc [CygWin] compiler warnings
- *
- *    Revision 1.11  2002/01/23 00:01:04  jongfoster
- *    Adding cgi_transparent_gif() for http://i.j.b/t
- *    Adding missing html_encode() to many CGI functions.
- *    Adding urlmatch.[ch] to http://i.j.b/show-version
- *
- *    Revision 1.10  2002/01/17 21:10:37  jongfoster
- *    Changes to cgi_show_url_info to use new matching code from urlmatch.c.
- *    Also fixing a problem in the same function with improperly quoted URLs
- *    in output HTML, and adding code to handle https:// URLs correctly.
- *
- *    Revision 1.9  2001/11/30 23:09:15  jongfoster
- *    Now reports on FEATURE_CGI_EDIT_ACTIONS
- *    Removing FEATURE_DENY_GZIP from template
- *
- *    Revision 1.8  2001/11/13 00:14:07  jongfoster
- *    Fixing stupid bug now I've figured out what || means.
- *    (It always returns 0 or 1, not one of it's paramaters.)
- *
- *    Revision 1.7  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.6  2001/10/14 22:00:32  jongfoster
- *    Adding support for a 404 error when an invalid CGI page is requested.
- *
- *    Revision 1.5  2001/10/07 15:30:41  oes
- *    Removed FEATURE_DENY_GZIP
- *
- *    Revision 1.4  2001/10/02 15:31:12  oes
- *    Introduced show-request cgi
- *
- *    Revision 1.3  2001/09/22 16:34:44  jongfoster
- *    Removing unneeded #includes
- *
- *    Revision 1.2  2001/09/19 18:01:11  oes
- *    Fixed comments; cosmetics
- *
- *    Revision 1.1  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *
- **********************************************************************/
-\f
-
-#include "config.h"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <assert.h>
-
-#ifdef _WIN32
-#define snprintf _snprintf
-#endif /* def _WIN32 */
-
-#include "project.h"
-#include "cgi.h"
-#include "cgisimple.h"
-#include "list.h"
-#include "encode.h"
-#include "jcc.h"
-#include "filters.h"
-#include "actions.h"
-#include "miscutil.h"
-#include "loadcfg.h"
-#include "parsers.h"
-#include "urlmatch.h"
-
-const char cgisimple_h_rcs[] = CGISIMPLE_H_VERSION;
-
-
-static char *show_rcs(void);
-static jb_err show_defines(struct map *exports);
-
-
-/*********************************************************************
- *
- * Function    :  cgi_default
- *
- * Description :  CGI function that is called if no action was given.
- *                Lists menu of available unhidden CGIs.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                (Problems other than out-of-memory should be
- *                handled by this routine - it should set the
- *                rsp appropriately and return "success")
- *
- *********************************************************************/
-jb_err cgi_default(struct client_state *csp,
-                   struct http_response *rsp,
-                   const struct map *parameters)
-{
-   char *tmp;
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   /* If there were other parameters, export a dump as "cgi-parameters" */
-   if (parameters->first)
-   {
-      tmp = strdup("<p>What made you think this cgi takes parameters?\n"
-                   "Anyway, here they are, in case you're interested:</p>\n");
-      string_join(&tmp, dump_map(parameters));
-      if (tmp == NULL)
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-      if (map(exports, "cgi-parameters", 1, tmp, 0))
-      {
-         return JB_ERR_MEMORY;
-      }
-   }
-   else
-   {
-      if (map(exports, "cgi-parameters", 1, "", 1))
-      {
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   return template_fill_for_cgi(csp, "default", exports, rsp);
-}
-
-
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_404
- *
- * Description :  CGI function that is called if an unknown action was
- *                given.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_error_404(struct client_state *csp,
-                     struct http_response *rsp,
-                     const struct map *parameters)
-{
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("404 Privoxy configuration page not found");
-   if (rsp->status == NULL)
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-404", exports, rsp);
-}
-
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  cgi_die
- *
- * Description :  CGI function to shut down Privoxy.
- *                NOTE: Turning this on in a production build
- *                would be a BAD idea.  An EXTREMELY BAD idea.
- *                In short, don't do it.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_die (struct client_state *csp,
-                struct http_response *rsp,
-                const struct map *parameters)
-{
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   /* quit */
-   g_terminate = 1;
-
-   /*
-    * I don't really care what gets sent back to the browser.
-    * Take the easy option - "out of memory" page.
-    */
-
-   return JB_ERR_MEMORY;
-}
-#endif /* def FEATURE_GRACEFUL_TERMINATION */
-
-
-/*********************************************************************
- *
- * Function    :  cgi_show_request
- *
- * Description :  Show the client's request and what sed() would have
- *                made of it.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_request(struct client_state *csp,
-                        struct http_response *rsp,
-                        const struct map *parameters)
-{
-   char *p;
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-request")))
-   {
-      return JB_ERR_MEMORY;
-   }
-   
-   /*
-    * Repair the damage done to the IOB by get_header()
-    */
-   for (p = csp->iob->buf; p < csp->iob->eod; p++)
-   {
-      if (*p == '\0') *p = '\n';
-   }
-
-   /*
-    * Export the original client's request and the one we would
-    * be sending to the server if this wasn't a CGI call
-    */
-
-   if (map(exports, "client-request", 1, html_encode(csp->iob->buf), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   if (map(exports, "processed-request", 1, html_encode_and_free_original(
-      sed(client_patterns, add_client_headers, csp)), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "show-request", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_send_banner
- *
- * Description :  CGI function that returns a banner. 
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           type : Selects the type of banner between "trans", "logo",
- *                  and "auto". Defaults to "logo" if absent or invalid.
- *                  "auto" means to select as if we were image-blocking.
- *                  (Only the first character really counts).
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_send_banner(struct client_state *csp,
-                       struct http_response *rsp,
-                       const struct map *parameters)
-{
-   char imagetype = lookup(parameters, "type")[0];
-
-   if (imagetype == 'a') /* auto */
-   {
-      /* Default to pattern */
-      imagetype = 'p';
-#ifdef FEATURE_IMAGE_BLOCKING
-      if ((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0)
-      {
-         /* determine HOW images should be blocked */
-         const char * p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER];
-
-         /* and handle accordingly: */
-         if ((p != NULL) && (0 == strcmpic(p, "blank")))
-         {
-            imagetype = 'b';
-         }
-         else if ((p != NULL) && (0 == strcmpic(p, "pattern")))
-         {
-            imagetype = 'p';
-         }
-      }
-#endif /* def FEATURE_IMAGE_BLOCKING */
-   }
-      
-   if ((imagetype == 'b') || (imagetype == 't')) /* blank / transparent */
-   {
-      rsp->body = bindup(image_blank_data, image_blank_length);
-      rsp->content_length = image_blank_length;
-
-   }
-   else /* pattern */
-   {
-      rsp->body = bindup(image_pattern_data, image_pattern_length);
-      rsp->content_length = image_pattern_length;
-   }   
-
-   if (rsp->body == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->is_static = 1;
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_transparent_image
- *
- * Description :  CGI function that sends a 1x1 transparent image.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_transparent_image(struct client_state *csp,
-                           struct http_response *rsp,
-                           const struct map *parameters)
-{
-   rsp->body = bindup(image_blank_data, image_blank_length);
-   rsp->content_length = image_blank_length;
-
-   if (rsp->body == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->is_static = 1;
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_show_version
- *
- * Description :  CGI function that returns a a web page describing the
- *                file versions of Privoxy.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_version(struct client_state *csp,
-                        struct http_response *rsp,
-                        const struct map *parameters)
-{
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-version")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if (map(exports, "sourceversions", 1, show_rcs(), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "show-version", exports, rsp);
-}
-
-/*********************************************************************
- *
- * Function    :  cgi_show_status
- *
- * Description :  CGI function that returns a a web page describing the
- *                current status of Privoxy.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *        file :  Which file to show.  Only first letter is checked,
- *                valid values are:
- *                - "p"ermissions (actions) file
- *                - "r"egex
- *                - "t"rust
- *                Default is to show menu and other information.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_status(struct client_state *csp,
-                       struct http_response *rsp,
-                       const struct map *parameters)
-{
-   char *s = NULL;
-   int i;
-
-   FILE * fp;
-   char buf[BUFFER_SIZE];
-   const char * filename = NULL;
-   char * file_description = NULL;
-#ifdef FEATURE_STATISTICS
-   float perc_rej;   /* Percentage of http requests rejected */
-   int local_urls_read;
-   int local_urls_rejected;
-#endif /* ndef FEATURE_STATISTICS */
-   jb_err err;
-
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-status")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   switch (*(lookup(parameters, "file")))
-   {
-   case 'p':
-      if (csp->actions_list)
-      {
-         filename = csp->actions_list->filename;
-         file_description = "Actions List";
-      }
-      break;
-
-   case 'r':
-      if (csp->rlist)
-      {
-         filename = csp->rlist->filename;
-         file_description = "Regex Filter List";
-      }
-      break;
-
-#ifdef FEATURE_TRUST
-   case 't':
-      if (csp->tlist)
-      {
-         filename = csp->tlist->filename;
-         file_description = "Trust List";
-      }
-      break;
-#endif /* def FEATURE_TRUST */
-   }
-
-   if (NULL != filename)
-   {
-      if ( map(exports, "file-description", 1, file_description, 1)
-        || map(exports, "filepath", 1, html_encode(filename), 0) )
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      if ((fp = fopen(filename, "r")) == NULL)
-      {
-         if (map(exports, "content", 1, "<h1>ERROR OPENING FILE!</h1>", 1))
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-      }
-      else
-      {
-         s = strdup("");
-         while ((s != NULL) && fgets(buf, sizeof(buf), fp))
-         {
-            string_join  (&s, html_encode(buf));
-            string_append(&s, "<br>");
-         }
-         fclose(fp);
-
-         if (map(exports, "contents", 1, s, 0))
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-      }
-
-      return template_fill_for_cgi(csp, "show-status-file", exports, rsp);
-   }
-
-   if (map(exports, "redirect-url", 1, html_encode(REDIRECT_URL), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-   
-   s = strdup("");
-   for (i = 0; (s != NULL) && (i < Argc); i++)
-   {
-      string_join  (&s, html_encode(Argv[i]));
-      string_append(&s, " ");
-   }
-   if (map(exports, "invocation", 1, s, 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "options", 1, csp->config->proxy_args, 1);
-   if (!err) err = show_defines(exports);
-
-#ifdef FEATURE_STATISTICS
-   local_urls_read     = urls_read;
-   local_urls_rejected = urls_rejected;
-
-   /*
-    * Need to alter the stats not to include the fetch of this
-    * page.
-    *
-    * Can't do following thread safely! doh!
-    *
-    * urls_read--;
-    * urls_rejected--; * This will be incremented subsequently *
-    */
-
-   if (local_urls_read == 0)
-   {
-      if (!err) err = map_block_killer(exports, "have-stats");
-   }
-   else
-   {
-      if (!err) err = map_block_killer(exports, "have-no-stats");
-
-      perc_rej = (float)local_urls_rejected * 100.0F /
-            (float)local_urls_read;
-
-      sprintf(buf, "%d", local_urls_read);
-      if (!err) err = map(exports, "requests-received", 1, buf, 1);
-
-      sprintf(buf, "%d", local_urls_rejected);
-      if (!err) err = map(exports, "requests-blocked", 1, buf, 1);
-
-      sprintf(buf, "%6.2f", perc_rej);
-      if (!err) err = map(exports, "percent-blocked", 1, buf, 1);
-   }
-
-#else /* ndef FEATURE_STATISTICS */
-   err = err || map_block_killer(exports, "statistics");
-#endif /* ndef FEATURE_STATISTICS */
-
-   if (csp->actions_list)
-   {
-      if (!err) err = map(exports, "actions-filename", 1, html_encode(csp->actions_list->filename), 0);
-   }
-   else
-   {
-      if (!err) err = map(exports, "actions-filename", 1, "None specified", 1);
-   }
-
-   if (csp->rlist)
-   {
-      if (!err) err = map(exports, "re-filter-filename", 1, html_encode(csp->rlist->filename), 0);
-   }
-   else
-   {
-      if (!err) err = map(exports, "re-filter-filename", 1, "None specified", 1);
-   }
-
-#ifdef FEATURE_TRUST
-   if (csp->tlist)
-   {
-      if (!err) err = map(exports, "trust-filename", 1, html_encode(csp->tlist->filename), 0);
-   }
-   else
-   {
-      if (!err) err = map(exports, "trust-filename", 1, "None specified", 1);
-   }
-#else
-   if (!err) err = map_block_killer(exports, "trust-support");
-#endif /* ndef FEATURE_TRUST */
-
-   if (err)
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "show-status", exports, rsp);
-}
-
-/*********************************************************************
- *
- * Function    :  cgi_show_url_info
- *
- * Description :  CGI function that determines and shows which actions
- *                Privoxy will perform for a given url, and which
- *                matches starting from the defaults have lead to that.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *            url : The url whose actions are to be determined.
- *                  If url is unset, the url-given conditional will be
- *                  set, so that all but the form can be suppressed in
- *                  the template.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_url_info(struct client_state *csp,
-                         struct http_response *rsp,
-                         const struct map *parameters)
-{
-   char *url_param;
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-url-info")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   /*
-    * Get the url= parameter (if present) and remove any leading/trailing spaces.
-    */
-   url_param = strdup(lookup(parameters, "url"));
-   if (url_param == NULL)
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-   chomp(url_param);
-
-   /*
-    * Handle prefixes.  4 possibilities:
-    * 1) "http://" or "https://" prefix present and followed by URL - OK
-    * 2) Only the "http://" or "https://" part is present, no URL - change
-    *    to empty string so it will be detected later as "no URL".
-    * 3) Parameter specified but doesn't contain "http(s?)://" - add a
-    *    "http://" prefix.
-    * 4) Parameter not specified or is empty string - let this fall through
-    *    for now, next block of code will handle it.
-    */
-   if (0 == strncmp(url_param, "http://", 7))
-   {
-      if (url_param[7] == '\0')
-      {
-         /*
-          * Empty URL (just prefix).
-          * Make it totally empty so it's caught by the next if()
-          */
-         url_param[0] = '\0';
-      }
-   }
-   else if (0 == strncmp(url_param, "https://", 8))
-   {
-      if (url_param[8] == '\0')
-      {
-         /*
-          * Empty URL (just prefix).
-          * Make it totally empty so it's caught by the next if()
-          */
-         url_param[0] = '\0';
-      }
-   }
-   else if (url_param[0] != '\0')
-   {
-      /*
-       * Unknown prefix - assume http://
-       */
-      char * url_param_prefixed = malloc(7 + 1 + strlen(url_param));
-      if (NULL == url_param_prefixed)
-      {
-         free(url_param);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-      strcpy(url_param_prefixed, "http://");
-      strcpy(url_param_prefixed + 7, url_param);
-      free(url_param);
-      url_param = url_param_prefixed;
-   }
-
-
-   if (url_param[0] == '\0')
-   {
-      /* URL paramater not specified, display query form only. */
-      free(url_param);
-      if (map_block_killer(exports, "url-given")
-        || map(exports, "url", 1, "", 1))
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-   }
-   else
-   {
-      /* Given a URL, so query it. */
-      jb_err err;
-      char *matches;
-      char *s;
-      int hits = 0;
-      struct file_list *fl;
-      struct url_actions *b;
-      struct http_request url_to_query[1];
-      struct current_action_spec action[1];
-      
-      if (map(exports, "url", 1, html_encode(url_param), 0))
-      {
-         free(url_param);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      init_current_action(action);
-
-      if (map(exports, "default", 1, html_encode_and_free_original(
-         current_action_to_text(action)), 0))
-      {
-         free_current_action(action);
-         free(url_param);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
-      {
-         err = map(exports, "matches", 1, "none" , 1);
-         if (!err) err = map(exports, "final", 1, lookup(exports, "default"), 1);
-
-         free_current_action(action);
-         free(url_param);
-
-         if (err)
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-
-         return template_fill_for_cgi(csp, "show-url-info", exports, rsp);
-      }
-
-      err = parse_http_url(url_param, url_to_query, csp);
-
-      free(url_param);
-
-      if (err == JB_ERR_MEMORY)
-      {
-         free_current_action(action);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-      else if (err)
-      {
-         /* Invalid URL */
-
-         err = map(exports, "matches", 1, "<b>[Invalid URL specified!]</b>" , 1);
-         if (!err) err = map(exports, "final", 1, lookup(exports, "default"), 1);
-
-         free_current_action(action);
-
-         if (err)
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-
-         return template_fill_for_cgi(csp, "show-url-info", exports, rsp);
-      }
-
-      /*
-       * We have a warning about SSL paths.  Hide it for insecure sites.
-       */
-      if (!url_to_query->ssl)
-      {
-         if (map_block_killer(exports, "https"))
-         {
-            free_current_action(action);
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-      }
-
-      matches = strdup("");
-
-      for (b = b->next; (b != NULL) && (matches != NULL); b = b->next)
-      {
-         if (url_match(b->url, url_to_query))
-         {
-            string_append(&matches, "<b>{");
-            string_join  (&matches, html_encode_and_free_original(
-                                    actions_to_text(b->action)));
-            string_append(&matches, " }</b><br>\n<code>");
-            string_join  (&matches, html_encode(b->url->spec));
-            string_append(&matches, "</code><br>\n<br>\n");
-
-            if (merge_current_action(action, b->action))
-            {
-               freez(matches);
-               free_http_request(url_to_query);
-               free_current_action(action);
-               free_map(exports);
-               return JB_ERR_MEMORY;
-            }
-            hits++;
-         }
-      }
-
-      free_http_request(url_to_query);
-
-      if (matches == NULL)
-      {
-         free_current_action(action);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      if (!hits)
-      {
-         free(matches);
-         matches = strdup("none");
-      }
-      if (map(exports, "matches", 1, matches , 0))
-      {
-         free_current_action(action);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      s = html_encode_and_free_original(current_action_to_text(action));
-
-      free_current_action(action);
-
-      if (map(exports, "final", 1, s, 0))
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   return template_fill_for_cgi(csp, "show-url-info", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_robots_txt
- *
- * Description :  CGI function to return "/robots.txt".
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_robots_txt(struct client_state *csp,
-                      struct http_response *rsp,
-                      const struct map *parameters)
-{
-   char buf[100];
-   jb_err err;
-
-   rsp->body = strdup(
-      "# This is the Privoxy control interface.\n"
-      "# It isn't very useful to index it, and you're likely to break stuff.\n"
-      "# So go away!\n"
-      "\n"
-      "User-agent: *\n"
-      "Disallow: /\n"
-      "\n");
-   if (rsp->body == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = enlist_unique(rsp->headers, "Content-Type: text/plain", 13);
-
-   rsp->is_static = 1;
-
-   get_http_time(7 * 24 * 60 * 60, buf); /* 7 days into future */
-   if (!err) err = enlist_unique_header(rsp->headers, "Expires", buf);
-
-   return (err ? JB_ERR_MEMORY : JB_ERR_OK);
-}
-
-
-/*********************************************************************
- *
- * Function    :  show_defines
- *
- * Description :  Add to a map the state od all conditional #defines
- *                used when building
- *
- * Parameters  :
- *          1  :  exports = map to extend
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-static jb_err show_defines(struct map *exports)
-{
-   jb_err err = JB_ERR_OK;
-
-#ifdef FEATURE_ACL
-   if (!err) err = map_conditional(exports, "FEATURE_ACL", 1);
-#else /* ifndef FEATURE_ACL */
-   if (!err) err = map_conditional(exports, "FEATURE_ACL", 0);
-#endif /* ndef FEATURE_ACL */
-
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-   if (!err) err = map_conditional(exports, "FEATURE_CGI_EDIT_ACTIONS", 1);
-#else /* ifndef FEATURE_COOKIE_JAR */
-   if (!err) err = map_conditional(exports, "FEATURE_CGI_EDIT_ACTIONS", 0);
-#endif /* ndef FEATURE_COOKIE_JAR */
-
-#ifdef FEATURE_COOKIE_JAR
-   if (!err) err = map_conditional(exports, "FEATURE_COOKIE_JAR", 1);
-#else /* ifndef FEATURE_COOKIE_JAR */
-   if (!err) err = map_conditional(exports, "FEATURE_COOKIE_JAR", 0);
-#endif /* ndef FEATURE_COOKIE_JAR */
-
-#ifdef FEATURE_FAST_REDIRECTS
-   if (!err) err = map_conditional(exports, "FEATURE_FAST_REDIRECTS", 1);
-#else /* ifndef FEATURE_FAST_REDIRECTS */
-   if (!err) err = map_conditional(exports, "FEATURE_FAST_REDIRECTS", 0);
-#endif /* ndef FEATURE_FAST_REDIRECTS */
-
-#ifdef FEATURE_FORCE_LOAD
-   if (!err) err = map_conditional(exports, "FEATURE_FORCE_LOAD", 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
-   if (!err) err = map_conditional(exports, "FEATURE_FORCE_LOAD", 0);
-#endif /* ndef FEATURE_FORCE_LOAD */
-
-#ifdef FEATURE_IMAGE_BLOCKING
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 1);
-#else /* ifndef FEATURE_IMAGE_BLOCKING */
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 0);
-#endif /* ndef FEATURE_IMAGE_BLOCKING */
-
-#ifdef FEATURE_IMAGE_DETECT_MSIE
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 1);
-#else /* ifndef FEATURE_IMAGE_DETECT_MSIE */
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 0);
-#endif /* ndef FEATURE_IMAGE_DETECT_MSIE */
-
-#ifdef FEATURE_KILL_POPUPS
-   if (!err) err = map_conditional(exports, "FEATURE_KILL_POPUPS", 1);
-#else /* ifndef FEATURE_KILL_POPUPS */
-   if (!err) err = map_conditional(exports, "FEATURE_KILL_POPUPS", 0);
-#endif /* ndef FEATURE_KILL_POPUPS */
-
-#ifdef FEATURE_NO_GIFS
-   if (!err) err = map_conditional(exports, "FEATURE_NO_GIFS", 1);
-#else /* ifndef FEATURE_NO_GIFS */
-   if (!err) err = map_conditional(exports, "FEATURE_NO_GIFS", 0);
-#endif /* ndef FEATURE_NO_GIFS */
-
-#ifdef FEATURE_PTHREAD
-   if (!err) err = map_conditional(exports, "FEATURE_PTHREAD", 1);
-#else /* ifndef FEATURE_PTHREAD */
-   if (!err) err = map_conditional(exports, "FEATURE_PTHREAD", 0);
-#endif /* ndef FEATURE_PTHREAD */
-
-#ifdef FEATURE_STATISTICS
-   if (!err) err = map_conditional(exports, "FEATURE_STATISTICS", 1);
-#else /* ifndef FEATURE_STATISTICS */
-   if (!err) err = map_conditional(exports, "FEATURE_STATISTICS", 0);
-#endif /* ndef FEATURE_STATISTICS */
-
-#ifdef FEATURE_TOGGLE
-   if (!err) err = map_conditional(exports, "FEATURE_TOGGLE", 1);
-#else /* ifndef FEATURE_TOGGLE */
-   if (!err) err = map_conditional(exports, "FEATURE_TOGGLE", 0);
-#endif /* ndef FEATURE_TOGGLE */
-
-#ifdef FEATURE_TRUST
-   if (!err) err = map_conditional(exports, "FEATURE_TRUST", 1);
-#else /* ifndef FEATURE_TRUST */
-   if (!err) err = map_conditional(exports, "FEATURE_TRUST", 0);
-#endif /* ndef FEATURE_TRUST */
-
-#ifdef REGEX_GNU
-   if (!err) err = map_conditional(exports, "REGEX_GNU", 1);
-#else /* ifndef REGEX_GNU */
-   if (!err) err = map_conditional(exports, "REGEX_GNU", 0);
-#endif /* def REGEX_GNU */
-
-#ifdef REGEX_PCRE
-   if (!err) err = map_conditional(exports, "REGEX_PCRE", 1);
-#else /* ifndef REGEX_PCRE */
-   if (!err) err = map_conditional(exports, "REGEX_PCRE", 0);
-#endif /* def REGEX_PCRE */
-
-#ifdef STATIC_PCRE
-   if (!err) err = map_conditional(exports, "STATIC_PCRE", 1);
-#else /* ifndef STATIC_PCRE */
-   if (!err) err = map_conditional(exports, "STATIC_PCRE", 0);
-#endif /* ndef STATIC_PCRE */
-
-#ifdef STATIC_PCRS
-   if (!err) err = map_conditional(exports, "STATIC_PCRS", 1);
-#else /* ifndef STATIC_PCRS */
-   if (!err) err = map_conditional(exports, "STATIC_PCRS", 0);
-#endif /* ndef STATIC_PCRS */
-
-   if (!err) err = map(exports, "FORCE_PREFIX", 1, FORCE_PREFIX, 1);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  show_rcs
- *
- * Description :  Create a string with the rcs info for all sourcefiles
- *
- * Parameters  :  None
- *
- * Returns     :  A string, or NULL on out-of-memory.
- *
- *********************************************************************/
-static char *show_rcs(void)
-{
-   char *result = strdup("");
-   char buf[BUFFER_SIZE];
-
-   /* Instead of including *all* dot h's in the project (thus creating a
-    * tremendous amount of dependencies), I will concede to declaring them
-    * as extern's.  This forces the developer to add to this list, but oh well.
-    */
-
-#define SHOW_RCS(__x)              \
-   {                               \
-      extern const char __x[];     \
-      sprintf(buf, "%s\n", __x);   \
-      string_append(&result, buf); \
-   }
-
-   /* In alphabetical order */
-   SHOW_RCS(actions_h_rcs)
-   SHOW_RCS(actions_rcs)
-   SHOW_RCS(cgi_h_rcs)
-   SHOW_RCS(cgi_rcs)
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-   SHOW_RCS(cgiedit_h_rcs)
-   SHOW_RCS(cgiedit_rcs)
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-   SHOW_RCS(cgisimple_h_rcs)
-   SHOW_RCS(cgisimple_rcs)
-#ifdef __MINGW32__
-   SHOW_RCS(cygwin_h_rcs)
-#endif
-   SHOW_RCS(deanimate_h_rcs)
-   SHOW_RCS(deanimate_rcs)
-   SHOW_RCS(encode_h_rcs)
-   SHOW_RCS(encode_rcs)
-   SHOW_RCS(errlog_h_rcs)
-   SHOW_RCS(errlog_rcs)
-   SHOW_RCS(filters_h_rcs)
-   SHOW_RCS(filters_rcs)
-   SHOW_RCS(gateway_h_rcs)
-   SHOW_RCS(gateway_rcs)
-#ifdef GNU_REGEX
-   SHOW_RCS(gnu_regex_h_rcs)
-   SHOW_RCS(gnu_regex_rcs)
-#endif /* def GNU_REGEX */
-   SHOW_RCS(jbsockets_h_rcs)
-   SHOW_RCS(jbsockets_rcs)
-   SHOW_RCS(jcc_h_rcs)
-   SHOW_RCS(jcc_rcs)
-#ifdef FEATURE_KILL_POPUPS
-   SHOW_RCS(killpopup_h_rcs)
-   SHOW_RCS(killpopup_rcs)
-#endif /* def FEATURE_KILL_POPUPS */
-   SHOW_RCS(list_h_rcs)
-   SHOW_RCS(list_rcs)
-   SHOW_RCS(loadcfg_h_rcs)
-   SHOW_RCS(loadcfg_rcs)
-   SHOW_RCS(loaders_h_rcs)
-   SHOW_RCS(loaders_rcs)
-   SHOW_RCS(miscutil_h_rcs)
-   SHOW_RCS(miscutil_rcs)
-   SHOW_RCS(parsers_h_rcs)
-   SHOW_RCS(parsers_rcs)
-   SHOW_RCS(pcrs_rcs)
-   SHOW_RCS(pcrs_h_rcs)
-   SHOW_RCS(project_h_rcs)
-   SHOW_RCS(ssplit_h_rcs)
-   SHOW_RCS(ssplit_rcs)
-   SHOW_RCS(urlmatch_h_rcs)
-   SHOW_RCS(urlmatch_rcs)
-#ifdef _WIN32
-#ifndef _WIN_CONSOLE
-   SHOW_RCS(w32log_h_rcs)
-   SHOW_RCS(w32log_rcs)
-   SHOW_RCS(w32res_h_rcs)
-   SHOW_RCS(w32taskbar_h_rcs)
-   SHOW_RCS(w32taskbar_rcs)
-#endif /* ndef _WIN_CONSOLE */
-   SHOW_RCS(win32_h_rcs)
-   SHOW_RCS(win32_rcs)
-#endif /* def _WIN32 */
-
-#undef SHOW_RCS
-
-   return result;
-
-}
-
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/cgisimple.h b/cgisimple.h
deleted file mode 100644 (file)
index 753afcc..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-#ifndef CGISIMPLE_H_INCLUDED
-#define CGISIMPLE_H_INCLUDED
-#define CGISIMPLE_H_VERSION "$Id: cgisimple.h,v 1.9 2002/03/24 13:25:43 swa Exp $"
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgisimple.h,v $
- *
- * Purpose     :  Declares functions to intercept request, generate
- *                html or gif answers, and to compose HTTP resonses.
- *                
- *                Functions declared include:
- * 
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgisimple.h,v $
- *    Revision 1.9  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.8  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.7  2002/03/08 16:43:59  oes
- *    Renamed cgi_transparent_png to cgi_transparent_image
- *
- *    Revision 1.6  2002/03/07 03:48:59  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *
- *    Revision 1.5  2002/01/22 23:26:03  jongfoster
- *    Adding cgi_transparent_gif() for http://i.j.b/t
- *
- *    Revision 1.4  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.3  2001/10/14 22:00:32  jongfoster
- *    Adding support for a 404 error when an invalid CGI page is requested.
- *
- *    Revision 1.2  2001/10/02 15:31:20  oes
- *    Introduced show-request cgi
- *
- *    Revision 1.1  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *
- **********************************************************************/
-\f
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * CGI functions
- */
-extern jb_err cgi_default      (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_error_404    (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_robots_txt   (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_send_banner  (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_status  (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_url_info(struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_version (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_request (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_transparent_image (struct client_state *csp,
-                                   struct http_response *rsp,
-                                   const struct map *parameters);
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-extern jb_err cgi_die (struct client_state *csp,
-                       struct http_response *rsp,
-                       const struct map *parameters);
-#endif
-
-/* Revision control strings from this header and associated .c file */
-extern const char cgisimple_rcs[];
-extern const char cgisimple_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef CGISIMPLE_H_INCLUDED */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/config b/config
index d970941..d71486a 100644 (file)
--- a/config
+++ b/config
@@ -1,7 +1,7 @@
-#  Sample Configuration file for Privoxy
+#  Sample Configuration file for the Internet Junkbuster 2.9.x
 
 #
-# $Id: config,v 1.30 2002/03/24 11:37:39 jongfoster Exp $
+# $Id: config,v 1.17 2001/07/13 13:53:39 oes Exp $
 #
 
 #  Table of Contents
 #
 #  1. INTRODUCTION
 #
-#  This file holds the Privoxy configuration.  If you modify this
-#  file, you will need to send a couple of requests to the proxy
-#  before any changes take effect.
+#  This file holds the Junkbuster configuration.  If you modify this
+#  file, you will need to stop & restart Junkbuster, or use the
+#  "Reload Config" option (Windows) before any changes take effect.
 #
-#  When starting Privoxy on Unix systems, give the name of this
-#  file as an argument.  On Windows systems, Privoxy will look for
-#  this file with the name 'config.txt' in the same directory where
-#  Privoxy is installed.
+#  When starting Junkbuster on Unix systems, give the name of this
+#  file as an argument.  On Windows systems, Junkbuster will look for
+#  this file with the name 'junkbustr.txt' in the same directory where
+#  Junkbuster is installed.
 #
 #  2. FORMAT OF THE CONFIGURATION FILE
 #
@@ -29,9 +29,9 @@
 #  of values, all separated by whitespace (any number of spaces or
 #  tabs).  For example,
 #
-#  actionsfile default.action
+#  blockfile blocklist.ini
 #
-#  Indicates that the actionsfile is named 'default.action'.
+#  Indicates that the blockfile is named 'blocklist.ini'.
 #
 #  The '#' indicates a comment.  Any part of a line following a '#' is
 #  ignored, except if the '#' is preceded by a '\'.
 #  Thus, by placing a # at the start of an existing configuration line,
 #  you can make it a comment and it will be treated as if it weren't there. 
 #  This is called "commenting out" an option and can be useful to turn
-#  off features: If you comment out the "logfile" line, Privoxy will
+#  off features: If you comment out the "logfile" line, junkbuster will
 #  not log to a file at all. Watch for the "default:" section in each 
 #  explanation to see what happens if the option is left unset (or 
 #  commented out). 
 #
 #  Long lines can be continued on the next line by using a `\' as
 #  the last character.
+#  
+
 #
 #  3. OTHER CONFIGURATION FILES
 #
-#  Privoxy uses a number of other files to tell it what ads to
+#  Junkbuster uses a number of other files to tell it what ads to
 #  block, what cookies to accept, etc.  This section of the
-#  configuration file tells Privoxy where to find all those other
+#  configuration file tells Junkbuster where to find all those other
 #  files.
 #
-#  Privoxy looks for these files in the directory specified with
-#  "confdir" option.
-#
-#  (Note that on Windows, Privoxy usually starts with the current
-#  directory (".") being the same directory as the executable)
-#
-#  An absolute path name can be used to avoid problems.
-#
+#  On Windows, Junkbuster looks for these files in the same
+#  directory as the executable.  On Unix, Junkbuster looks for these
+#  files in the current working directory.  In either case, an
+#  absolute path name can be used to avoid problems.
+
 #  While we go modular and multiuser, the blocker, filter, and 
 #  per-user config will be stored in subdirectories of confdir.
 #  Now, only confdir/templates is used for storing HTML templates
@@ -76,33 +75,36 @@ confdir .
 #
 logdir .
 
+#
 #  Note that all file specifications below are relative to 
 #  the above two directories!!!
+#
 
 #  The actions file contains patterns to specify the
 #  actions to apply to requests for each site.
 #
 #  Default: Cookies to and from all destinations are filtered.
 #           Popups are disabled for all sites.
-#           All sites are filtered if filterfile specified.
+#           All sites are filtered if re_filterfile specified.
 #           No sites are blocked.  Nothing is an image.
 #
-actionsfile default.action
+actionsfile actionsfile
 
-#  The filterfile contains content modification rules.  These rules
+#
+#  The re_filterfile contains content modification rules.  These rules
 #  permit powerful changes on the content of Web pages, e.g., you
 #  could disable your favourite JavaScript annoyances, rewrite the
 #  actual content, or just have some fun replacing "Microsoft"
 #  with "Microsuck" wherever it appears on a Web page.
 #
-#  Default: content modification. (see '+-filter' in actionsfile)
+#  Default: No content modification.
 #
-filterfile default.filter
+re_filterfile   re_filterfile
 
 #
 #  The logfile is where all logging and error messages are written.
 #  The logfile can be useful for tracking down a problem with
-#  Privoxy (e.g., it's not blocking an ad you think it should
+#  Junkbuster (e.g., it's not blocking an ad you think it should
 #  block) but in most cases you probably will never look at it.
 #
 #  Your logfile will grow indefinitely, and you will probably want to
@@ -110,25 +112,25 @@ filterfile default.filter
 #  cron job (see 'man cron').
 #
 #  On SuSE Linux systems, you can place a line like
-#  "/var/log/privoxy.* +1024k 644 nobody.nogroup" in /etc/logfiles,
+#  "/var/log/junkbuster.* +1024k 644 nobody.nogroup" in /etc/logfiles,
 #  with the effect that cron.daily will automatically archive, gzip,
 #  and empty the log, when it exceeds 1M size.
 #
 #  Default: Log to the standard error channel, not to a file
 #
-logfile logfile
+logfile      logfile
 
 #
-#  The jarfile defines where Privoxy stores the cookies it
+#  The jarfile defines where Junkbuster stores the cookies it
 #  intercepts.  Note that if you use a jarfile, it may grow quite
 #  large. 
 #
 #  Default: Don't store intercepted cookies
 #
-jarfile jarfile
+#jarfile     jarfile
 
 #
-#  If you specify a trustfile, Privoxy will only allow access
+#  If you specify a trustfile, Junkbuster will only allow access
 #  to sites that are named in the trustfile. You can also mark
 #  sites as trusted referrers, with the effect that access to
 #  untrusted sites will be granted, if a link from a trusted
@@ -153,22 +155,25 @@ jarfile jarfile
 trust-info-url http://www.your-site.com/why_we_block.html
 trust-info-url http://www.your-site.com/what_we_allow.html
 
+
+#
 #  4. OPTIONS
 #
 #  This part of the configuration file contains options that control
-#  how Privoxy operates.
+#  how Junkbuster operates.
 #
 
+#
 #  Admin-address should be set to the email address of the proxy
 #  administrator. It is used in many of the proxy-generated pages.
 #
-#  Default: Do not display an e-mail address
+#  Default: fill@me.in.please
 #
-admin-address fill@me.in.please
+#admin-address fill@me.in.please
 
 #
 #  Proxy-info-url can be set to a URL that contains more info about
-#  this Privoxy installation, it's configuration and policies.
+#  this junkbuster installation, it's configuration and policies.
 #  It is used in many of the proxy-generated pages and its use is
 #  highly recommended, since your users will want to know why certain
 #  content is blocked or modified.
@@ -178,41 +183,41 @@ admin-address fill@me.in.please
 proxy-info-url http://www.your-site.com/proxy.html
 
 #
-#  Listen-address specifies the address and port where Privoxy will
+#  Listen-address specifies the address and port where Junkbuster will
 #  listen for connections from your Web browser.  The default is to
-#  listen on the local host on port 8118, and this is suitable for
+#  listen on the local host on port 8000, and this is suitable for
 #  most users.  (In your web browser, under proxy configuration, list
-#  the proxy server as 'localhost' and the port as '8118').
+#  the proxy server as 'localhost' and the port as '8000').
 # 
-#  If you already have another service running on port 8118, or if you
+#  If you already have another service running on port 8000, or if you
 #  want to serve requests from other machines (e.g. on your local
 #  network) as well, you will need to override the default. The syntax
 #  is "listen-address [<ip-address>]:<port>" If you leave out the ip
-#  adress, Privoxy will bind to all interfaces (addresses) on your
+#  adress, junkbuster will bind to all interfaces (addresses) on your
 #  machine and may become reachable from the internet. In that case,
 #  consider using access control lists (acl's) (see "aclfile" above).
 #
-#  For example, suppose you are running Privoxy on a machine which
+#  For example, suppose you are running Junkbuster on a machine which
 #  has the address 192.168.0.1 on your local private network
 #  (192.168.0.0) and has another outside connection with a different
 #  address. You want it to serve requests from inside only:
 #
-#     listen-address 192.168.0.1:8118
+#     listen-address 192.168.0.1:8000
 #
 #  If you want it to listen on all addresses (including the outside
 #  connection):
 #
-#     listen-address :8118
+#     listen-address :8000
 #
 #  If you do this, consider using acls (see "aclfile" above).
 #
 #  Note: you will need to point your browser(s) to the address
 #  and port that you have configured here.
 #
-#  Default:  listen-address    localhost:8118 
-#            listen-address    127.0.0.1:8118
+#  Default:  listen-address    localhost:8000 
+#            listen-address    127.0.0.1:8000
 #
-listen-address 127.0.0.1:8118
+
 
 #
 #  The debug option sets the level of debugging information to log in
@@ -231,7 +236,6 @@ listen-address 127.0.0.1:8118
 #   debug       128 #      = debug fast redirects
 #   debug       256 #      = debug GIF deanimation
 #   debug       512 # CLF  = Common Log Format
-#   debug     1024 #        = debug kill popups
 #   debug      4096 # INFO = Startup banner and warnings.
 #   debug      8192 # ERROR = Non-fatal errors
 #
@@ -239,7 +243,7 @@ listen-address 127.0.0.1:8118
 #  reporting.  (debug 8192).
 #
 #  The reporting of FATAL errors (i.e. ones which crash 
-#  Privoxy) is always on and cannot be disabled.
+#  JunkBuster) is always on and cannot be disabled.
 #
 #  If you want to use CLF, you should set "debug 512" ONLY,
 #  do not enable anything else.
@@ -256,86 +260,36 @@ debug   4096 # Info
 debug   8192 # Errors - *we highly recommended enabling this*
 
 #
-#  Privoxy normally uses "multi-threading", a software technique
+#  Junkbuster normally uses "multi-threading", a software technique
 #  that permits it to handle many different requests simultaneously.
 #  In some cases you may wish to disable this -- particularly if
 #  you're trying to debug a problem.  The 'single-threaded' option
-#  forces Privoxy to handle requests sequentially.
+#  forces Junkbuster to handle requests sequentially.
 #
 #  Default: Multithreaded mode
 #
 #single-threaded
 
 #
-#    'toggle' allows you to temporarily disable all Privoxy's 
+#    'toggle' allows you to temporarily disable all Junkbuster's 
 #    filtering.  Just set "toggle 0".
 #    
-#    This can now be toggled remotely, through the web-based config
-#    interface.  There is no reason to edit this file any more.
-#
-#    The Windows version of Privoxy puts an icon in the system
+#    The Windows version of Junkbuster puts an icon in the system
 #    tray, which allows you to change this option without having
 #    to edit this file.  If you right-click on that icon (or select
 #    the 'Options' menu), one choice is "Enable".  Clicking on enable
-#    toggles Privoxy on and off.  This is useful if you want to
-#    temporarily disable Privoxy, e.g., to access a site that
+#    toggles Junkbuster on and off.  This is useful if you want to
+#    temporarily disable Junkbuster, e.g., to access a site that
 #    requires cookies which you normally have blocked.
 #
-#    'toggle 1' means Privoxy runs normally, 'toggle 0' means
-#    that Privoxy becomes a non-anonymizing non-blocking
+#    'toggle 1' means Junkbuster runs normally, 'toggle 0' means
+#    that Junkbuster becomes a non-anonymizing non-blocking
 #    proxy.
 #
 #  Default: 1
 #
 toggle 1
 
-#
-#  For content filtering, i.e. the +filter and +deanimate-gif
-#  actions, it is neccessary that Privoxy buffers up the
-#  whole document body. This can be potentially dangerous, since
-#  a server could just keep sending data indefinitely and wait
-#  for your RAM to exhaust.
-#  The buffer-limit option lets you set the size in Kbytes that
-#  each buffer may use at maximum. When the documents buffer
-#  exceeds that size, it is flushed to the client unfiltered and 
-#  no further attempt to filter the rest of it is taken.
-#  Remember that there may multiple threads running, which might
-#  require up to buffer-limit Kbytes *each*, unless you have set
-#  single-threaded below.
-#
-#  Default: 4069, i.e. 4 MB
-#
-buffer-limit 4069
-
-
-#
-#  Enable the web-based actionsfile editor.  Set to 1 to enable,
-#  0 to disable.  Note that you must have compiled Privoxy
-#  with support for this feature, otherwise this option has no
-#  effect.
-#
-#  Security note:  If this is enabled, anyone who can use the proxy
-#  can edit the actions file, and their changes will affect all users.
-#  For shared proxies, you probably want to disable this.
-#
-#  Default: Disabled
-#
-enable-edit-actions 1
-
-
-#
-#  Allow Privoxy to be toggled on and off remotely, using your
-#  web browser.  Set to 1 to enable, 0 to disable.  Note that you
-#  must have compiled Privoxy with support for this feature,
-#  otherwise this option has no effect.
-#
-#  Security note:  If this is enabled, anyone who can use the proxy
-#  can toggle it on or off, and their changes will affect all users.
-#  For shared proxies, you probably want to disable this.
-#
-#  Default: Disabled
-#
-enable-remote-toggle 1
 
 #############################################################################
 # Access Control List
@@ -377,11 +331,11 @@ enable-remote-toggle 1
 #
 # IMPORTANT NOTE
 # ==============
-# If Privoxy is using a forwarder or a gateway for a particular 
+# If the junkbuster is using a forwarder or a gateway for a particular 
 # destination URL, the DST_ADDRR that is examined is the address of
 # the forwarder or the gateway and NOT the address of the ultimate target.
 # This is necessary because it may be impossible for the local
-# Privoxy to determine the address of the ultimate target
+# junkbuster to determine the address of the ultimate target
 # (that's often what gateways are used for).
 #
 # Here are a few examples to show how the ACL works:
@@ -391,14 +345,13 @@ enable-remote-toggle 1
 #
 # a silly example to illustrate:
 #
-# permit any host on the class-C subnet with our web server to go
-# anywhere
+# permit any host on the class-C subnet with junkbusters to go anywhere
 #
-# permit-access www.example.com/24
+# permit-access www.junkbusters.com/24
 #
 # except deny one particular IP address from using it at all
 #
-# deny-access      hacker.example.com
+# deny-access      ident.junkbusters.com
 #
 # another example
 #
@@ -417,7 +370,7 @@ enable-remote-toggle 1
 #
 # to allow all .org domains; every IP-address listed must resolve fully.
 #
-# An ISP may want to provide a Privoxy that is accessible by "the world"
+# An ISP may want to provide a junkbuster that is accessible by "the world"
 # and yet restrict use of some of their private content to hosts on its
 # internal network (i.e. its own subscribers).  Say, for instance the
 # ISP owns the Class-B IP address block 123.124.0.0 (a 16 bit netmask).
@@ -475,13 +428,13 @@ enable-remote-toggle 1
 #
 # In the following common configuration, everything goes to Lucent's LPWA,
 # except SSL on port 443 (which it doesn't handle)
-#    forward .*    lpwa.com:8118
+#    forward .*    lpwa.com:8000
 #    forward :443 .
 #
 # See the FAQ for instructions on how to automate the login procedure for LPWA.
 # Some users have reported difficulties related to LPWA's use of . as the
 # last element of the domain, and have said that this can be fixed with this:
-#    forward lpwa.  lpwa.com:8118
+#    forward lpwa.  lpwa.com:8000
 # (NOTE: the syntax for specifiying target_domain has changed since the
 # previous paragraph weas written - it will not work now.  More information
 # is welcome.)
@@ -489,7 +442,7 @@ enable-remote-toggle 1
 # In this fictitious example, everything goes via an ISP's caching proxy,
 # except requests to that ISP:
 #
-# forward .* caching.myisp.net:8118
+# forward .* caching.myisp.net:8000
 # forward myisp.net .
 #
 # For the @home network, we're told the forwarding configuration is this:
@@ -502,12 +455,12 @@ enable-remote-toggle 1
 # but everything else goes through Lucent's LPWA by way of the company's
 # SOCKS gateway to the Internet.
 #
-# forward-socks4 .* lpwa.com:8118 firewall.my_company.com:1080
+# forward_socks4 .* lpwa.com:8000 firewall.my_company.com:1080
 # forward my_company.com .
 #
 # This is how you could set up a site that always uses SOCKS but no forwarders
 #
-# forward-socks4a .* . firewall.my_company.com:1080
+# forward_socks4a .* . firewall.my_company.com:1080
 #
 # An advanced example for network administrators:
 #
@@ -521,13 +474,13 @@ enable-remote-toggle 1
 # host-a has a PPP connection to isp-a.com
 # host-b has a PPP connection to isp-b.com
 #
-# host-a can run Privoxy with forwarding like this:
+# host-a can run an Internet Junkbuster proxy with forwarding like this:
 #   forward .* .
-#   forward isp-b.com host-b:8118
+#   forward isp-b.com host-b:8000
 #
-# host-b can run Privoxy with forwarding like this:
+# host-b can run an Internet Junkbuster proxy with forwarding like this:
 #   forward .* .
-#   forward isp-a.com host-a:8118
+#   forward isp-a.com host-a:8000
 #
 # Now, *anyone* on the Internet (including users on host-a and host-b)
 # can set their browser's proxy to *either* host-a or host-b and
@@ -546,45 +499,25 @@ enable-remote-toggle 1
 #   forward localhost.localdomain . # Loopback address
 #   forward www.ukc.mirror.ac.uk  . # Specific host
 #
-#
-# Note: If you intend to chain Privoxy and squid locally, the chain
-#       broswer -> squid -> Privoxy is the recommended way.
-#
-#       Your squid configuration could then look like this:
-#
-#       # Define Privoxy as parent cache 
-#       cache_peer 127.0.0.1 8118 parent 0 no-query 
-#
-#       # Define ACL for protocol FTP 
-#       acl FTP proto FTP 
-#
-#       # Do not forward ACL FTP to Privoxy 
-#       always_direct allow FTP 
-#
-#       # Do not forward ACL CONNECT (https) to Privoxy 
-#       always_direct allow CONNECT 
-#
-#       # Forward the rest to Privoxy 
-#       never_direct allow all 
-#
+
 
 #############################################################################
 #  5. WINDOWS GUI OPTIONS
 #############################################################################
 #
-#  Privoxy has a number of options specific to the Windows GUI
+#  Junkbuster has a number of options specific to the Windows GUI
 #  interface:
 #
 #    activity-animation      {1 or 0}
 #
-#    If set to 1, the Privoxy icon will animate when Privoxy is
+#    If set to 1, the Junkbuster icon will animate when Junkbuster is
 #    active.
 #
 #Win32-only: activity-animation      1
 
 #    log-messages            {1 or 0}
 #
-#    If set to 1, Privoxy will log messages to the console window.
+#    If set to 1, Junkbuster will log messages to the console window.
 #
 #Win32-only: log-messages            1
 
@@ -607,7 +540,7 @@ enable-remote-toggle 1
 
 #    log-highlight-messages  {1 or 0}
 #
-#    If set to 1, Privoxy will highlight portions of the log
+#    If set to 1, Junkbuster will highlight portions of the log
 #    messages with a bold-faced font.
 #
 #Win32-only: log-highlight-messages  1
@@ -626,7 +559,7 @@ enable-remote-toggle 1
 
 #    show-on-task-bar        {1 or 0}
 #
-#    Controls whether or not Privoxy will appear as a button on the Task
+#    Controls whether or not Junkbuster will appear as a button on the Task
 #    bar when minimized.
 #
 #Win32-only: show-on-task-bar        0
@@ -634,7 +567,7 @@ enable-remote-toggle 1
 
 #    close-button-minimizes  1
 #
-#    If set, the Windows close button will minimize Privoxy instead
+#    If set, the Windows close button will minimize Junkbuster instead
 #    of closing the program (close with the exit option on the File
 #    menu).
 #
@@ -642,15 +575,15 @@ enable-remote-toggle 1
 
 
 #
-#  This option is specific to the Win32 console version of Privoxy:
+#  This option is specific to the Win32 console version of JunkBuster:
 #
 #    hide-console
 #
-#    If this option is used, Privoxy will disconnect from and hide 
+#    If this option is used, Junkbuster will disconnect from and hide 
 #    the command console.
 #
 #Win32-only: #hide-console
 
 
-# Note: Privoxy is distributed under the GNU General Public License (GPL)
+# Note: Junkbuster is distributed under the GNU General Public License (GPL)
 #       For details, see http://www.gnu.org/copyleft/gpl.html
diff --git a/config.guess b/config.guess
deleted file mode 100755 (executable)
index cd430f6..0000000
+++ /dev/null
@@ -1,1314 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-#   Free Software Foundation, Inc.
-
-timestamp='2001-08-21'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Written by Per Bothner <bothner@cygnus.com>.
-# Please send patches to <config-patches@gnu.org>.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
-    --version | -v )
-       echo "$version" ; exit 0 ;;
-    --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )        # Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-
-dummy=dummy-$$
-trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script.
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int dummy(){}" > $dummy.c ;
-       for c in cc gcc c89 ; do
-         ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
-         if test $? = 0 ; then
-            CC_FOR_BUILD="$c"; break ;
-         fi ;
-       done ;
-       rm -f $dummy.c $dummy.o $dummy.rel ;
-       if test x"$CC_FOR_BUILD" = x ; then
-         CC_FOR_BUILD=no_compiler_found ;
-       fi
-       ;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-       PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-       # Netbsd (nbsd) targets should (where applicable) match one or
-       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-       # switched to ELF, *-*-netbsd* would select the old
-       # object file format.  This provides both forward
-       # compatibility and a consistent mechanism for selecting the
-       # object file format.
-       # Determine the machine/vendor (is the vendor relevant).
-       case "${UNAME_MACHINE}" in
-           amiga) machine=m68k-unknown ;;
-           arm32) machine=arm-unknown ;;
-           atari*) machine=m68k-atari ;;
-           sun3*) machine=m68k-sun ;;
-           mac68k) machine=m68k-apple ;;
-           macppc) machine=powerpc-apple ;;
-           hp3[0-9][05]) machine=m68k-hp ;;
-           ibmrt|romp-ibm) machine=romp-ibm ;;
-           *) machine=${UNAME_MACHINE}-unknown ;;
-       esac
-       # The Operating System including object format, if it has switched
-       # to ELF recently, or will in the future.
-       case "${UNAME_MACHINE}" in
-           i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
-               eval $set_cc_for_build
-               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-                       | grep __ELF__ >/dev/null
-               then
-                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-                   # Return netbsd for either.  FIX?
-                   os=netbsd
-               else
-                   os=netbsdelf
-               fi
-               ;;
-           *)
-               os=netbsd
-               ;;
-       esac
-       # The OS release
-       release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-       # contains redundant information, the shorter form:
-       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-       echo "${machine}-${os}${release}"
-       exit 0 ;;
-    alpha:OSF1:*:*)
-       if test $UNAME_RELEASE = "V4.0"; then
-               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-       fi
-       # A Vn.n version is a released version.
-       # A Tn.n version is a released field test version.
-       # A Xn.n version is an unreleased experimental baselevel.
-       # 1.2 uses "1.2" for uname -r.
-       cat <<EOF >$dummy.s
-       .data
-\$Lformat:
-       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
-
-       .text
-       .globl main
-       .align 4
-       .ent main
-main:
-       .frame \$30,16,\$26,0
-       ldgp \$29,0(\$27)
-       .prologue 1
-       .long 0x47e03d80 # implver \$0
-       lda \$2,-1
-       .long 0x47e20c21 # amask \$2,\$1
-       lda \$16,\$Lformat
-       mov \$0,\$17
-       not \$1,\$18
-       jsr \$26,printf
-       ldgp \$29,0(\$26)
-       mov 0,\$16
-       jsr \$26,exit
-       .end main
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
-       if test "$?" = 0 ; then
-               case `./$dummy` in
-                       0-0)
-                               UNAME_MACHINE="alpha"
-                               ;;
-                       1-0)
-                               UNAME_MACHINE="alphaev5"
-                               ;;
-                       1-1)
-                               UNAME_MACHINE="alphaev56"
-                               ;;
-                       1-101)
-                               UNAME_MACHINE="alphapca56"
-                               ;;
-                       2-303)
-                               UNAME_MACHINE="alphaev6"
-                               ;;
-                       2-307)
-                               UNAME_MACHINE="alphaev67"
-                               ;;
-                       2-1307)
-                               UNAME_MACHINE="alphaev68"
-                               ;;
-               esac
-       fi
-       rm -f $dummy.s $dummy
-       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-       exit 0 ;;
-    Alpha\ *:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # Should we change UNAME_MACHINE based on the output of uname instead
-       # of the specific Alpha model?
-       echo alpha-pc-interix
-       exit 0 ;;
-    21064:Windows_NT:50:3)
-       echo alpha-dec-winnt3.5
-       exit 0 ;;
-    Amiga*:UNIX_System_V:4.0:*)
-       echo m68k-unknown-sysv4
-       exit 0;;
-    amiga:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-       echo ${UNAME_MACHINE}-unknown-amigaos
-       exit 0 ;;
-    arc64:OpenBSD:*:*)
-       echo mips64el-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    arc:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    hkmips:OpenBSD:*:*)
-       echo mips-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    pmax:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    sgi:OpenBSD:*:*)
-       echo mips-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    wgrisc:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    *:OS/390:*:*)
-       echo i370-ibm-openedition
-       exit 0 ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-       echo arm-acorn-riscix${UNAME_RELEASE}
-       exit 0;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-       echo hppa1.1-hitachi-hiuxmpp
-       exit 0;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-       if test "`(/bin/universe) 2>/dev/null`" = att ; then
-               echo pyramid-pyramid-sysv3
-       else
-               echo pyramid-pyramid-bsd
-       fi
-       exit 0 ;;
-    NILE*:*:*:dcosx)
-       echo pyramid-pyramid-svr4
-       exit 0 ;;
-    sun4H:SunOS:5.*:*)
-       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    i86pc:SunOS:5.*:*)
-       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:6*:*)
-       # According to config.sub, this is the proper way to canonicalize
-       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-       # it's likely to be more like Solaris than SunOS4.
-       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:*:*)
-       case "`/usr/bin/arch -k`" in
-           Series*|S4*)
-               UNAME_RELEASE=`uname -v`
-               ;;
-       esac
-       # Japanese Language versions have a version number like `4.1.3-JL'.
-       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-       exit 0 ;;
-    sun3*:SunOS:*:*)
-       echo m68k-sun-sunos${UNAME_RELEASE}
-       exit 0 ;;
-    sun*:*:4.2BSD:*)
-       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-       case "`/bin/arch`" in
-           sun3)
-               echo m68k-sun-sunos${UNAME_RELEASE}
-               ;;
-           sun4)
-               echo sparc-sun-sunos${UNAME_RELEASE}
-               ;;
-       esac
-       exit 0 ;;
-    aushp:SunOS:*:*)
-       echo sparc-auspex-sunos${UNAME_RELEASE}
-       exit 0 ;;
-    sparc*:NetBSD:*)
-       echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
-       exit 0 ;;
-    atari*:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-       exit 0 ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-       echo m68k-atari-mint${UNAME_RELEASE}
-        exit 0 ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-       exit 0 ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit 0 ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit 0 ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit 0 ;;
-    sun3*:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mac68k:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mvme68k:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mvme88k:OpenBSD:*:*)
-       echo m88k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    powerpc:machten:*:*)
-       echo powerpc-apple-machten${UNAME_RELEASE}
-       exit 0 ;;
-    RISC*:Mach:*:*)
-       echo mips-dec-mach_bsd4.3
-       exit 0 ;;
-    RISC*:ULTRIX:*:*)
-       echo mips-dec-ultrix${UNAME_RELEASE}
-       exit 0 ;;
-    VAX*:ULTRIX*:*:*)
-       echo vax-dec-ultrix${UNAME_RELEASE}
-       exit 0 ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-       echo clipper-intergraph-clix${UNAME_RELEASE}
-       exit 0 ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-       sed 's/^        //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-       #if defined (host_mips) && defined (MIPSEB)
-       #if defined (SYSTYPE_SYSV)
-         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_SVR4)
-         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-       #endif
-       #endif
-         exit (-1);
-       }
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.c -o $dummy \
-         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
-         && rm -f $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       echo mips-mips-riscos${UNAME_RELEASE}
-       exit 0 ;;
-    Motorola:PowerMAX_OS:*:*)
-       echo powerpc-motorola-powermax
-       exit 0 ;;
-    Night_Hawk:Power_UNIX:*:*)
-       echo powerpc-harris-powerunix
-       exit 0 ;;
-    m88k:CX/UX:7*:*)
-       echo m88k-harris-cxux7
-       exit 0 ;;
-    m88k:*:4*:R4*)
-       echo m88k-motorola-sysv4
-       exit 0 ;;
-    m88k:*:3*:R3*)
-       echo m88k-motorola-sysv3
-       exit 0 ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-       then
-           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-              [ ${TARGET_BINARY_INTERFACE}x = x ]
-           then
-               echo m88k-dg-dgux${UNAME_RELEASE}
-           else
-               echo m88k-dg-dguxbcs${UNAME_RELEASE}
-           fi
-       else
-           echo i586-dg-dgux${UNAME_RELEASE}
-       fi
-       exit 0 ;;
-    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
-       echo m88k-dolphin-sysv3
-       exit 0 ;;
-    M88*:*:R3*:*)
-       # Delta 88k system running SVR3
-       echo m88k-motorola-sysv3
-       exit 0 ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-       echo m88k-tektronix-sysv3
-       exit 0 ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-       echo m68k-tektronix-bsd
-       exit 0 ;;
-    *:IRIX*:*:*)
-       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-       exit 0 ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
-       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-       echo i386-ibm-aix
-       exit 0 ;;
-    ia64:AIX:*:*)
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
-       else
-               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-       fi
-       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-       exit 0 ;;
-    *:AIX:2:3)
-       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-               sed 's/^                //' << EOF >$dummy.c
-               #include <sys/systemcfg.h>
-
-               main()
-                       {
-                       if (!__power_pc())
-                               exit(1);
-                       puts("powerpc-ibm-aix3.2.5");
-                       exit(0);
-                       }
-EOF
-               eval $set_cc_for_build
-               $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
-               rm -f $dummy.c $dummy
-               echo rs6000-ibm-aix3.2.5
-       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-               echo rs6000-ibm-aix3.2.4
-       else
-               echo rs6000-ibm-aix3.2
-       fi
-       exit 0 ;;
-    *:AIX:*:[45])
-       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
-       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-               IBM_ARCH=rs6000
-       else
-               IBM_ARCH=powerpc
-       fi
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
-       else
-               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-       fi
-       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-       exit 0 ;;
-    *:AIX:*:*)
-       echo rs6000-ibm-aix
-       exit 0 ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-       echo romp-ibm-bsd4.4
-       exit 0 ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-       exit 0 ;;                           # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-       echo rs6000-bull-bosx
-       exit 0 ;;
-    DPX/2?00:B.O.S.:*:*)
-       echo m68k-bull-sysv3
-       exit 0 ;;
-    9000/[34]??:4.3bsd:1.*:*)
-       echo m68k-hp-bsd
-       exit 0 ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-       echo m68k-hp-bsd4.4
-       exit 0 ;;
-    9000/[34678]??:HP-UX:*:*)
-       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-       case "${UNAME_MACHINE}" in
-           9000/31? )            HP_ARCH=m68000 ;;
-           9000/[34]?? )         HP_ARCH=m68k ;;
-           9000/[678][0-9][0-9])
-              case "${HPUX_REV}" in
-                11.[0-9][0-9])
-                  if [ -x /usr/bin/getconf ]; then
-                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-                        esac ;;
-                    esac
-                  fi ;;
-              esac
-              if [ "${HP_ARCH}" = "" ]; then
-              sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-               {
-               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-               case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-                   switch (bits)
-                       {
-                       case 64: puts ("hppa2.0w"); break;
-                       case 32: puts ("hppa2.0n"); break;
-                       default: puts ("hppa2.0"); break;
-                       } break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-                   puts ("hppa2.0"); break;
-              #endif
-               default: puts ("hppa1.0"); break;
-               }
-                  exit (0);
-              }
-EOF
-       eval $set_cc_for_build
-       (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
-       if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
-       rm -f $dummy.c $dummy
-       fi ;;
-       esac
-       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-       exit 0 ;;
-    ia64:HP-UX:*:*)
-       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-       echo ia64-hp-hpux${HPUX_REV}
-       exit 0 ;;
-    3050*:HI-UX:*:*)
-       sed 's/^        //' << EOF >$dummy.c
-       #include <unistd.h>
-       int
-       main ()
-       {
-         long cpu = sysconf (_SC_CPU_VERSION);
-         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-            results, however.  */
-         if (CPU_IS_PA_RISC (cpu))
-           {
-             switch (cpu)
-               {
-                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-                 default: puts ("hppa-hitachi-hiuxwe2"); break;
-               }
-           }
-         else if (CPU_IS_HP_MC68K (cpu))
-           puts ("m68k-hitachi-hiuxwe2");
-         else puts ("unknown-hitachi-hiuxwe2");
-         exit (0);
-       }
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       echo unknown-hitachi-hiuxwe2
-       exit 0 ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-       echo hppa1.1-hp-bsd
-       exit 0 ;;
-    9000/8??:4.3bsd:*:*)
-       echo hppa1.0-hp-bsd
-       exit 0 ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-       echo hppa1.0-hp-mpeix
-       exit 0 ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-       echo hppa1.1-hp-osf
-       exit 0 ;;
-    hp8??:OSF1:*:*)
-       echo hppa1.0-hp-osf
-       exit 0 ;;
-    i*86:OSF1:*:*)
-       if [ -x /usr/sbin/sysversion ] ; then
-           echo ${UNAME_MACHINE}-unknown-osf1mk
-       else
-           echo ${UNAME_MACHINE}-unknown-osf1
-       fi
-       exit 0 ;;
-    parisc*:Lites*:*:*)
-       echo hppa1.1-hp-lites
-       exit 0 ;;
-    hppa*:OpenBSD:*:*)
-       echo hppa-unknown-openbsd
-       exit 0 ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-       echo c1-convex-bsd
-        exit 0 ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-        exit 0 ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-       echo c34-convex-bsd
-        exit 0 ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-       echo c38-convex-bsd
-        exit 0 ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-       echo c4-convex-bsd
-        exit 0 ;;
-    CRAY*X-MP:*:*:*)
-       echo xmp-cray-unicos
-        exit 0 ;;
-    CRAY*Y-MP:*:*:*)
-       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*[A-Z]90:*:*:*)
-       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-             -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*TS:*:*:*)
-       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*T3D:*:*:*)
-       echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*T3E:*:*:*)
-       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*SV1:*:*:*)
-       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY-2:*:*:*)
-       echo cray2-cray-unicos
-        exit 0 ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit 0 ;;
-    hp300:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    sparc*:BSD/OS:*:*)
-       echo sparc-unknown-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    *:BSD/OS:*:*)
-       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    *:FreeBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-       exit 0 ;;
-    *:OpenBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-       exit 0 ;;
-    i*:CYGWIN*:*)
-       echo ${UNAME_MACHINE}-pc-cygwin
-       exit 0 ;;
-    i*:MINGW*:*)
-       echo ${UNAME_MACHINE}-pc-mingw32
-       exit 0 ;;
-    i*:PW*:*)
-       echo ${UNAME_MACHINE}-pc-pw32
-       exit 0 ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-       # UNAME_MACHINE based on the output of uname instead of i386?
-       echo i386-pc-interix
-       exit 0 ;;
-    i*:UWIN*:*)
-       echo ${UNAME_MACHINE}-pc-uwin
-       exit 0 ;;
-    p*:CYGWIN*:*)
-       echo powerpcle-unknown-cygwin
-       exit 0 ;;
-    prep*:SunOS:5.*:*)
-       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    *:GNU:*:*)
-       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-       exit 0 ;;
-    i*86:Minix:*:*)
-       echo ${UNAME_MACHINE}-pc-minix
-       exit 0 ;;
-    arm*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    ia64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux
-       exit 0 ;;
-    m68*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    mips:Linux:*:*)
-       case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
-         big)    echo mips-unknown-linux-gnu && exit 0 ;;
-         little) echo mipsel-unknown-linux-gnu && exit 0 ;;
-       esac
-       ;;
-    ppc:Linux:*:*)
-       echo powerpc-unknown-linux-gnu
-       exit 0 ;;
-    ppc64:Linux:*:*)
-       echo powerpc64-unknown-linux-gnu
-       exit 0 ;;
-    alpha:Linux:*:*)
-       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-         EV5)   UNAME_MACHINE=alphaev5 ;;
-         EV56)  UNAME_MACHINE=alphaev56 ;;
-         PCA56) UNAME_MACHINE=alphapca56 ;;
-         PCA57) UNAME_MACHINE=alphapca56 ;;
-         EV6)   UNAME_MACHINE=alphaev6 ;;
-         EV67)  UNAME_MACHINE=alphaev67 ;;
-         EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-       exit 0 ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-       # Look for CPU level
-       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-         PA7*) echo hppa1.1-unknown-linux-gnu ;;
-         PA8*) echo hppa2.0-unknown-linux-gnu ;;
-         *)    echo hppa-unknown-linux-gnu ;;
-       esac
-       exit 0 ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-       echo hppa64-unknown-linux-gnu
-       exit 0 ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-       echo ${UNAME_MACHINE}-ibm-linux
-       exit 0 ;;
-    sh*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    x86_64:Linux:*:*)
-       echo x86_64-unknown-linux-gnu
-       exit 0 ;;
-    i*86:Linux:*:*)
-       # The BFD linker knows what the default object file format is, so
-       # first see if it will tell us. cd to the root directory to prevent
-       # problems with other programs or directories called `ld' in the path.
-       ld_supported_targets=`cd /; ld --help 2>&1 \
-                        | sed -ne '/supported targets:/!d
-                                   s/[         ][      ]*/ /g
-                                   s/.*supported targets: *//
-                                   s/ .*//
-                                   p'`
-        case "$ld_supported_targets" in
-         elf32-i386)
-               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-               ;;
-         a.out-i386-linux)
-               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-               exit 0 ;;               
-         coff-i386)
-               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-               exit 0 ;;
-         "")
-               # Either a pre-BFD a.out linker (linux-gnuoldld) or
-               # one that does not give us useful --help.
-               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-               exit 0 ;;
-       esac
-       # Determine whether the default compiler is a.out or elf
-       cat >$dummy.c <<EOF
-#include <features.h>
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __ELF__
-# ifdef __GLIBC__
-#  if __GLIBC__ >= 2
-    printf ("%s-pc-linux-gnu\n", argv[1]);
-#  else
-    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-#  endif
-# else
-   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-# endif
-#else
-  printf ("%s-pc-linux-gnuaout\n", argv[1]);
-#endif
-  return 0;
-}
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
-       ;;
-    i*86:DYNIX/ptx:4*:*)
-       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-       # earlier versions are messed up and put the nodename in both
-       # sysname and nodename.
-       echo i386-sequent-sysv4
-       exit 0 ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-       # I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-       exit 0 ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-       else
-               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-       fi
-       exit 0 ;;
-    i*86:*:5:[78]*)
-       case `/bin/uname -X | grep "^Machine"` in
-           *486*)           UNAME_MACHINE=i486 ;;
-           *Pentium)        UNAME_MACHINE=i586 ;;
-           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-       esac
-       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-       exit 0 ;;
-    i*86:*:3.2:*)
-       if test -f /usr/options/cb.name; then
-               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-       elif /bin/uname -X 2>/dev/null >/dev/null ; then
-               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
-               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
-               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
-                       && UNAME_MACHINE=i586
-               (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-       else
-               echo ${UNAME_MACHINE}-pc-sysv32
-       fi
-       exit 0 ;;
-    i*86:*DOS:*:*)
-       echo ${UNAME_MACHINE}-pc-msdosdjgpp
-       exit 0 ;;
-    pc:*:*:*)
-       # Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-       echo i386-pc-msdosdjgpp
-        exit 0 ;;
-    Intel:Mach:3*:*)
-       echo i386-pc-mach3
-       exit 0 ;;
-    paragon:*:*:*)
-       echo i860-intel-osf1
-       exit 0 ;;
-    i860:*:4.*:*) # i860-SVR4
-       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-       else # Add other i860-SVR4 vendors below as they are discovered.
-         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-       fi
-       exit 0 ;;
-    mini*:CTIX:SYS*5:*)
-       # "miniframe"
-       echo m68010-convergent-sysv
-       exit 0 ;;
-    M68*:*:R3V[567]*:*)
-       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
-       OS_REL=''
-       test -r /etc/.relid \
-       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
-       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && echo i486-ncr-sysv4 && exit 0 ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-       echo m68k-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    mc68030:UNIX_System_V:4.*:*)
-       echo m68k-atari-sysv4
-       exit 0 ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-       echo i386-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    TSUNAMI:LynxOS:2.*:*)
-       echo sparc-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    rs6000:LynxOS:2.*:*)
-       echo rs6000-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-       echo powerpc-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    SM[BE]S:UNIX_SV:*:*)
-       echo mips-dde-sysv${UNAME_RELEASE}
-       exit 0 ;;
-    RM*:ReliantUNIX-*:*:*)
-       echo mips-sni-sysv4
-       exit 0 ;;
-    RM*:SINIX-*:*:*)
-       echo mips-sni-sysv4
-       exit 0 ;;
-    *:SINIX-*:*:*)
-       if uname -p 2>/dev/null >/dev/null ; then
-               UNAME_MACHINE=`(uname -p) 2>/dev/null`
-               echo ${UNAME_MACHINE}-sni-sysv4
-       else
-               echo ns32k-sni-sysv
-       fi
-       exit 0 ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit 0 ;;
-    *:UNIX_System_V:4*:FTX*)
-       # From Gerald Hewes <hewes@openmarket.com>.
-       # How about differentiating between stratus architectures? -djm
-       echo hppa1.1-stratus-sysv4
-       exit 0 ;;
-    *:*:*:FTX*)
-       # From seanf@swdc.stratus.com.
-       echo i860-stratus-sysv4
-       exit 0 ;;
-    *:VOS:*:*)
-       # From Paul.Green@stratus.com.
-       echo hppa1.1-stratus-vos
-       exit 0 ;;
-    mc68*:A/UX:*:*)
-       echo m68k-apple-aux${UNAME_RELEASE}
-       exit 0 ;;
-    news*:NEWS-OS:6*:*)
-       echo mips-sony-newsos6
-       exit 0 ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-       if [ -d /usr/nec ]; then
-               echo mips-nec-sysv${UNAME_RELEASE}
-       else
-               echo mips-unknown-sysv${UNAME_RELEASE}
-       fi
-        exit 0 ;;
-    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
-       echo powerpc-be-beos
-       exit 0 ;;
-    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
-       echo powerpc-apple-beos
-       exit 0 ;;
-    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
-       echo i586-pc-beos
-       exit 0 ;;
-    SX-4:SUPER-UX:*:*)
-       echo sx4-nec-superux${UNAME_RELEASE}
-       exit 0 ;;
-    SX-5:SUPER-UX:*:*)
-       echo sx5-nec-superux${UNAME_RELEASE}
-       exit 0 ;;
-    Power*:Rhapsody:*:*)
-       echo powerpc-apple-rhapsody${UNAME_RELEASE}
-       exit 0 ;;
-    *:Rhapsody:*:*)
-       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-       exit 0 ;;
-    *:Darwin:*:*)
-       echo `uname -p`-apple-darwin${UNAME_RELEASE}
-       exit 0 ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-       if test "${UNAME_MACHINE}" = "x86pc"; then
-               UNAME_MACHINE=pc
-       fi
-       echo `uname -p`-${UNAME_MACHINE}-nto-qnx
-       exit 0 ;;
-    *:QNX:*:4*)
-       echo i386-pc-qnx
-       exit 0 ;;
-    NSR-[KW]:NONSTOP_KERNEL:*:*)
-       echo nsr-tandem-nsk${UNAME_RELEASE}
-       exit 0 ;;
-    *:NonStop-UX:*:*)
-       echo mips-compaq-nonstopux
-       exit 0 ;;
-    BS2000:POSIX*:*:*)
-       echo bs2000-siemens-sysv
-       exit 0 ;;
-    DS/*:UNIX_System_V:*:*)
-       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-       exit 0 ;;
-    *:Plan9:*:*)
-       # "uname -m" is not consistent, so use $cputype instead. 386
-       # is converted to i386 for consistency with other x86
-       # operating systems.
-       if test "$cputype" = "386"; then
-           UNAME_MACHINE=i386
-       else
-           UNAME_MACHINE="$cputype"
-       fi
-       echo ${UNAME_MACHINE}-unknown-plan9
-       exit 0 ;;
-    i*86:OS/2:*:*)
-       # If we were able to find `uname', then EMX Unix compatibility
-       # is probably installed.
-       echo ${UNAME_MACHINE}-pc-os2-emx
-       exit 0 ;;
-    *:TOPS-10:*:*)
-       echo pdp10-unknown-tops10
-       exit 0 ;;
-    *:TENEX:*:*)
-       echo pdp10-unknown-tenex
-       exit 0 ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-       echo pdp10-dec-tops20
-       exit 0 ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-       echo pdp10-xkl-tops20
-       exit 0 ;;
-    *:TOPS-20:*:*)
-       echo pdp10-unknown-tops20
-       exit 0 ;;
-    *:ITS:*:*)
-       echo pdp10-unknown-its
-       exit 0 ;;
-    i*86:XTS-300:*:STOP)
-       echo ${UNAME_MACHINE}-unknown-stop
-       exit 0 ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-         ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-       printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-       printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-eval $set_cc_for_build
-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
-rm -f $dummy.c $dummy
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-       echo c1-convex-bsd
-       exit 0 ;;
-    c2*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-       exit 0 ;;
-    c34*)
-       echo c34-convex-bsd
-       exit 0 ;;
-    c38*)
-       echo c38-convex-bsd
-       exit 0 ;;
-    c4*)
-       echo c4-convex-bsd
-       exit 0 ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-    ftp://ftp.gnu.org/pub/gnu/config/
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..ff77230
--- /dev/null
@@ -0,0 +1,311 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+#ifndef _CONFIG_H
+#define _CONFIG_H
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/acconfig.h,v $
+ *
+ * Purpose     :  This file should be the first thing included in every
+ *                .c file.  (Before even system headers).  It contains 
+ *                #define statements for various features.  It was
+ *                introduced because the compile command line started
+ *                getting ludicrously long with feature defines.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: acconfig.h,v $
+ *    Revision 1.5  2001/07/13 13:48:37  oes
+ *     - (Fix:) Copied CODE_STATUS #define from config.h.in
+ *     - split REGEX #define into REGEX_GNU and REGEX_PCRE
+ *       and removed PCRE.
+ *       (REGEX = REGEX_GNU || REGEX_PCRE per project.h)
+ *     - Moved STATIC (for pcre) here from Makefile.in
+ *     - Introduced STATIC_PCRS #define to allow for dynaimc linking with
+ *       libpcrs
+ *     - Removed PCRS #define, since pcrs is now needed for CGI anyway
+ *
+ *    Revision 1.4  2001/05/29 09:50:24  jongfoster
+ *    Unified blocklist/imagelist/permissionslist.
+ *    File format is still under discussion, but the internal changes
+ *    are (mostly) done.
+ *
+ *    Also modified interceptor behaviour:
+ *    - We now intercept all URLs beginning with one of the following
+ *      prefixes (and *only* these prefixes):
+ *        * http://i.j.b/
+ *        * http://ijbswa.sf.net/config/
+ *        * http://ijbswa.sourceforge.net/config/
+ *    - New interceptors "home page" - go to http://i.j.b/ to see it.
+ *    - Internal changes so that intercepted and fast redirect pages
+ *      are not replaced with an image.
+ *    - Interceptors now have the option to send a binary page direct
+ *      to the client. (i.e. ijb-send-banner uses this)
+ *    - Implemented show-url-info interceptor.  (Which is why I needed
+ *      the above interceptors changes - a typical URL is
+ *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
+ *      The previous mechanism would not have intercepted that, and
+ *      if it had been intercepted then it then it would have replaced
+ *      it with an image.)
+ *
+ *    Revision 1.3  2001/05/26 01:26:34  jongfoster
+ *    New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor.
+ *    This #define cannot be set from ./configure - there's no point, it
+ *    doesn't work yet.  See feature request # 425722
+ *
+ *    Revision 1.2  2001/05/22 17:43:35  oes
+ *
+ *    - Enabled filtering banners by size rather than URL
+ *      by adding patterns that replace all standard banner
+ *      sizes with the "Junkbuster" gif to the re_filterfile
+ *
+ *    - Enabled filtering WebBugs by providing a pattern
+ *      which kills all 1x1 images
+ *
+ *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
+ *      which is selected by the (nonstandard and therefore
+ *      capital) letter 'U' in the option string.
+ *      It causes the quantifiers to be ungreedy by default.
+ *      Appending a ? turns back to greedy (!).
+ *
+ *    - Added a new interceptor ijb-send-banner, which
+ *      sends back the "Junkbuster" gif. Without imagelist or
+ *      MSIE detection support, or if tinygif = 1, or the
+ *      URL isn't recognized as an imageurl, a lame HTML
+ *      explanation is sent instead.
+ *
+ *    - Added new feature, which permits blocking remote
+ *      script redirects and firing back a local redirect
+ *      to the browser.
+ *      The feature is conditionally compiled, i.e. it
+ *      can be disabled with --disable-fast-redirects,
+ *      plus it must be activated by a "fast-redirects"
+ *      line in the config file, has its own log level
+ *      and of course wants to be displayed by show-proxy-args
+ *      Note: Boy, all the #ifdefs in 1001 locations and
+ *      all the fumbling with configure.in and acconfig.h
+ *      were *way* more work than the feature itself :-(
+ *
+ *    - Because a generic redirect template was needed for
+ *      this, tinygif = 3 now uses the same.
+ *
+ *    - Moved GIFs, and other static HTTP response templates
+ *      to project.h
+ *
+ *    - Many minor fixes
+ *
+ *    - Removed some >400 CRs again (Jon, you really worked
+ *      a lot! ;-)
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:58:45  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/*
+ * Version number - Major (X._._)
+ */
+#undef VERSION_MAJOR
+
+/*
+ * Version number - Minor (_.X._)
+ */
+#undef VERSION_MINOR
+
+/*
+ * Version number - Point (_._.X)
+ */
+#undef VERSION_POINT
+
+/*
+ * Version number, as a string
+ */
+#undef VERSION
+
+/*
+ * Status of the code: alpha, beta or stable
+ */
+#undef CODE_STATUS
+
+/*
+ * Regular expression matching for URLs.  (Highly recommended).
+ * If neither of these are defined then you can ony use prefix matching.
+ * Don't bother to change this here! Use configure instead.
+ */
+#undef REGEX_GNU
+#undef REGEX_PCRE
+
+/* 
+ * Should pcre be statically built in instead of linkling with libpcre?
+ * (This is determined by configure depending on the availiability of
+ * libpcre and user preferences). The name is ugly, but pcre needs it.
+ * Don't bother to change this here! Use configure instead.
+ */
+#undef STATIC_PCRE
+
+/* 
+ * Should pcrs be statically built in instead of linkling with libpcrs?
+ * (This is determined by configure depending on the availiability of
+ * libpcrs and user preferences).
+ * Don't bother to change this here! Use configure instead.
+ */
+#undef STATIC_PCRS
+
+/*
+ * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
+ * non-anonymizing proxy.  This is useful if you're trying to access a
+ * blocked or broken site - just change the setting in the config file
+ * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows
+ * GUI).
+ */
+#undef TOGGLE
+
+/*
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps.  This forces it to be 
+ * uncompressed.
+ */
+#undef DENY_GZIP
+
+/*
+ * Enables statistics function.
+ */
+#undef STATISTICS
+
+/*
+ * Bypass filtering for 1 page only
+ */
+#undef FORCE_LOAD
+
+/*
+ * Locally redirect remote script-redirect URLs
+ */
+#undef FAST_REDIRECTS
+
+/*
+ * Split the show-proxy-args page into a page for each config file.
+ */
+#undef SPLIT_PROXY_ARGS
+
+/*
+ * Kills JavaScript popups - window.open, onunload, etc.
+ */
+#undef KILLPOPUPS
+
+/*
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
+ */
+#undef WEBDAV
+
+/*
+ * Detect image requests automatically for MSIE.  Will fall back to
+ * other image-detection methods (i.e. "+image" permission) for other
+ * browsers.
+ *
+ * You must also define IMAGE_BLOCKING to use this feature.
+ *
+ * It detects the following header pair as an image request:
+ *
+ * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
+ * Accept: * / *
+ *
+ * And the following as a HTML request:
+ *
+ * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
+ * Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, * / *
+ *
+ * And no, I haven't got that backwards - IE is being wierd.
+ *
+ * Known limitations: 
+ * 1) If you press shift-reload on a blocked HTML page, you get
+ *    the image "blocked" page, not the HTML "blocked" page.
+ * 2) Once an image "blocked" page has been sent, viewing it 
+ *    in it's own browser window *should* bring up the HTML
+ *    "blocked" page, but it doesn't.  You need to clear the 
+ *    browser cache to get the HTML version again.
+ *
+ * These limitations are due to IE making inconsistent choices
+ * about which "Accept:" header to send.
+ */
+#undef DETECT_MSIE_IMAGES
+
+/*
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
+ */
+#undef IMAGE_BLOCKING
+
+/*
+ * Allows the use of ACL files to control access to the proxy by IP address.
+ */
+#undef ACL_FILES
+
+/*
+ * Allows the use of trust files.
+ */
+#undef TRUST_FILES
+
+/*
+ * Allows the use of jar files to capture cookies.
+ */
+#undef JAR_FILES
+
+/*
+ * Use POSIX threads instead of native threads.
+ */
+#undef FEATURE_PTHREAD
+
+/* Define if you have the bcopy function.  */
+#undef HAVE_BCOPY
+
+/* Define if you have the memmove function.  */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the strerror function.  */
+#undef HAVE_STRERROR
+
+/*
+ * Need to set up this define only for the Pthreads library for
+ * Win32, available from http://sources.redhat.com/pthreads-win32/
+ */
+#if defined(FEATURE_PTHREAD) && defined(_WIN32)
+#define __CLEANUP_C
+#endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */
+
+#endif /* _CONFIG_H */
index 0141117..ce37a0b 100755 (executable)
@@ -1,5 +1,7 @@
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+#ifndef _CONFIG_H
+#define _CONFIG_H
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/config.h.win,v $
@@ -11,7 +13,7 @@
  *                getting ludicrously long with feature defines.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: config.h.win,v $
- *    Revision 1.18  2002/03/24 17:08:12  jongfoster
- *    Version number bump
- *
- *    Revision 1.17  2002/03/24 13:33:26  swa
- *    name change related issues
- *
- *    Revision 1.16  2002/03/16 14:27:22  jongfoster
- *    Ignoring a very common warning.
- *
- *    Revision 1.15  2002/03/13 00:28:32  jongfoster
- *    Hiding all the warnings generated by #include<windows.h>
- *
- *    Revision 1.14  2001/11/30 21:35:54  jongfoster
- *    Bumping version number to 2.9.10
- *
- *    Revision 1.13  2001/10/23 21:24:09  jongfoster
- *    Support for FEATURE_CGI_EDIT_ACTIONS
- *
- *    Revision 1.12  2001/10/07 15:33:14  oes
- *    Removed FEATURE_DENY_GZIP
- *    Bumped up version number
- *
- *    Revision 1.11  2001/09/16 16:59:34  jongfoster
- *    Bugfix - couldn't build resources with previous version.
- *
- *    Revision 1.10  2001/09/16 16:19:02  jongfoster
- *    New version based on latest configure.in and acconfig.h
- *
- *    Revision 1.9  2001/07/30 22:16:07  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/25 19:16:27  oes
- *    Bumping version number to 2.9.8
- *
- *    Revision 1.7  2001/07/21 18:00:07  jongfoster
- *    Bumping version number to 2.9.7
- *
  *    Revision 1.6  2001/07/15 20:08:40  jongfoster
  *    New build files for VC++ which provide the option of POSIX
  *    or Win32 threads.
  *********************************************************************/
 \f
 
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
 /*
  * Version number - Major (X._._)
  */
 /*
  * Version number - Point (_._.X)
  */
-#define VERSION_POINT 13
+#define VERSION_POINT 7
 
 /*
  * Version number, as a string
  */
-#define VERSION "2.9.13"
+#define VERSION "2.9.7"
 
 /*
  * Status of the code: alpha, beta or stable
  */
-#define CODE_STATUS "beta"
+#define CODE_STATUS "alpha"
 
 /*
  * Regular expression matching for URLs.  (Highly recommended).
  * If neither of these are defined then you can ony use prefix matching.
  * Don't bother to change this here! Use configure instead.
  */
-/* #define REGEX_GNU 1 */
+/* #undef REGEX_GNU */
 #define REGEX_PCRE 1
 
 /* 
 #define STATIC_PCRS 1
 
 /*
- * Allows the use of an ACL to control access to the proxy by IP address.
+ * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
+ * non-anonymizing proxy.  This is useful if you're trying to access a
+ * blocked or broken site - just change the setting in the config file
+ * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows
+ * GUI).
+ */
+#define TOGGLE 1
+
+/*
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps.  This forces it to be 
+ * uncompressed.
  */
-#define FEATURE_ACL 1
+#define DENY_GZIP 1
 
 /*
- * Enables the web-based configuration (actionsfile) editor.  If you
- * have a shared proxy, you might want to turn this off.
+ * Enables statistics function.
  */
-#define FEATURE_CGI_EDIT_ACTIONS 1
+#define STATISTICS 1
 
 /*
- * Allows the use of jar files to capture cookies.
+ * Bypass filtering for 1 page only
  */
-#define FEATURE_COOKIE_JAR 1
+#define FORCE_LOAD 1
 
 /*
  * Locally redirect remote script-redirect URLs
  */
-#define FEATURE_FAST_REDIRECTS 1
+#define FAST_REDIRECTS 1
 
 /*
- * Bypass filtering for 1 page only
+ * Split the show-proxy-args page into a page for each config file.
  */
-#define FEATURE_FORCE_LOAD 1
+#define SPLIT_PROXY_ARGS 1
 
 /*
- * Allow blocking using images as well as HTML.
- * If you do not define this then everything is blocked as HTML.
- *
- * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE.
+ * Kills JavaScript popups - window.open, onunload, etc.
+ */
+#define KILLPOPUPS 1
+
+/*
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
  */
-#define FEATURE_IMAGE_BLOCKING 1
+#define WEBDAV 1
 
 /*
  * Detect image requests automatically for MSIE.  Will fall back to
  * other image-detection methods (i.e. "+image" permission) for other
  * browsers.
  *
- * You must also define FEATURE_IMAGE_BLOCKING to use this feature.
+ * You must also define IMAGE_BLOCKING to use this feature.
  *
  * It detects the following header pair as an image request:
  *
  * These limitations are due to IE making inconsistent choices
  * about which "Accept:" header to send.
  */
-#define FEATURE_IMAGE_DETECT_MSIE 1
-
-/*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#define FEATURE_KILL_POPUPS 1
+#define DETECT_MSIE_IMAGES 1
 
 /*
- * Use POSIX threads instead of native threads.
- */
-#define FEATURE_PTHREAD 1
-
-/*
- * Enables statistics function.
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
  */
-#define FEATURE_STATISTICS 1
+#define IMAGE_BLOCKING 1
 
 /*
- * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
- * non-anonymizing proxy.  This is useful if you're trying to access a
- * blocked or broken site - just change the setting in the config file,
- * or use the handy "Disable" menu option in the Windows GUI.
+ * Allows the use of ACL files to control access to the proxy by IP address.
  */
-#define FEATURE_TOGGLE 1
+#define ACL_FILES 1
 
 /*
  * Allows the use of trust files.
  */
-#define FEATURE_TRUST 1
-
-
-/****************************************************************************
- * The following values are correct for MS VC++97.
- * You should normally not change them.
- ***************************************************************************/
-
-
-/*
- * Defined on Solaris only.  Makes the system libraries thread safe.
- */
-/* #define _REENTRANT 1 */
+#define TRUST_FILES 1
 
 /*
- * Defined on Solaris only.  Without this, many important functions are not
- * defined in the system headers.
+ * Allows the use of jar files to capture cookies.
  */
-/* #define __EXTENSIONS__ 1 */
+#define JAR_FILES 1
 
 /*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
+ * Use POSIX threads instead of native threads.
  */
-#define __MT__ 1
-
-
-/* Define if you have the `bcopy' function. */
-/* #define HAVE_BCOPY 1 */
+#define FEATURE_PTHREAD 1
 
-/* Define if you have the <inttypes.h> header file. */
-/* #define HAVE_INTTYPES_H 1 */
+/* Define if you have the bcopy function.  */
+#define HAVE_BCOPY 1
 
-/* Define if you have the `memmove' function. */
+/* Define if you have the memmove function.  */
 #define HAVE_MEMMOVE 1
 
-/* Define if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define if you have the <stdint.h> header file. */
-/* #define HAVE_STDINT_H 1 */
-
-/* Define if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define if you have the `strerror' function. */
+/* Define if you have the strerror function.  */
 #define HAVE_STRERROR 1
 
-/* Define if you have the <strings.h> header file. */
-/* #define HAVE_STRINGS_H 1 */
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if you have the <unistd.h> header file. */
-/* #define HAVE_UNISTD_H 1 */
-
-/* The size of a `char *', as computed by sizeof. */
-#define SIZEOF_CHAR_P 4
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* The size of a `long long', as computed by sizeof. */
-/* #define SIZEOF_LONG_LONG ---not supported--- */
-
-/* The size of a `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #define const */
-
-/* Define to `unsigned' if <sys/types.h> does not define. */
-/* #define size_t unsigned */
-
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with ANSI Standard C?)
- */
-/* Don't define for MS VC++ or you don't get strdup() declared.
-#ifndef __STDC__
-#define __STDC__ 1
-#endif
-*/
-
 /*
  * Need to set up this define only for the Pthreads library for
  * Win32, available from http://sources.redhat.com/pthreads-win32/
 #define __CLEANUP_C
 #endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */
 
-/*
- * BEOS does not currently support POSIX threads.
- * This *should* be detected by ./configure, but let's be sure.
- */
-#if defined(FEATURE_PTHREAD) && defined(__BEOS__)
-#error BEOS does not support pthread - please run ./configure again with "--disable-pthread"
-
-#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */
-
-
-#if (!defined(_MSC_VER)) && (!defined(RC_INVOKED))
-#error This file is only intended for MS VC++ on Win32.  For other compilers, please run configure.
-#endif /* (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) */
-
-#pragma warning ( disable: 4100 4115 4201 4214 4244 4514 )
-
-/*
- * C4100 : unreferenced formal parameter
- * Very common, not a bug
- * 
- * C4115 : named type definition in parentheses
- * #include <windows.h> causes a warning about one of these.
- *
- * C4201 : nonstandard extension used : nameless struct/union
- * Endemic in <windows.h>
- *
- * C4214 nonstandard extension used : bit field types other than int
- * Endemic in <windows.h>
- *
- * C4244 conversion from 'int' to 'char', possible loss of data
- * Should really fix this one.  Throughout the JB code.
- *
- * C4514 unreferenced inline/local function has been removed
- * Caused by #include <windows.h>
- */
-
-#endif /* CONFIG_H_INCLUDED */
-
+#endif /* _CONFIG_H */
index ac28b76..40da61d 100644 (file)
@@ -1,5 +1,7 @@
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+#ifndef _CONFIG_H
+#define _CONFIG_H
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/config.h.win32threads.win,v $
@@ -11,7 +13,7 @@
  *                getting ludicrously long with feature defines.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: config.h.win32threads.win,v $
- *    Revision 1.13  2002/03/24 17:08:12  jongfoster
- *    Version number bump
- *
- *    Revision 1.12  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.11  2002/03/16 14:27:22  jongfoster
- *    Ignoring a very common warning.
- *
- *    Revision 1.10  2002/03/13 00:28:32  jongfoster
- *    Hiding all the warnings generated by #include<windows.h>
- *
- *    Revision 1.9  2001/11/30 21:35:54  jongfoster
- *    Bumping version number to 2.9.10
- *
- *    Revision 1.8  2001/10/23 21:24:09  jongfoster
- *    Support for FEATURE_CGI_EDIT_ACTIONS
- *
- *    Revision 1.7  2001/10/07 15:33:14  oes
- *    Removed FEATURE_DENY_GZIP
- *    Bumped up version number
- *
- *    Revision 1.6  2001/09/16 16:59:34  jongfoster
- *    Bugfix - couldn't build resources with previous version.
- *
- *    Revision 1.5  2001/09/16 16:19:02  jongfoster
- *    New version based on latest configure.in and acconfig.h
- *
- *    Revision 1.9  2001/07/30 22:16:07  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/25 19:16:27  oes
- *    Bumping version number to 2.9.8
- *
- *    Revision 1.7  2001/07/21 18:00:07  jongfoster
- *    Bumping version number to 2.9.7
- *
- *    Revision 1.6  2001/07/15 20:08:40  jongfoster
+ *    Revision 1.1  2001/07/15 20:08:40  jongfoster
  *    New build files for VC++ which provide the option of POSIX
  *    or Win32 threads.
  *
  *********************************************************************/
 \f
 
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
 /*
  * Version number - Major (X._._)
  */
 /*
  * Version number - Point (_._.X)
  */
-#define VERSION_POINT 13
+#define VERSION_POINT 7
 
 /*
  * Version number, as a string
  */
-#define VERSION "2.9.13"
+#define VERSION "2.9.7"
 
 /*
  * Status of the code: alpha, beta or stable
  */
-#define CODE_STATUS "beta"
+#define CODE_STATUS "alpha"
 
 /*
  * Regular expression matching for URLs.  (Highly recommended).
  * If neither of these are defined then you can ony use prefix matching.
  * Don't bother to change this here! Use configure instead.
  */
-/* #define REGEX_GNU 1 */
+/* #undef REGEX_GNU */
 #define REGEX_PCRE 1
 
 /* 
 #define STATIC_PCRS 1
 
 /*
- * Allows the use of an ACL to control access to the proxy by IP address.
+ * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
+ * non-anonymizing proxy.  This is useful if you're trying to access a
+ * blocked or broken site - just change the setting in the config file
+ * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows
+ * GUI).
  */
-#define FEATURE_ACL 1
+#define TOGGLE 1
 
 /*
- * Enables the web-based configuration (actionsfile) editor.  If you
- * have a shared proxy, you might want to turn this off.
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps.  This forces it to be 
+ * uncompressed.
  */
-#define FEATURE_CGI_EDIT_ACTIONS 1
+#define DENY_GZIP 1
 
 /*
- * Allows the use of jar files to capture cookies.
+ * Enables statistics function.
+ */
+#define STATISTICS 1
+
+/*
+ * Bypass filtering for 1 page only
  */
-#define FEATURE_COOKIE_JAR 1
+#define FORCE_LOAD 1
 
 /*
  * Locally redirect remote script-redirect URLs
  */
-#define FEATURE_FAST_REDIRECTS 1
+#define FAST_REDIRECTS 1
 
 /*
- * Bypass filtering for 1 page only
+ * Split the show-proxy-args page into a page for each config file.
  */
-#define FEATURE_FORCE_LOAD 1
+#define SPLIT_PROXY_ARGS 1
 
 /*
- * Allow blocking using images as well as HTML.
- * If you do not define this then everything is blocked as HTML.
- *
- * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE.
+ * Kills JavaScript popups - window.open, onunload, etc.
  */
-#define FEATURE_IMAGE_BLOCKING 1
+#define KILLPOPUPS 1
+
+/*
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
+ */
+#define WEBDAV 1
 
 /*
  * Detect image requests automatically for MSIE.  Will fall back to
  * other image-detection methods (i.e. "+image" permission) for other
  * browsers.
  *
- * You must also define FEATURE_IMAGE_BLOCKING to use this feature.
+ * You must also define IMAGE_BLOCKING to use this feature.
  *
  * It detects the following header pair as an image request:
  *
  * These limitations are due to IE making inconsistent choices
  * about which "Accept:" header to send.
  */
-#define FEATURE_IMAGE_DETECT_MSIE 1
+#define DETECT_MSIE_IMAGES 1
 
 /*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#define FEATURE_KILL_POPUPS 1
-
-/*
- * Use POSIX threads instead of native threads.
- */
-/* #define FEATURE_PTHREAD 1 */
-
-/*
- * Enables statistics function.
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
  */
-#define FEATURE_STATISTICS 1
+#define IMAGE_BLOCKING 1
 
 /*
- * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
- * non-anonymizing proxy.  This is useful if you're trying to access a
- * blocked or broken site - just change the setting in the config file,
- * or use the handy "Disable" menu option in the Windows GUI.
+ * Allows the use of ACL files to control access to the proxy by IP address.
  */
-#define FEATURE_TOGGLE 1
+#define ACL_FILES 1
 
 /*
  * Allows the use of trust files.
  */
-#define FEATURE_TRUST 1
-
-
-/****************************************************************************
- * The following values are correct for MS VC++97.
- * You should normally not change them.
- ***************************************************************************/
-
-
-/*
- * Defined on Solaris only.  Makes the system libraries thread safe.
- */
-/* #define _REENTRANT 1 */
+#define TRUST_FILES 1
 
 /*
- * Defined on Solaris only.  Without this, many important functions are not
- * defined in the system headers.
+ * Allows the use of jar files to capture cookies.
  */
-/* #define __EXTENSIONS__ 1 */
+#define JAR_FILES 1
 
 /*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
+ * Use POSIX threads instead of native threads.
  */
-#define __MT__ 1
-
+/* #undef FEATURE_PTHREAD */
 
-/* Define if you have the `bcopy' function. */
-/* #define HAVE_BCOPY 1 */
+/* Define if you have the bcopy function.  */
+#define HAVE_BCOPY 1
 
-/* Define if you have the <inttypes.h> header file. */
-/* #define HAVE_INTTYPES_H 1 */
-
-/* Define if you have the `memmove' function. */
+/* Define if you have the memmove function.  */
 #define HAVE_MEMMOVE 1
 
-/* Define if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define if you have the <stdint.h> header file. */
-/* #define HAVE_STDINT_H 1 */
-
-/* Define if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define if you have the `strerror' function. */
+/* Define if you have the strerror function.  */
 #define HAVE_STRERROR 1
 
-/* Define if you have the <strings.h> header file. */
-/* #define HAVE_STRINGS_H 1 */
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if you have the <unistd.h> header file. */
-/* #define HAVE_UNISTD_H 1 */
-
-/* The size of a `char *', as computed by sizeof. */
-#define SIZEOF_CHAR_P 4
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* The size of a `long long', as computed by sizeof. */
-/* #define SIZEOF_LONG_LONG ---not supported--- */
-
-/* The size of a `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #define const */
-
-/* Define to `unsigned' if <sys/types.h> does not define. */
-/* #define size_t unsigned */
-
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with ANSI Standard C?)
- */
-/* Don't define for MS VC++ or you don't get strdup() declared.
-#ifndef __STDC__
-#define __STDC__ 1
-#endif
-*/
-
 /*
  * Need to set up this define only for the Pthreads library for
  * Win32, available from http://sources.redhat.com/pthreads-win32/
 #define __CLEANUP_C
 #endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */
 
-/*
- * BEOS does not currently support POSIX threads.
- * This *should* be detected by ./configure, but let's be sure.
- */
-#if defined(FEATURE_PTHREAD) && defined(__BEOS__)
-#error BEOS does not support pthread - please run ./configure again with "--disable-pthread"
-
-#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */
-
-
-#if (!defined(_MSC_VER)) && (!defined(RC_INVOKED))
-#error This file is only intended for MS VC++ on Win32.  For other compilers, please run configure.
-#endif /* (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) */
-
-#pragma warning ( disable: 4100 4115 4201 4214 4244 4514 )
-
-/*
- * C4100 : unreferenced formal parameter
- * Very common, not a bug
- * 
- * C4115 : named type definition in parentheses
- * #include <windows.h> causes a warning about one of these.
- *
- * C4201 : nonstandard extension used : nameless struct/union
- * Endemic in <windows.h>
- *
- * C4214 nonstandard extension used : bit field types other than int
- * Endemic in <windows.h>
- *
- * C4244 conversion from 'int' to 'char', possible loss of data
- * Should really fix this one.  Throughout the JB code.
- *
- * C4514 unreferenced inline/local function has been removed
- * Caused by #include <windows.h>
- */
-
-
-#endif /* CONFIG_H_INCLUDED */
-
+#endif /* _CONFIG_H */
diff --git a/config.sub b/config.sub
deleted file mode 100755 (executable)
index 12ebc78..0000000
+++ /dev/null
@@ -1,1410 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-#   Free Software Foundation, Inc.
-
-timestamp='2001-08-13'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Please send patches to <config-patches@gnu.org>.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
-    --version | -v )
-       echo "$version" ; exit 0 ;;
-    --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )        # Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit 0;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-       -sun*os*)
-               # Prevent following clause from handling this invalid input.
-               ;;
-       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-       -apple | -axis)
-               os=
-               basic_machine=$1
-               ;;
-       -sim | -cisco | -oki | -wec | -winbond)
-               os=
-               basic_machine=$1
-               ;;
-       -scout)
-               ;;
-       -wrs)
-               os=-vxworks
-               basic_machine=$1
-               ;;
-       -chorusos*)
-               os=-chorusos
-               basic_machine=$1
-               ;;
-       -chorusrdb)
-               os=-chorusrdb
-               basic_machine=$1
-               ;;
-       -hiux*)
-               os=-hiuxwe2
-               ;;
-       -sco5)
-               os=-sco3.2v5
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco4)
-               os=-sco3.2v4
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2.[4-9]*)
-               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2v[4-9]*)
-               # Don't forget version if it is 3.2v4 or newer.
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco*)
-               os=-sco3.2v2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -udk*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -isc)
-               os=-isc2.2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -clix*)
-               basic_machine=clipper-intergraph
-               ;;
-       -isc*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -lynx*)
-               os=-lynxos
-               ;;
-       -ptx*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-               ;;
-       -windowsnt*)
-               os=`echo $os | sed -e 's/windowsnt/winnt/'`
-               ;;
-       -psos*)
-               os=-psos
-               ;;
-       -mint | -mint[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-       # Recognize the basic CPU types without company name.
-       # Some are omitted here because they have special meanings below.
-       1750a | 580 \
-       | a29k \
-       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
-       | c4x | clipper \
-       | d10v | d30v | dsp16xx \
-       | fr30 \
-       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-       | i370 | i860 | i960 | ia64 \
-       | m32r | m68000 | m68k | m88k | mcore \
-       | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
-       | mips64vr4100 | mips64vr4100el | mips64vr4300 \
-       | mips64vr4300el | mips64vr5000 | mips64vr5000el \
-       | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \
-       | mn10200 | mn10300 \
-       | ns16k | ns32k \
-       | openrisc \
-       | pdp10 | pdp11 | pj | pjl \
-       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-       | pyramid \
-       | s390 | s390x \
-       | sh | sh[34] | sh[34]eb | shbe | shle \
-       | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
-       | strongarm \
-       | tahoe | thumb | tic80 | tron \
-       | v850 \
-       | we32k \
-       | x86 | xscale \
-       | z8k)
-               basic_machine=$basic_machine-unknown
-               ;;
-       m6811 | m68hc11 | m6812 | m68hc12)
-               # Motorola 68HC11/12.
-               basic_machine=$basic_machine-unknown
-               os=-none
-               ;;
-       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-               ;;
-
-       # We use `pc' rather than `unknown'
-       # because (1) that's what they normally are, and
-       # (2) the word "unknown" tends to confuse beginning users.
-       i*86 | x86_64)
-         basic_machine=$basic_machine-pc
-         ;;
-       # Object if more than one company name word.
-       *-*-*)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-       # Recognize the basic CPU types with company name.
-       580-* \
-       | a29k-* \
-       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-       | alphapca5[67]-* | arc-* \
-       | arm-*  | armbe-* | armle-* | armv*-* \
-       | bs2000-* \
-       | c[123]* | c30-* | [cjt]90-* | c54x-* \
-       | clipper-* | cray2-* | cydra-* \
-       | d10v-* | d30v-* \
-       | elxsi-* \
-       | f30[01]-* | f700-* | fr30-* | fx80-* \
-       | h8300-* | h8500-* \
-       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-       | i*86-* | i860-* | i960-* | ia64-* \
-       | m32r-* \
-       | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
-       | m88110-* | m88k-* | mcore-* \
-       | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
-       | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
-       | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \
-       | mipsle-* | mipstx39-* | mipstx39el-* \
-       | none-* | np1-* | ns16k-* | ns32k-* \
-       | orion-* \
-       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-       | pyramid-* \
-       | romp-* | rs6000-* \
-       | s390-* | s390x-* \
-       | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
-       | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
-       | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \
-       | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
-       | v850-* | vax-* \
-       | we32k-* \
-       | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
-       | ymp-* \
-       | z8k-*)
-               ;;
-       # Recognize the various machine names and aliases which stand
-       # for a CPU type and a company and sometimes even an OS.
-       386bsd)
-               basic_machine=i386-unknown
-               os=-bsd
-               ;;
-       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-               basic_machine=m68000-att
-               ;;
-       3b*)
-               basic_machine=we32k-att
-               ;;
-       a29khif)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       adobe68k)
-               basic_machine=m68010-adobe
-               os=-scout
-               ;;
-       alliant | fx80)
-               basic_machine=fx80-alliant
-               ;;
-       altos | altos3068)
-               basic_machine=m68k-altos
-               ;;
-       am29k)
-               basic_machine=a29k-none
-               os=-bsd
-               ;;
-       amdahl)
-               basic_machine=580-amdahl
-               os=-sysv
-               ;;
-       amiga | amiga-*)
-               basic_machine=m68k-unknown
-               ;;
-       amigaos | amigados)
-               basic_machine=m68k-unknown
-               os=-amigaos
-               ;;
-       amigaunix | amix)
-               basic_machine=m68k-unknown
-               os=-sysv4
-               ;;
-       apollo68)
-               basic_machine=m68k-apollo
-               os=-sysv
-               ;;
-       apollo68bsd)
-               basic_machine=m68k-apollo
-               os=-bsd
-               ;;
-       aux)
-               basic_machine=m68k-apple
-               os=-aux
-               ;;
-       balance)
-               basic_machine=ns32k-sequent
-               os=-dynix
-               ;;
-       convex-c1)
-               basic_machine=c1-convex
-               os=-bsd
-               ;;
-       convex-c2)
-               basic_machine=c2-convex
-               os=-bsd
-               ;;
-       convex-c32)
-               basic_machine=c32-convex
-               os=-bsd
-               ;;
-       convex-c34)
-               basic_machine=c34-convex
-               os=-bsd
-               ;;
-       convex-c38)
-               basic_machine=c38-convex
-               os=-bsd
-               ;;
-       cray | ymp)
-               basic_machine=ymp-cray
-               os=-unicos
-               ;;
-       cray2)
-               basic_machine=cray2-cray
-               os=-unicos
-               ;;
-       [cjt]90)
-               basic_machine=${basic_machine}-cray
-               os=-unicos
-               ;;
-       crds | unos)
-               basic_machine=m68k-crds
-               ;;
-       cris | cris-* | etrax*)
-               basic_machine=cris-axis
-               ;;
-       da30 | da30-*)
-               basic_machine=m68k-da30
-               ;;
-       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-               basic_machine=mips-dec
-               ;;
-       delta | 3300 | motorola-3300 | motorola-delta \
-             | 3300-motorola | delta-motorola)
-               basic_machine=m68k-motorola
-               ;;
-       delta88)
-               basic_machine=m88k-motorola
-               os=-sysv3
-               ;;
-       dpx20 | dpx20-*)
-               basic_machine=rs6000-bull
-               os=-bosx
-               ;;
-       dpx2* | dpx2*-bull)
-               basic_machine=m68k-bull
-               os=-sysv3
-               ;;
-       ebmon29k)
-               basic_machine=a29k-amd
-               os=-ebmon
-               ;;
-       elxsi)
-               basic_machine=elxsi-elxsi
-               os=-bsd
-               ;;
-       encore | umax | mmax)
-               basic_machine=ns32k-encore
-               ;;
-       es1800 | OSE68k | ose68k | ose | OSE)
-               basic_machine=m68k-ericsson
-               os=-ose
-               ;;
-       fx2800)
-               basic_machine=i860-alliant
-               ;;
-       genix)
-               basic_machine=ns32k-ns
-               ;;
-       gmicro)
-               basic_machine=tron-gmicro
-               os=-sysv
-               ;;
-       go32)
-               basic_machine=i386-pc
-               os=-go32
-               ;;
-       h3050r* | hiux*)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       h8300hms)
-               basic_machine=h8300-hitachi
-               os=-hms
-               ;;
-       h8300xray)
-               basic_machine=h8300-hitachi
-               os=-xray
-               ;;
-       h8500hms)
-               basic_machine=h8500-hitachi
-               os=-hms
-               ;;
-       harris)
-               basic_machine=m88k-harris
-               os=-sysv3
-               ;;
-       hp300-*)
-               basic_machine=m68k-hp
-               ;;
-       hp300bsd)
-               basic_machine=m68k-hp
-               os=-bsd
-               ;;
-       hp300hpux)
-               basic_machine=m68k-hp
-               os=-hpux
-               ;;
-       hp3k9[0-9][0-9] | hp9[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k2[0-9][0-9] | hp9k31[0-9])
-               basic_machine=m68000-hp
-               ;;
-       hp9k3[2-9][0-9])
-               basic_machine=m68k-hp
-               ;;
-       hp9k6[0-9][0-9] | hp6[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k7[0-79][0-9] | hp7[0-79][0-9])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k78[0-9] | hp78[0-9])
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][13679] | hp8[0-9][13679])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][0-9] | hp8[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hppa-next)
-               os=-nextstep3
-               ;;
-       hppaosf)
-               basic_machine=hppa1.1-hp
-               os=-osf
-               ;;
-       hppro)
-               basic_machine=hppa1.1-hp
-               os=-proelf
-               ;;
-       i370-ibm* | ibm*)
-               basic_machine=i370-ibm
-               ;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-       i*86v32)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv32
-               ;;
-       i*86v4*)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv4
-               ;;
-       i*86v)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv
-               ;;
-       i*86sol2)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-solaris2
-               ;;
-       i386mach)
-               basic_machine=i386-mach
-               os=-mach
-               ;;
-       i386-vsta | vsta)
-               basic_machine=i386-unknown
-               os=-vsta
-               ;;
-       iris | iris4d)
-               basic_machine=mips-sgi
-               case $os in
-                   -irix*)
-                       ;;
-                   *)
-                       os=-irix4
-                       ;;
-               esac
-               ;;
-       isi68 | isi)
-               basic_machine=m68k-isi
-               os=-sysv
-               ;;
-       m88k-omron*)
-               basic_machine=m88k-omron
-               ;;
-       magnum | m3230)
-               basic_machine=mips-mips
-               os=-sysv
-               ;;
-       merlin)
-               basic_machine=ns32k-utek
-               os=-sysv
-               ;;
-       mingw32)
-               basic_machine=i386-pc
-               os=-mingw32
-               ;;
-       miniframe)
-               basic_machine=m68000-convergent
-               ;;
-       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-       mipsel*-linux*)
-               basic_machine=mipsel-unknown
-               os=-linux-gnu
-               ;;
-       mips*-linux*)
-               basic_machine=mips-unknown
-               os=-linux-gnu
-               ;;
-       mips3*-*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-               ;;
-       mips3*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-               ;;
-       mmix*)
-               basic_machine=mmix-knuth
-               os=-mmixware
-               ;;
-       monitor)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       msdos)
-               basic_machine=i386-pc
-               os=-msdos
-               ;;
-       mvs)
-               basic_machine=i370-ibm
-               os=-mvs
-               ;;
-       ncr3000)
-               basic_machine=i486-ncr
-               os=-sysv4
-               ;;
-       netbsd386)
-               basic_machine=i386-unknown
-               os=-netbsd
-               ;;
-       netwinder)
-               basic_machine=armv4l-rebel
-               os=-linux
-               ;;
-       news | news700 | news800 | news900)
-               basic_machine=m68k-sony
-               os=-newsos
-               ;;
-       news1000)
-               basic_machine=m68030-sony
-               os=-newsos
-               ;;
-       news-3600 | risc-news)
-               basic_machine=mips-sony
-               os=-newsos
-               ;;
-       necv70)
-               basic_machine=v70-nec
-               os=-sysv
-               ;;
-       next | m*-next )
-               basic_machine=m68k-next
-               case $os in
-                   -nextstep* )
-                       ;;
-                   -ns2*)
-                     os=-nextstep2
-                       ;;
-                   *)
-                     os=-nextstep3
-                       ;;
-               esac
-               ;;
-       nh3000)
-               basic_machine=m68k-harris
-               os=-cxux
-               ;;
-       nh[45]000)
-               basic_machine=m88k-harris
-               os=-cxux
-               ;;
-       nindy960)
-               basic_machine=i960-intel
-               os=-nindy
-               ;;
-       mon960)
-               basic_machine=i960-intel
-               os=-mon960
-               ;;
-       nonstopux)
-               basic_machine=mips-compaq
-               os=-nonstopux
-               ;;
-       np1)
-               basic_machine=np1-gould
-               ;;
-       nsr-tandem)
-               basic_machine=nsr-tandem
-               ;;
-       op50n-* | op60c-*)
-               basic_machine=hppa1.1-oki
-               os=-proelf
-               ;;
-       OSE68000 | ose68000)
-               basic_machine=m68000-ericsson
-               os=-ose
-               ;;
-       os68k)
-               basic_machine=m68k-none
-               os=-os68k
-               ;;
-       pa-hitachi)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       paragon)
-               basic_machine=i860-intel
-               os=-osf
-               ;;
-       pbd)
-               basic_machine=sparc-tti
-               ;;
-       pbb)
-               basic_machine=m68k-tti
-               ;;
-        pc532 | pc532-*)
-               basic_machine=ns32k-pc532
-               ;;
-       pentium | p5 | k5 | k6 | nexgen)
-               basic_machine=i586-pc
-               ;;
-       pentiumpro | p6 | 6x86 | athlon)
-               basic_machine=i686-pc
-               ;;
-       pentiumii | pentium2)
-               basic_machine=i686-pc
-               ;;
-       pentium-* | p5-* | k5-* | k6-* | nexgen-*)
-               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumpro-* | p6-* | 6x86-* | athlon-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumii-* | pentium2-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pn)
-               basic_machine=pn-gould
-               ;;
-       power)  basic_machine=power-ibm
-               ;;
-       ppc)    basic_machine=powerpc-unknown
-               ;;
-       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppcle | powerpclittle | ppc-le | powerpc-little)
-               basic_machine=powerpcle-unknown
-               ;;
-       ppcle-* | powerpclittle-*)
-               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppc64)  basic_machine=powerpc64-unknown
-               ;;
-       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-               basic_machine=powerpc64le-unknown
-               ;;
-       ppc64le-* | powerpc64little-*)
-               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ps2)
-               basic_machine=i386-ibm
-               ;;
-       pw32)
-               basic_machine=i586-unknown
-               os=-pw32
-               ;;
-       rom68k)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       rm[46]00)
-               basic_machine=mips-siemens
-               ;;
-       rtpc | rtpc-*)
-               basic_machine=romp-ibm
-               ;;
-       sa29200)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       sequent)
-               basic_machine=i386-sequent
-               ;;
-       sh)
-               basic_machine=sh-hitachi
-               os=-hms
-               ;;
-       sparclite-wrs)
-               basic_machine=sparclite-wrs
-               os=-vxworks
-               ;;
-       sps7)
-               basic_machine=m68k-bull
-               os=-sysv2
-               ;;
-       spur)
-               basic_machine=spur-unknown
-               ;;
-       st2000)
-               basic_machine=m68k-tandem
-               ;;
-       stratus)
-               basic_machine=i860-stratus
-               os=-sysv4
-               ;;
-       sun2)
-               basic_machine=m68000-sun
-               ;;
-       sun2os3)
-               basic_machine=m68000-sun
-               os=-sunos3
-               ;;
-       sun2os4)
-               basic_machine=m68000-sun
-               os=-sunos4
-               ;;
-       sun3os3)
-               basic_machine=m68k-sun
-               os=-sunos3
-               ;;
-       sun3os4)
-               basic_machine=m68k-sun
-               os=-sunos4
-               ;;
-       sun4os3)
-               basic_machine=sparc-sun
-               os=-sunos3
-               ;;
-       sun4os4)
-               basic_machine=sparc-sun
-               os=-sunos4
-               ;;
-       sun4sol2)
-               basic_machine=sparc-sun
-               os=-solaris2
-               ;;
-       sun3 | sun3-*)
-               basic_machine=m68k-sun
-               ;;
-       sun4)
-               basic_machine=sparc-sun
-               ;;
-       sun386 | sun386i | roadrunner)
-               basic_machine=i386-sun
-               ;;
-       sv1)
-               basic_machine=sv1-cray
-               os=-unicos
-               ;;
-       symmetry)
-               basic_machine=i386-sequent
-               os=-dynix
-               ;;
-       t3e)
-               basic_machine=t3e-cray
-               os=-unicos
-               ;;
-       tic54x | c54x*)
-               basic_machine=tic54x-unknown
-               os=-coff
-               ;;
-       tx39)
-               basic_machine=mipstx39-unknown
-               ;;
-       tx39el)
-               basic_machine=mipstx39el-unknown
-               ;;
-       tower | tower-32)
-               basic_machine=m68k-ncr
-               ;;
-       udi29k)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       ultra3)
-               basic_machine=a29k-nyu
-               os=-sym1
-               ;;
-       v810 | necv810)
-               basic_machine=v810-nec
-               os=-none
-               ;;
-       vaxv)
-               basic_machine=vax-dec
-               os=-sysv
-               ;;
-       vms)
-               basic_machine=vax-dec
-               os=-vms
-               ;;
-       vpp*|vx|vx-*)
-               basic_machine=f301-fujitsu
-               ;;
-       vxworks960)
-               basic_machine=i960-wrs
-               os=-vxworks
-               ;;
-       vxworks68)
-               basic_machine=m68k-wrs
-               os=-vxworks
-               ;;
-       vxworks29k)
-               basic_machine=a29k-wrs
-               os=-vxworks
-               ;;
-       w65*)
-               basic_machine=w65-wdc
-               os=-none
-               ;;
-       w89k-*)
-               basic_machine=hppa1.1-winbond
-               os=-proelf
-               ;;
-       windows32)
-               basic_machine=i386-pc
-               os=-windows32-msvcrt
-               ;;
-       xmp)
-               basic_machine=xmp-cray
-               os=-unicos
-               ;;
-        xps | xps100)
-               basic_machine=xps100-honeywell
-               ;;
-       z8k-*-coff)
-               basic_machine=z8k-unknown
-               os=-sim
-               ;;
-       none)
-               basic_machine=none-none
-               os=-none
-               ;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-       w89k)
-               basic_machine=hppa1.1-winbond
-               ;;
-       op50n)
-               basic_machine=hppa1.1-oki
-               ;;
-       op60c)
-               basic_machine=hppa1.1-oki
-               ;;
-       mips)
-               if [ x$os = x-linux-gnu ]; then
-                       basic_machine=mips-unknown
-               else
-                       basic_machine=mips-mips
-               fi
-               ;;
-       romp)
-               basic_machine=romp-ibm
-               ;;
-       rs6000)
-               basic_machine=rs6000-ibm
-               ;;
-       vax)
-               basic_machine=vax-dec
-               ;;
-       pdp10)
-               # there are many clones, so DEC is not a safe bet
-               basic_machine=pdp10-unknown
-               ;;
-       pdp11)
-               basic_machine=pdp11-dec
-               ;;
-       we32k)
-               basic_machine=we32k-att
-               ;;
-       sh3 | sh4 | sh3eb | sh4eb)
-               basic_machine=sh-unknown
-               ;;
-       sparc | sparcv9 | sparcv9b)
-               basic_machine=sparc-sun
-               ;;
-        cydra)
-               basic_machine=cydra-cydrome
-               ;;
-       orion)
-               basic_machine=orion-highlevel
-               ;;
-       orion105)
-               basic_machine=clipper-highlevel
-               ;;
-       mac | mpw | mac-mpw)
-               basic_machine=m68k-apple
-               ;;
-       pmac | pmac-mpw)
-               basic_machine=powerpc-apple
-               ;;
-       c4x*)
-               basic_machine=c4x-none
-               os=-coff
-               ;;
-       *-unknown)
-               # Make sure to match an already-canonicalized machine name.
-               ;;
-       *)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-       *-digital*)
-               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-               ;;
-       *-commodore*)
-               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-               ;;
-       *)
-               ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-       # -solaris* is a basic system type, with this one exception.
-       -solaris1 | -solaris1.*)
-               os=`echo $os | sed -e 's|solaris1|sunos4|'`
-               ;;
-       -solaris)
-               os=-solaris2
-               ;;
-       -svr4*)
-               os=-sysv4
-               ;;
-       -unixware*)
-               os=-sysv4.2uw
-               ;;
-       -gnu/linux*)
-               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-               ;;
-       # First accept the basic system types.
-       # The portable systems comes first.
-       # Each alternative MUST END IN A *, to match a version number.
-       # -sysv* is not here because it comes later, after sysvr4.
-       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-             | -aos* \
-             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
-             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-             | -chorusos* | -chorusrdb* \
-             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
-             | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
-             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-             | -os2* | -vos*)
-       # Remember, each alternative MUST END IN *, to match a version number.
-               ;;
-       -qnx*)
-               case $basic_machine in
-                   x86-* | i*86-*)
-                       ;;
-                   *)
-                       os=-nto$os
-                       ;;
-               esac
-               ;;
-       -nto*)
-               os=-nto-qnx
-               ;;
-       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
-             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-               ;;
-       -mac*)
-               os=`echo $os | sed -e 's|mac|macos|'`
-               ;;
-       -linux*)
-               os=`echo $os | sed -e 's|linux|linux-gnu|'`
-               ;;
-       -sunos5*)
-               os=`echo $os | sed -e 's|sunos5|solaris2|'`
-               ;;
-       -sunos6*)
-               os=`echo $os | sed -e 's|sunos6|solaris3|'`
-               ;;
-       -opened*)
-               os=-openedition
-               ;;
-       -wince*)
-               os=-wince
-               ;;
-       -osfrose*)
-               os=-osfrose
-               ;;
-       -osf*)
-               os=-osf
-               ;;
-       -utek*)
-               os=-bsd
-               ;;
-       -dynix*)
-               os=-bsd
-               ;;
-       -acis*)
-               os=-aos
-               ;;
-       -386bsd)
-               os=-bsd
-               ;;
-       -ctix* | -uts*)
-               os=-sysv
-               ;;
-       -ns2 )
-               os=-nextstep2
-               ;;
-       -nsk*)
-               os=-nsk
-               ;;
-       # Preserve the version number of sinix5.
-       -sinix5.*)
-               os=`echo $os | sed -e 's|sinix|sysv|'`
-               ;;
-       -sinix*)
-               os=-sysv4
-               ;;
-       -triton*)
-               os=-sysv3
-               ;;
-       -oss*)
-               os=-sysv3
-               ;;
-       -svr4)
-               os=-sysv4
-               ;;
-       -svr3)
-               os=-sysv3
-               ;;
-       -sysvr4)
-               os=-sysv4
-               ;;
-       # This must come after -sysvr4.
-       -sysv*)
-               ;;
-       -ose*)
-               os=-ose
-               ;;
-       -es1800*)
-               os=-ose
-               ;;
-       -xenix)
-               os=-xenix
-               ;;
-        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-               os=-mint
-               ;;
-       -none)
-               ;;
-       *)
-               # Get rid of the `-' at the beginning of $os.
-               os=`echo $os | sed 's/[^-]*-//'`
-               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-       *-acorn)
-               os=-riscix1.2
-               ;;
-       arm*-rebel)
-               os=-linux
-               ;;
-       arm*-semi)
-               os=-aout
-               ;;
-       pdp10-*)
-               os=-tops20
-               ;;
-        pdp11-*)
-               os=-none
-               ;;
-       *-dec | vax-*)
-               os=-ultrix4.2
-               ;;
-       m68*-apollo)
-               os=-domain
-               ;;
-       i386-sun)
-               os=-sunos4.0.2
-               ;;
-       m68000-sun)
-               os=-sunos3
-               # This also exists in the configure program, but was not the
-               # default.
-               # os=-sunos4
-               ;;
-       m68*-cisco)
-               os=-aout
-               ;;
-       mips*-cisco)
-               os=-elf
-               ;;
-       mips*-*)
-               os=-elf
-               ;;
-       *-tti)  # must be before sparc entry or we get the wrong os.
-               os=-sysv3
-               ;;
-       sparc-* | *-sun)
-               os=-sunos4.1.1
-               ;;
-       *-be)
-               os=-beos
-               ;;
-       *-ibm)
-               os=-aix
-               ;;
-       *-wec)
-               os=-proelf
-               ;;
-       *-winbond)
-               os=-proelf
-               ;;
-       *-oki)
-               os=-proelf
-               ;;
-       *-hp)
-               os=-hpux
-               ;;
-       *-hitachi)
-               os=-hiux
-               ;;
-       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-               os=-sysv
-               ;;
-       *-cbm)
-               os=-amigaos
-               ;;
-       *-dg)
-               os=-dgux
-               ;;
-       *-dolphin)
-               os=-sysv3
-               ;;
-       m68k-ccur)
-               os=-rtu
-               ;;
-       m88k-omron*)
-               os=-luna
-               ;;
-       *-next )
-               os=-nextstep
-               ;;
-       *-sequent)
-               os=-ptx
-               ;;
-       *-crds)
-               os=-unos
-               ;;
-       *-ns)
-               os=-genix
-               ;;
-       i370-*)
-               os=-mvs
-               ;;
-       *-next)
-               os=-nextstep3
-               ;;
-        *-gould)
-               os=-sysv
-               ;;
-        *-highlevel)
-               os=-bsd
-               ;;
-       *-encore)
-               os=-bsd
-               ;;
-        *-sgi)
-               os=-irix
-               ;;
-        *-siemens)
-               os=-sysv4
-               ;;
-       *-masscomp)
-               os=-rtu
-               ;;
-       f30[01]-fujitsu | f700-fujitsu)
-               os=-uxpv
-               ;;
-       *-rom68k)
-               os=-coff
-               ;;
-       *-*bug)
-               os=-coff
-               ;;
-       *-apple)
-               os=-macos
-               ;;
-       *-atari*)
-               os=-mint
-               ;;
-       *)
-               os=-none
-               ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-       *-unknown)
-               case $os in
-                       -riscix*)
-                               vendor=acorn
-                               ;;
-                       -sunos*)
-                               vendor=sun
-                               ;;
-                       -aix*)
-                               vendor=ibm
-                               ;;
-                       -beos*)
-                               vendor=be
-                               ;;
-                       -hpux*)
-                               vendor=hp
-                               ;;
-                       -mpeix*)
-                               vendor=hp
-                               ;;
-                       -hiux*)
-                               vendor=hitachi
-                               ;;
-                       -unos*)
-                               vendor=crds
-                               ;;
-                       -dgux*)
-                               vendor=dg
-                               ;;
-                       -luna*)
-                               vendor=omron
-                               ;;
-                       -genix*)
-                               vendor=ns
-                               ;;
-                       -mvs* | -opened*)
-                               vendor=ibm
-                               ;;
-                       -ptx*)
-                               vendor=sequent
-                               ;;
-                       -vxsim* | -vxworks*)
-                               vendor=wrs
-                               ;;
-                       -aux*)
-                               vendor=apple
-                               ;;
-                       -hms*)
-                               vendor=hitachi
-                               ;;
-                       -mpw* | -macos*)
-                               vendor=apple
-                               ;;
-                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-                               vendor=atari
-                               ;;
-                       -vos*)
-                               vendor=stratus
-                               ;;
-               esac
-               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-               ;;
-esac
-
-echo $basic_machine$os
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..db6d1f9
--- /dev/null
+++ b/configure
@@ -0,0 +1,2267 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --enable-mingw32        Use mingw32 for a Windows GUI"
+ac_help="$ac_help
+  --disable-toggle        Don't support temporary disable"
+ac_help="$ac_help
+  --disable-pthread       Don't use POSIX threads (pthreads)"
+ac_help="$ac_help
+  --enable-gzip           Allow gzip'ed transfer of documents. Note that this will make content modification impossible."
+ac_help="$ac_help
+  --disable-force         Don't allow blockfle to be bypassed"
+ac_help="$ac_help
+  --disable-fast-redirects Don't support fast redirects"
+ac_help="$ac_help
+  --disable-killpopup     Never block popups"
+ac_help="$ac_help
+  --disable-stats         Don't keep statistics"
+ac_help="$ac_help
+  --disable-split-proxy-args  One big show-proxy-args page, not one per file."
+ac_help="$ac_help
+  --disable-webdav        Don't support WebDAV.  This option stops MS Outlook
+                          Express from accessing HotMail e-mail."
+ac_help="$ac_help
+  --disable-ie-images     Don't auto-detect whether a request from MS Internet
+                          Explorer is for an image or HTML."
+ac_help="$ac_help
+  --disable-image-blocking  Don't try to figure out whether a request is 
+                            for an image or HTML - assume HTML."
+ac_help="$ac_help
+  --disable-acl-files     Prevents the use of ACL files to control access to
+                          the proxy by IP address."
+ac_help="$ac_help
+  --disable-trust-files   Prevents the use of trust files."
+ac_help="$ac_help
+  --disable-jar-files     Prevents the use of jar files to capture cookies."
+ac_help="$ac_help
+  --enable-regex-matching=pcre     Use perl-compatible regex for actionsfile pattern matching (default)
+  --enable-regex-matching=gnu      Use gnu style regex for actionsfile pattern matching (-> bigger binary)
+  --disable-regex-matching         Don't use regex matching, compare URL prefix instead (won't shrink birary)"
+ac_help="$ac_help
+  --disable-dynamic-pcre           Use the built-in, static pcre, even if libpcre is available"
+ac_help="$ac_help
+  --disable-dynamic-pcrs           Use the built-in, static pcrs, even if libpcrs is available"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=jcc.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+VERSION_MAJOR=2
+VERSION_MINOR=9
+VERSION_POINT=7
+
+
+
+
+
+cat >> confdefs.h <<\EOF
+#define CODE_STATUS "alpha"
+EOF
+
+
+cat >> confdefs.h <<EOF
+#define VERSION_MAJOR ${VERSION_MAJOR}
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION_MINOR ${VERSION_MINOR}
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION_POINT ${VERSION_POINT}
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_POINT}"
+EOF
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:602: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:632: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+       continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:683: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:715: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 726 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:757: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:762: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:790: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:822: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 837 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 854 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:860: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 871 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:877: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:903: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 908 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_mingw32=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:932: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 937 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:948: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_cygwin=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:967: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+  ac_cv_exeext=.exe
+else
+  rm -f conftest*
+  echo 'int main () { return 0; }' > conftest.$ac_ext
+  ac_cv_exeext=
+  if { (eval echo configure:977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+    for file in conftest.*; do
+      case $file in
+      *.c | *.o | *.obj) ;;
+      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+      esac
+    done
+  else
+    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+  fi
+  rm -f conftest*
+  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+echo "configure:998: checking for object suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftest*
+echo 'int i = 1;' > conftest.$ac_ext
+if { (eval echo configure:1004: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  for ac_file in conftest.*; do
+    case $ac_file in
+    *.c) ;;
+    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
+    esac
+  done
+else
+  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_objext" 1>&6
+OBJEXT=$ac_cv_objext
+ac_objext=$ac_cv_objext
+
+
+echo $ac_n "checking for pcre_compile in -lpcre""... $ac_c" 1>&6
+echo "configure:1023: checking for pcre_compile in -lpcre" >&5
+ac_lib_var=`echo pcre'_'pcre_compile | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lpcre  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1031 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char pcre_compile();
+
+int main() {
+pcre_compile()
+; return 0; }
+EOF
+if { (eval echo configure:1042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  ac_safe=`echo "pcre.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for pcre.h""... $ac_c" 1>&6
+echo "configure:1059: checking for pcre.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1064 "configure"
+#include "confdefs.h"
+#include <pcre.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1069: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_pcre=yes
+else
+  echo "$ac_t""no" 1>&6
+have_pcre=no
+fi
+
+else
+  echo "$ac_t""no" 1>&6
+have_pcre=no
+fi
+
+echo $ac_n "checking for regcomp in -lpcreposix""... $ac_c" 1>&6
+echo "configure:1097: checking for regcomp in -lpcreposix" >&5
+ac_lib_var=`echo pcreposix'_'regcomp | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lpcreposix -lpcre $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1105 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char regcomp();
+
+int main() {
+regcomp()
+; return 0; }
+EOF
+if { (eval echo configure:1116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  ac_safe=`echo "pcreposix.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for pcreposix.h""... $ac_c" 1>&6
+echo "configure:1133: checking for pcreposix.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1138 "configure"
+#include "confdefs.h"
+#include <pcreposix.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1143: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_pcreposix=yes
+else
+  echo "$ac_t""no" 1>&6
+have_pcreposix=no
+fi
+
+else
+  echo "$ac_t""no" 1>&6
+have_pcreposix=no
+fi
+
+echo $ac_n "checking for pcrs_compile in -lpcrs""... $ac_c" 1>&6
+echo "configure:1171: checking for pcrs_compile in -lpcrs" >&5
+ac_lib_var=`echo pcrs'_'pcrs_compile | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lpcrs  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1179 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char pcrs_compile();
+
+int main() {
+pcrs_compile()
+; return 0; }
+EOF
+if { (eval echo configure:1190: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  ac_safe=`echo "pcrs.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for pcrs.h""... $ac_c" 1>&6
+echo "configure:1207: checking for pcrs.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1212 "configure"
+#include "confdefs.h"
+#include <pcrs.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1217: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_pcrs=yes
+else
+  echo "$ac_t""no" 1>&6
+have_pcrs=no
+fi
+
+else
+  echo "$ac_t""no" 1>&6
+have_pcrs=no
+fi
+
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1246: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1251 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1259: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  ac_cv_header_stdc=yes
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1276 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1294 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  :
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1315 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1326: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+  cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1351: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1356 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this.  */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this.  */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this.  */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+   It does not let you subtract one const X* pointer from another in an arm
+   of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this.  */
+  char *t;
+  char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+  *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+  int x[] = {25, 17};
+  const int *foo = &x[0];
+  ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+  typedef const int *iptr;
+  iptr p = 0;
+  ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+  struct s { int j; const int *ap[3]; };
+  struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+  const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1405: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_const=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+  cat >> confdefs.h <<\EOF
+#define const 
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1426: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1431 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+
+for ac_func in strerror bcopy memmove
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1462: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1467 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1490: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+
+# Check whether --enable-mingw32 or --disable-mingw32 was given.
+if test "${enable_mingw32+set}" = set; then
+  enableval="$enable_mingw32"
+  if test $enableval = yes; then
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    PTHREAD_LIB=-lpthreadGC
+    echo "Using mingw32 (Win32 GUI)"
+  else
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      PTHREAD_LIB=
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+      PTHREAD_LIB=-lpthread
+    fi
+  fi
+else
+  if test "$MINGW32" = "yes"; then
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    PTHREAD_LIB=-lpthreadGC
+    echo "Using mingw32 (Win32 GUI)"
+  else
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      PTHREAD_LIB=
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+      PTHREAD_LIB=-lpthread
+    fi
+  fi
+fi
+
+
+
+
+
+
+SOLARIS_ONLY=#
+
+
+
+# Check whether --enable-toggle or --disable-toggle was given.
+if test "${enable_toggle+set}" = set; then
+  enableval="$enable_toggle"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define TOGGLE 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define TOGGLE 1
+EOF
+
+fi
+
+
+# Check whether --enable-pthread or --disable-pthread was given.
+if test "${enable_pthread+set}" = set; then
+  enableval="$enable_pthread"
+  if test $enableval = yes; then
+  PTHREAD_ONLY=
+  cat >> confdefs.h <<\EOF
+#define FEATURE_PTHREAD 1
+EOF
+
+else
+  PTHREAD_ONLY=#
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define FEATURE_PTHREAD 1
+EOF
+
+  PTHREAD_ONLY=
+
+fi
+
+
+
+# Check whether --enable-gzip or --disable-gzip was given.
+if test "${enable_gzip+set}" = set; then
+  enableval="$enable_gzip"
+  if test $enableval = "no"; then
+  cat >> confdefs.h <<\EOF
+#define DENY_GZIP 1
+EOF
+
+fi
+fi
+
+
+# Check whether --enable-force or --disable-force was given.
+if test "${enable_force+set}" = set; then
+  enableval="$enable_force"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define FORCE_LOAD 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define FORCE_LOAD 1
+EOF
+
+fi
+
+
+# Check whether --enable-fast-redirects or --disable-fast-redirects was given.
+if test "${enable_fast_redirects+set}" = set; then
+  enableval="$enable_fast_redirects"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define FAST_REDIRECTS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define FAST_REDIRECTS 1
+EOF
+
+fi
+
+
+# Check whether --enable-killpopup or --disable-killpopup was given.
+if test "${enable_killpopup+set}" = set; then
+  enableval="$enable_killpopup"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define KILLPOPUPS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define KILLPOPUPS 1
+EOF
+
+fi
+
+
+# Check whether --enable-stats or --disable-stats was given.
+if test "${enable_stats+set}" = set; then
+  enableval="$enable_stats"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define STATISTICS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define STATISTICS 1
+EOF
+
+fi
+
+
+# Check whether --enable-split-proxy-args or --disable-split-proxy-args was given.
+if test "${enable_split_proxy_args+set}" = set; then
+  enableval="$enable_split_proxy_args"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define SPLIT_PROXY_ARGS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define SPLIT_PROXY_ARGS 1
+EOF
+
+fi
+
+
+# Check whether --enable-webdav or --disable-webdav was given.
+if test "${enable_webdav+set}" = set; then
+  enableval="$enable_webdav"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define WEBDAV 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define WEBDAV 1
+EOF
+
+fi
+
+
+# Check whether --enable-ie-images or --disable-ie-images was given.
+if test "${enable_ie_images+set}" = set; then
+  enableval="$enable_ie_images"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define DETECT_MSIE_IMAGES 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define DETECT_MSIE_IMAGES 1
+EOF
+
+fi
+
+
+# Check whether --enable-image-blocking or --disable-image-blocking was given.
+if test "${enable_image_blocking+set}" = set; then
+  enableval="$enable_image_blocking"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define IMAGE_BLOCKING 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define IMAGE_BLOCKING 1
+EOF
+
+fi
+
+
+# Check whether --enable-acl-files or --disable-acl-files was given.
+if test "${enable_acl_files+set}" = set; then
+  enableval="$enable_acl_files"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define ACL_FILES 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define ACL_FILES 1
+EOF
+
+fi
+
+
+# Check whether --enable-trust-files or --disable-trust-files was given.
+if test "${enable_trust_files+set}" = set; then
+  enableval="$enable_trust_files"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define TRUST_FILES 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define TRUST_FILES 1
+EOF
+
+fi
+
+
+# Check whether --enable-jar-files or --disable-jar-files was given.
+if test "${enable_jar_files+set}" = set; then
+  enableval="$enable_jar_files"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define JAR_FILES 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define JAR_FILES 1
+EOF
+
+fi
+
+
+
+# Check whether --enable-regex-matching or --disable-regex-matching was given.
+if test "${enable_regex_matching+set}" = set; then
+  enableval="$enable_regex_matching"
+   regex_matching=$enableval 
+else
+   regex_matching=pcre 
+fi
+
+
+# Check whether --enable-dynamic-pcre or --disable-dynamic-pcre was given.
+if test "${enable_dynamic_pcre+set}" = set; then
+  enableval="$enable_dynamic_pcre"
+   if test $enableval = "no"; then have_pcre=no; fi 
+fi
+
+
+# Check whether --enable-dynamic-pcrs or --disable-dynamic-pcrs was given.
+if test "${enable_dynamic_pcrs+set}" = set; then
+  enableval="$enable_dynamic_pcrs"
+   if test $enableval = "no"; then have_pcrs=no; fi 
+fi
+
+
+
+# Is the regex URL matching based on libpcreposix, but we
+# don't have that library?
+#
+if test $have_pcreposix = "yes" -o $regex_matching != "pcre"; then
+  dont_miss_pcreposix=yes
+else
+  dont_miss_pcreposix=no
+fi
+
+# If we have libpcre and either we also have pcreposix or
+# we don't need pcreposix, then link pcre dynamically; else
+# build it and link statically
+#
+if test $have_pcre = "yes" -a $dont_miss_pcreposix = "yes"; then
+  echo "using libpcre"
+  pcre_dyn=yes
+  STATIC_PCRE_ONLY=#
+  LIBS="$LIBS -lpcre"
+else
+  echo "using built-in static pcre"
+  pcre_dyn=no
+  cat >> confdefs.h <<\EOF
+#define STATIC_PCRE 1
+EOF
+
+  STATIC_PCRE_ONLY=
+fi
+
+# If we have libpcrs and pcre is linked dynamically
+# then also link pcrs dynamically, else build and link
+# pcrs statically
+#
+if test $have_pcrs = "yes" -a $pcre_dyn = "yes"; then
+  echo "using libpcrs"
+  STATIC_PCRS_ONLY=#
+  LIBS="$LIBS -lpcrs"
+else
+  echo "using built-in static pcrs"
+  cat >> confdefs.h <<\EOF
+#define STATIC_PCRS 1
+EOF
+
+  STATIC_PCRS_ONLY=
+fi
+
+# Which method should be used for URL matching?
+# pcre, gnu regex or prefix matching?
+#
+if test $regex_matching = "gnu"; then
+  echo "using gnu regex for URL matching"
+  cat >> confdefs.h <<\EOF
+#define REGEX_GNU 1
+EOF
+
+  GNU_REGEX_ONLY=
+  PCRE_REGEX_ONLY=#
+elif test $regex_matching = "pcre"; then
+  echo "using pcre regex for URL matching"
+  cat >> confdefs.h <<\EOF
+#define REGEX_PCRE 1
+EOF
+
+  GNU_REGEX_ONLY=#
+  PCRE_REGEX_ONLY=
+  if test $pcre_dyn = "yes"; then
+    LIBS="$LIBS -lpcreposix"
+  fi
+else
+  echo -e "using prefix matching for URLs\nHint: This does NOT make the executable any smaller!"
+  GNU_REGEX_ONLY=#
+  PCRE_REGEX_ONLY=#
+fi
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@VERSION_MAJOR@%$VERSION_MAJOR%g
+s%@VERSION_MINOR@%$VERSION_MINOR%g
+s%@VERSION_POINT@%$VERSION_POINT%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@EXEEXT@%$EXEEXT%g
+s%@OBJEXT@%$OBJEXT%g
+s%@WIN_ONLY@%$WIN_ONLY%g
+s%@CYGWIN_FLAGS@%$CYGWIN_FLAGS%g
+s%@PTHREAD_LIB@%$PTHREAD_LIB%g
+s%@SOLARIS_ONLY@%$SOLARIS_ONLY%g
+s%@PTHREAD_ONLY@%$PTHREAD_ONLY%g
+s%@GNU_REGEX_ONLY@%$GNU_REGEX_ONLY%g
+s%@PCRE_REGEX_ONLY@%$PCRE_REGEX_ONLY%g
+s%@STATIC_PCRE_ONLY@%$STATIC_PCRE_ONLY%g
+s%@STATIC_PCRS_ONLY@%$STATIC_PCRS_ONLY%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
index 1fe8d99..09c37ed 100644 (file)
@@ -1,9 +1,9 @@
 dnl Process this file with autoconf to produce a configure script.
 dnl 
-dnl $Id: configure.in,v 1.49 2002/03/27 02:19:52 david__schmidt Exp $
+dnl $Id: configure.in,v 1.10 2001/07/18 17:25:04 oes Exp $
 dnl 
-dnl Written by and Copyright (C) 2001, 2002 the SourceForge
-dnl Privoxy team. http://www.privoxy.org/
+dnl Written by and Copyright (C) 2001 the SourceForge
+dnl IJBSWA team.  http://ijbswa.sourceforge.net
 dnl
 dnl Based on the Internet Junkbuster originally written
 dnl by and Copyright (C) 1997 Anonymous Coders and 
@@ -28,157 +28,6 @@ dnl or write to the Free Software Foundation, Inc., 59
 dnl Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 dnl 
 dnl $Log: configure.in,v $
-dnl Revision 1.49  2002/03/27 02:19:52  david__schmidt
-dnl More Mac OSX support:
-dnl - Get rid of extraneous, noisy -pthread warnings
-dnl - Define unix so we get oes' unix-tagged changes
-dnl
-dnl Revision 1.48  2002/03/26 22:29:54  swa
-dnl we have a new homepage!
-dnl
-dnl Revision 1.47  2002/03/26 16:41:00  hal9
-dnl Upped RPM Release to 3 (need to build new RH packages)
-dnl
-dnl Revision 1.46  2002/03/24 18:55:06  jongfoster
-dnl Making Docbook work under Windows
-dnl
-dnl Revision 1.45  2002/03/24 14:19:55  swa
-dnl set rpm package release in configure.in. nowhere else.
-dnl
-dnl Revision 1.44  2002/03/24 13:25:43  swa
-dnl name change related issues
-dnl
-dnl Revision 1.43  2002/03/24 12:56:21  swa
-dnl name change related issues.
-dnl
-dnl Revision 1.42  2002/03/22 18:11:37  jongfoster
-dnl Bumping version number to 2.9.12
-dnl
-dnl Revision 1.41  2002/03/19 19:30:04  morcego
-dnl - Fixing stylesheet checking on configure. If it is found, no further checks
-dnl   should be done
-dnl
-dnl - configure will now check for db2html or docbook2html (should work now
-dnl   on SuSe without the docbktls package)
-dnl
-dnl Revision 1.40  2002/03/09 14:33:30  oes
-dnl Fixing the (harmless) AC_CHECK_FILE warnings
-dnl
-dnl Revision 1.39  2002/03/08 16:46:13  oes
-dnl Added --enable-no-gifs
-dnl
-dnl Revision 1.38  2002/03/08 14:13:50  morcego
-dnl Fixing configure, to remove a command not found error.
-dnl
-dnl Revision 1.37  2002/03/08 12:58:21  oes
-dnl Tiny bugfix in AC_ARG_WITH(debug)
-dnl
-dnl Revision 1.36  2002/03/06 23:50:36  morcego
-dnl Will not test for a text browser if we are not using docbook.
-dnl
-dnl Revision 1.35  2002/03/06 21:55:52  morcego
-dnl New configure option: --with-docbook=(yes|no|directory)
-dnl Preliminary new platform detection code included. Will work with the
-dnl old one for now. No use just trowing it away
-dnl
-dnl Revision 1.34  2002/03/06 20:57:00  morcego
-dnl Fixing detection of stylesheets on SuSe.
-dnl
-dnl Revision 1.33  2002/03/05 17:31:11  morcego
-dnl Search for docbook.dsl. Should solve portability problems for SuSe.
-dnl
-dnl Revision 1.32  2002/03/05 14:07:43  morcego
-dnl configure now detects rpm topdir, and change GNUmakefile acordingly
-dnl    (based on sugestion by Sarantis Paskalis)
-dnl
-dnl Revision 1.31  2002/03/05 13:43:28  morcego
-dnl Checking for text browser, so redhat-dok can work.
-dnl
-dnl Revision 1.30  2002/03/04 17:58:01  oes
-dnl Deleted _DEBUG and PID_FILE_PATH
-dnl
-dnl Revision 1.29  2002/02/28 14:20:53  oes
-dnl Fixed detection of gethost*_r functions on Solaris
-dnl
-dnl Revision 1.28  2002/02/27 15:02:38  oes
-dnl Incremented version number
-dnl
-dnl Revision 1.27  2002/01/10 12:35:18  oes
-dnl Added cross-compile defaults to the AC_CHECK_SIZEOF macros
-dnl to silence autoconf warnings. Numbers are for Intel/Linux.
-dnl Is there a better way?
-dnl
-dnl Revision 1.26  2002/01/09 14:29:49  oes
-dnl - Added AC_CHECK_FUNC tests for the availability of
-dnl   gethostbyname_r, gethostbyaddr_r, gmtime_r and
-dnl   localtime_r, as well as AC_TRY_COMPILE tests to
-dnl   determine their signatures.
-dnl
-dnl - Fixed a bug with the init of CFLAGS that was
-dnl   reported by barsnick
-dnl
-dnl Revision 1.25  2002/01/04 15:27:18  oes
-dnl Changed quoting of CODE_STATUS for use in make
-dnl
-dnl Revision 1.24  2001/12/30 14:07:31  steudten
-dnl - Add signal handling (unix)
-dnl - Add SIGHUP handler (unix)
-dnl - Add creation of pidfile (unix)
-dnl - Add action 'top' in rc file (RH)
-dnl - Add entry 'SIGNALS' to manpage
-dnl - Add exit message to logfile (unix)
-dnl
-dnl Revision 1.23  2001/12/09 20:24:42  david__schmidt
-dnl Change from "alpha" to "beta" in configure.in
-dnl
-dnl Revision 1.22  2001/12/01 11:24:01  jongfoster
-dnl Renaming Makefile.in to GNUmakefile.in so that non-GNU versions of
-dnl make break in a more obvious way.
-dnl
-dnl Revision 1.21  2001/11/30 21:35:54  jongfoster
-dnl Bumping version number to 2.9.10
-dnl
-dnl Revision 1.20  2001/10/23 21:24:09  jongfoster
-dnl Support for FEATURE_CGI_EDIT_ACTIONS
-dnl
-dnl Revision 1.19  2001/10/07 15:33:14  oes
-dnl Removed FEATURE_DENY_GZIP
-dnl Bumped up version number
-dnl
-dnl Revision 1.18  2001/09/13 13:10:24  steudten
-dnl
-dnl PreWork for Debug Interface.
-dnl Add new option "--with-debug" to enable debugging (flags aso.)
-dnl
-dnl Revision 1.17  2001/09/12 23:44:55  david__schmidt
-dnl Mac OSX (Darwin) support added.
-dnl
-dnl Revision 1.16  2001/09/12 22:55:45  joergs
-dnl AmigaOS support added.
-dnl
-dnl Revision 1.15  2001/09/12 17:28:59  david__schmidt
-dnl
-dnl OS/2 port: update autoconf'd support for the platform.
-dnl
-dnl Revision 1.14  2001/07/30 22:12:11  jongfoster
-dnl Fixing Solaris build (I hope) and tidying up #defines:
-dnl - All feature #defines are now of the form FEATURE_xxx
-dnl - Permanently turned off WIN_GUI_EDIT
-dnl - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
-dnl
-dnl Revision 1.13  2001/07/29 17:09:17  jongfoster
-dnl Major changes to build system in order to fix these bugs:
-dnl - pthreads under Linux was broken - changed -lpthread to -pthread
-dnl - Compiling in MinGW32 mode under CygWin now correctly detects
-dnl   which shared libraries are available
-dnl - Solaris support (?) (Not tested under Solaris yet)
-dnl
-dnl Revision 1.12  2001/07/25 19:16:27  oes
-dnl Bumping version number to 2.9.8
-dnl
-dnl Revision 1.11  2001/07/21 18:00:07  jongfoster
-dnl Bumping version number to 2.9.7
-dnl
 dnl Revision 1.10  2001/07/18 17:25:04  oes
 dnl Fixed a typo
 dnl
@@ -297,631 +146,231 @@ dnl Revision 1.1.1.1  2001/05/15 13:58:50  oes
 dnl Initial import of version 2.9.3 source tree
 dnl
 dnl 
-
-
-dnl =================================================================
-dnl AutoConf Initialization
-dnl =================================================================
-
-AC_REVISION($Revision: 1.49 $)
 AC_INIT(jcc.c)
 AC_CONFIG_HEADER(config.h)
-AC_CANONICAL_HOST
-
-dodk=auto
-DKPREFIX=none
-AC_ARG_WITH(docbook, dnl
-  --with-docbook=[[yes|no|directory]]  
-                           Enable docbook documentation creation 
-                          (default = yes, for gnu and linux),[dnl
-case "$with_docbook" in
-yes) dodk=yes;;
-no) dodk=no;;
-*) 
-       dodk=no
-       DKPREFIX=$withval
-       ;;
-esac
-])
-DB2HTML=false
-AC_ARG_WITH(db2html, dnl
-  --with-db2html=<path/executable>
-                          Set the location of the docbook to html converter
-                          (default = search),[dnl
-DB2HTML=$withval
-])
-
-dnl =================================================================
-dnl Application version number
-dnl =================================================================
 
 VERSION_MAJOR=2
 VERSION_MINOR=9
-VERSION_POINT=13
-VERSION_RPM_PACKAGE=3
-CODE_STATUS="beta"
-
-dnl CODE_STATUS can be "alpha", "beta", or "stable", and will be
-dnl used for CGI output
-
-dnl =================================================================
-dnl Substitute the version numbers
-dnl =================================================================
+VERSION_POINT=7
 
 AC_SUBST(VERSION_MAJOR)
 AC_SUBST(VERSION_MINOR)
 AC_SUBST(VERSION_POINT)
-AC_SUBST(VERSION_RPM_PACKAGE)
-AC_SUBST(CODE_STATUS)
 
+dnl This can be "alpha", "beta", or "stable"
+dnl and will be used for CGI output
 dnl
+AC_DEFINE(CODE_STATUS, "alpha")
+
 AC_DEFINE_UNQUOTED(VERSION_MAJOR,${VERSION_MAJOR})
 AC_DEFINE_UNQUOTED(VERSION_MINOR,${VERSION_MINOR})
 AC_DEFINE_UNQUOTED(VERSION_POINT,${VERSION_POINT})
-AC_DEFINE_UNQUOTED(VERSION_RPM_PACKAGE,${VERSION_RPM_PACKAGE})
 AC_DEFINE_UNQUOTED(VERSION,"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_POINT}")
-AC_DEFINE_UNQUOTED(CODE_STATUS,"${CODE_STATUS}")
 
-dnl =================================================================
-dnl Checks for programs needed to build.
-dnl =================================================================
+dnl Checks for programs.
+dnl AC_PROG_CXX
 AC_PROG_CC
 AC_PROG_CPP
-dnl AC_PROG_CXX
 dnl AC_PROG_INSTALL
 dnl AC_PROG_LN_S
 dnl AC_PROG_MAKE_SET
 dnl RANLIB is for PCRE:
 dnl AC_PROG_RANLIB
 
-AC_CHECK_PROG(GDB,gdb,yes,no)
-
-dnl =================================================================
-dnl debug, gcc and gdb support 
-dnl =================================================================
-
-AC_ARG_WITH(debug,
-        [  --with-debug            Enable debug mode],
-        [
-                if test "x$withval" != "xno" ; then
-                   if test $ac_cv_prog_cc_g = yes; then
-                     if test "$GCC" = yes; then
-                       if test "$GDB"; then
-                         CFLAGS="-ggdb"
-                       else
-                         CFLAGS="-g"
-                       fi
-                       CFLAGS="$CFLAGS -Wshadow  -Wconversion"
-                     else
-                       CFLAGS="-g"
-                     fi
-                  fi
-                fi
-        ],
-       [
-           if test "X$CFLAGS" = "X"; then # if CFLAGS are unset
-             if test "$GCC" = yes; then
-               CFLAGS="-O2"
-             else
-               CFLAGS=
-             fi
-           fi
-       ]
-)
-
-dnl =================================================================
-dnl additional gcc flags
-dnl =================================================================
-dnl 
-if test "$GCC"; then
-  CFLAGS="-pipe $CFLAGS"
-fi
+AC_MINGW32
+AC_CYGWIN
+AC_EXEEXT
+AC_OBJEXT
 
+dnl Checks for libraries.
+dnl Note: Some systems have the library but not the system header file,
+dnl       so we must check for both.
+AC_CHECK_LIB(pcre, pcre_compile, [AC_CHECK_HEADER(pcre.h, [have_pcre=yes], [have_pcre=no])], [have_pcre=no])
+AC_CHECK_LIB(pcreposix, regcomp, [AC_CHECK_HEADER(pcreposix.h, [have_pcreposix=yes], [have_pcreposix=no])], [have_pcreposix=no], -lpcre)
+AC_CHECK_LIB(pcrs, pcrs_compile, [AC_CHECK_HEADER(pcrs.h, [have_pcrs=yes], [have_pcrs=no])], [have_pcrs=no])
 
-dnl =================================================================
-dnl Build type
-dnl =================================================================
-dnl
-dnl Must do this first.
-dnl
-dnl Reason: This sets CFLAGS in order to switch the Cygwin compiler
-dnl into Cygwin or MinGW32 modes.  Depending on the mode selected,
-dnl the compiler will use completely different sets of library
-dnl and include files.
-dnl 
-dnl =================================================================
+dnl Checks for header files.
+AC_HEADER_STDC
+dnl AC_HEADER_SYS_WAIT
+dnl AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/time.h unistd.h)
+dnl limits.h is for PCRE:
+dnl AC_CHECK_HEADERS(limits.h)
 
-AC_MINGW32
-AC_CYGWIN
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
 
-if test "$MINGW32" = "yes"; then
-  target_type=mingw
-else
-  if test "$CYGWIN" = "yes"; then
-    target_type=cygwin
-  else
-    target_type=unix
-  fi
-fi
+dnl Checks for library functions.
+dnl AC_TYPE_SIGNAL
+dnl AC_CHECK_FUNC(strstr)
+dnl bcopy and memmove are for PCRE
+AC_CHECK_FUNCS(strerror bcopy memmove)
 
-if test $dodk = auto; then
-       dodk=no
-       if test $target_type = unix; then
-               case "$host_os" in
-               linux* | gnu*)
-                       dodk=yes
-               ;;
-               esac
-       fi
-fi
+dnl Build type
 
-dnl Decide what to do based on target_type
 dnl Note: PTHREAD_LIB is always set, even if pthread is disabled.
-dnl This is because we don't know yet whether pthread is enabled.
 
 AC_ARG_ENABLE(mingw32,
 [  --enable-mingw32        Use mingw32 for a Windows GUI],
 [if test $enableval = yes; then
-  target_type=mingw
-fi])
-
-if test $target_type = mingw; then
-  WIN_ONLY=
-  SPECIAL_CFLAGS="-mwindows -mno-cygwin"
-  PTHREAD_LIB=-lpthreadGC
-  echo "Using mingw32 (Win32 GUI)"
-else
-  WIN_ONLY=#
-  if test $target_type = cygwin; then
-    SPECIAL_CFLAGS="-mno-win32"
-    PTHREAD_LIB=
-    echo "Using Cygnus (Win32 command line)"
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    PTHREAD_LIB=-lpthreadGC
+    echo "Using mingw32 (Win32 GUI)"
   else
-    SPECIAL_CFLAGS=
-    PTHREAD_LIB=-lpthread
-  fi
-fi
-AC_SUBST(WIN_ONLY)
-
-dnl Checking which text html browser we have avaliable
-if test $dodk != no; then
-       AC_CHECK_PROGS(WDUMP,w3m lynx links,false)
-       if test "$WDUMP" = false; then
-               AC_MSG_ERROR(You need some kind of text browser to continue \(w3m, lynx and links are supported\))
-       fi
-       if test $DB2HTML = false; then
-               dnl We need to clean the variable, otherwise AC_CHECK_PROGS
-               dnl will fail   
-               DB2HTML=""
-               AC_CHECK_PROGS(DB2HTML,db2html docbook2html,false)
-       fi
-fi
-AC_SUBST(WDUMP)
-AC_SUBST(DB2HTML)
-
-dnl If we use rpm, we need to check where %_topdir is
-AC_CHECK_PROGS(RPMBIN,rpm,false)
-if test $RPMBIN != false; then
-               RPM_BASE=`rpm --eval "%{_topdir}"`
-               if test "$RPM_BASE" = ""; then
-                       RPM_BASE=/usr/src/redhat
-               fi
-fi
-AC_SUBST(RPM_BASE)
-
-dnl Check for jade, so we can build the documentation
-AC_CHECK_PROGS(JADEBIN,jade openjade,false)
-AC_SUBST(JADEBIN)
-
-dnl Check for man2html for docs.
-AC_CHECK_PROGS(MAN2HTML,man2html,false)
-AC_SUBST(MAN2HTML)
-
-dnl Checking for the docbook.dsl stylesheet file
-dnl It is still not portable (directory slash)
-if test $dodk = yes; then
-  if test $DKPREFIX = none; then
-    for i in /usr/share/sgml/docbook/dsssl-stylesheets /usr/share/sgml/docbkdsl /usr/share/sgml/docbook-dsssl; do
-      echo -n "checking for $i/html/docbook.dsl..."
-      if test -f $i/html/docbook.dsl; then
-        echo "yes"
-        DKPREFIX=$i
-        break
-      else
-        echo "no"
-      fi
-    done
-  fi
-fi
-AC_SUBST(DKPREFIX)
-
-dnl Save old CFLAGS so we can restore them later, then add SPECIAL_CFLAGS
-old_CFLAGS_nospecial=$CFLAGS
-CFLAGS="$CFLAGS $SPECIAL_CFLAGS"
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      PTHREAD_LIB=
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+      PTHREAD_LIB=-lpthread
+    fi
+  fi],
+[if test "$MINGW32" = "yes"; then
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    PTHREAD_LIB=-lpthreadGC
+    echo "Using mingw32 (Win32 GUI)"
+  else
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      PTHREAD_LIB=
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+      PTHREAD_LIB=-lpthread
+    fi
+  fi])
 
-# Hack to force AutoConf to use the CFLAGS we just set
-dnl Warning: This may break with a future version of Autoconf
-dnl          Tested with autoconf 2.13
-ac_cpp='$CPP $CPPFLAGS $SPECIAL_CFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+AC_SUBST(WIN_ONLY)
+AC_SUBST(CYGWIN_FLAGS)
+AC_SUBST(PTHREAD_LIB)
 
+SOLARIS_ONLY=#
+AC_SUBST(SOLARIS_ONLY)
 
-dnl =================================================================
-dnl Thread support
-dnl =================================================================
+dnl Features
 
-AC_CHECK_HEADER(pthread.h, [have_pthread=yes], [have_pthread=no])
+AC_ARG_ENABLE(toggle,
+[  --disable-toggle        Don't support temporary disable],
+[if test $enableval = yes; then
+  AC_DEFINE(TOGGLE)
+fi],AC_DEFINE(TOGGLE))
 
 AC_ARG_ENABLE(pthread,
 [  --disable-pthread       Don't use POSIX threads (pthreads)],
-[if test $enableval = no; then
-  # Disable pthreads
-  have_pthread=no
-fi])
-
-if test $have_pthread = yes; then
+[if test $enableval = yes; then
   PTHREAD_ONLY=
   AC_DEFINE(FEATURE_PTHREAD)
-  echo Using POSIX threads
-  if test "$GCC" = "yes"; then
-    # Set a GCC specific switch:
-    if test "$target_type" = "unix"; then
-      # This compiler switch makes Linux thread-safe
-      # Don't know about other OS's?  Is this switch
-      # supported?
-      PTHREAD_LIB=
-      SPECIAL_CFLAGS="-pthread"
-    fi
-  fi
 else
   PTHREAD_ONLY=#
-  echo Using native threads
-fi
-
-AC_SUBST(PTHREAD_ONLY)
-
-dnl =================================================================
-dnl Support for thread-safe versions of gethostbyaddr, gethostbyname,
-dnl gmtime and localtime
-dnl =================================================================
-
-dnl Next line needed to find the gethost*_r functions on Solaris
-AC_CHECK_LIB(nsl, gethostbyname)
-
-AC_CHECK_FUNC(gethostbyaddr_r, [
-  AC_MSG_CHECKING([signature of gethostbyaddr_r])
-  AC_TRY_COMPILE([
-#   include <netdb.h>
-  ], [
-    struct hostent *h, *hp;
-    char *a, *b;
-    int l, bl, t, e;
-    (void) gethostbyaddr_r(a, l, t, h, b, bl, &hp, &e)
-  ], [
-    AC_DEFINE(HAVE_GETHOSTBYADDR_R_8_ARGS)
-    AC_MSG_RESULT([8 args])
-  ], [
-    AC_TRY_COMPILE([
-#     include <netdb.h>
-    ], [
-      struct hostent *h;
-      char *a, *b;
-      int l, bl, t, e;
-      (void) gethostbyaddr_r(a, l, t, h, b, bl, &e)
-    ], [
-      AC_DEFINE(HAVE_GETHOSTBYADDR_R_7_ARGS)
-      AC_MSG_RESULT([7 args])
-    ], [
-      AC_TRY_COMPILE([
-#       include <netdb.h>
-      ], [
-        struct hostent_data *d;
-        struct hostent *h;
-        char a,
-        int l, t;
-        (void) gethostbyaddr_r(a, l, t, h, d)
-      ], [
-        AC_DEFINE(HAVE_GETHOSTBYADDR_R_5_ARGS)
-        AC_MSG_RESULT([5 args])
-      ], [
-        AC_MSG_RESULT(unrecognised)
-      ])
-    ])
-  ])
-], [
-  AC_MSG_RESULT(no)
-])
-
-AC_CHECK_FUNC(gethostbyname_r, [
-  AC_MSG_CHECKING([signature of gethostbyname_r])
-  AC_TRY_COMPILE([
-#   include <netdb.h>
-  ], [
-    struct hostent *h, *r;
-    char *n, *b;
-    int bl, e;
-    (void) gethostbyname_r(n, h, b, bl, &r, &e)
-  ], [
-    AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARGS)
-    AC_MSG_RESULT([6 args])
-  ], [
-    AC_TRY_COMPILE([
-#     include <netdb.h>
-    ], [
-      struct hostent *h;
-      char *n, *b;
-      int bl, e;
-      (void) gethostbyname_r(n, h, b, bl, &e)
-    ], [
-      AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARGS)
-      AC_MSG_RESULT([5 args])
-    ], [
-      AC_TRY_COMPILE([
-#       include <netdb.h>
-      ], [
-        struct hostent_data *d;
-        struct hostent *h;
-        char *n,
-        (void) gethostbyname_r(n, h, d)
-      ], [
-        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARGS)
-        AC_MSG_RESULT([3 args])
-      ], [
-        AC_MSG_RESULT(unrecognised)
-      ])
-    ])
-  ])
-], [
-  AC_MSG_RESULT(no)
-])
-
-AC_CHECK_FUNC(gmtime_r, [
-  AC_MSG_CHECKING([signature of gmtime_r])
-  AC_TRY_COMPILE([
-#   include <time.h>
-  ], [
-    struct time *t;
-    struct tm *tm;
-    (void) gmtime_r(t, tm)
-  ], [
-    AC_MSG_RESULT(ok)
-    AC_DEFINE(HAVE_GMTIME_R)
-  ], [
-    AC_MSG_RESULT(unrecognised)
-  ])
-], [
-  AC_MSG_RESULT(no)
-])
-
-AC_CHECK_FUNC(localtime_r, [
-  AC_MSG_CHECKING([signature of localtime_r])
-  AC_TRY_COMPILE([
-#   include <time.h>
-  ], [
-    struct time *t;
-    struct tm *tm;
-    (void) localtime_r(t, tm)
-  ], [
-    AC_MSG_RESULT(ok)
-    AC_DEFINE(HAVE_LOCALTIME_R)
-  ], [
-    AC_MSG_RESULT(unrecognised)
-  ])
-], [
-  AC_MSG_RESULT(no)
+fi],[AC_DEFINE(FEATURE_PTHREAD)
+  PTHREAD_ONLY=
 ])
+AC_SUBST(PTHREAD_ONLY)
 
-dnl =================================================================
-dnl Solaris specific
-dnl FIXME: Not tested on Solaris yet...
-dnl =================================================================
-
-
-SOCKET_LIB=
-
-case "$host" in
-*-solaris*) SOCKET_LIB="-lsocket -lnsl"
-            AC_DEFINE(__EXTENSIONS__)
-            if test "$GCC" = "yes"; then
-              # Set a GCC specific switch:
-              # This compiler switch makes Solaris thread-safe
-              PTHREAD_LIB=
-              SPECIAL_CFLAGS="-pthreads"
-            else
-              # What do we do without GCC? Guess this:
-              SPECIAL_CFLAGS="-D_REENTRANT"
-            fi
-;;
-esac
-
-AC_SUBST(SOCKET_LIB)
-
-dnl =================================================================
-dnl OS/2 specific
-dnl =================================================================
-
-case "$host" in
-*-os2-emx*) SOCKET_LIB=-lsocket
-;;
-esac
-
-AC_SUBST(SOCKET_LIB)
-
-dnl =================================================================
-dnl Mac OSX specific
-dnl =================================================================
-    
-case "$host" in
-*-apple-darwin*) SPECIAL_CFLAGS="-Dunix"
-;;  
-esac
-
-dnl =================================================================
-dnl AmigaOS specific
-dnl =================================================================
-
-AMIGAOS_ONLY=#
-
-case "$host" in
-*-amigaos) AMIGAOS_ONLY=
-;;
-esac
-
-AC_SUBST(AMIGAOS_ONLY)
-
-dnl =================================================================
-dnl Check for standard compiler stuff
-dnl =================================================================
-
-AC_EXEEXT
-AC_OBJEXT
-AC_HEADER_STDC
-AC_C_CONST
-AC_TYPE_SIZE_T
-AC_CHECK_SIZEOF(int, 4)
-AC_CHECK_SIZEOF(char *, 4)
-AC_CHECK_SIZEOF(long, 4)
-AC_CHECK_SIZEOF(long long, 8)
-AC_CHECK_SIZEOF(size_t, 4)
-
-dnl Checks for header files.
-dnl AC_HEADER_SYS_WAIT
-dnl AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/time.h unistd.h)
-
-dnl Checks for library functions.
-dnl AC_TYPE_SIGNAL
-dnl AC_CHECK_FUNC(strstr)
-dnl bcopy and memmove are for PCRE
-AC_CHECK_FUNCS(strerror bcopy memmove)
-
-
-dnl =================================================================
-dnl Checks for libraries.
-dnl =================================================================
-dnl Note: Some systems may have the library but not the system header
-dnl       file, so we must check for both.
-AC_CHECK_LIB(pcre, pcre_compile, [AC_CHECK_HEADER(pcre.h, [have_pcre=yes], [have_pcre=no])], [have_pcre=no])
-AC_CHECK_LIB(pcreposix, regcomp, [AC_CHECK_HEADER(pcreposix.h, [have_pcreposix=yes], [have_pcreposix=no])], [have_pcreposix=no], -lpcre)
-AC_CHECK_LIB(pcrs, pcrs_compile, [AC_CHECK_HEADER(pcrs.h, [have_pcrs=yes], [have_pcrs=no])], [have_pcrs=no])
-
-
-dnl =================================================================
-dnl Always defined
-dnl =================================================================
-
-AC_DEFINE(__MT__)
-
-dnl =================================================================
-dnl Features
-dnl =================================================================
-
-AC_ARG_ENABLE(toggle,
-[  --disable-toggle         Don't support temporary disable],
-[if test $enableval = yes; then
-  AC_DEFINE(FEATURE_TOGGLE)
-fi],AC_DEFINE(FEATURE_TOGGLE))
+AC_ARG_ENABLE(gzip,
+[  --enable-gzip           Allow gzip'ed transfer of documents. Note that this will make content modification impossible.],
+[if test $enableval = "no"; then
+  AC_DEFINE(DENY_GZIP)
+fi])
 
 AC_ARG_ENABLE(force,
-[  --disable-force          Don't allow single-page disable],
+[  --disable-force         Don't allow blockfle to be bypassed],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_FORCE_LOAD)
-fi],AC_DEFINE(FEATURE_FORCE_LOAD))
+  AC_DEFINE(FORCE_LOAD)
+fi],AC_DEFINE(FORCE_LOAD))
 
 AC_ARG_ENABLE(fast-redirects,
 [  --disable-fast-redirects Don't support fast redirects],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_FAST_REDIRECTS)
-fi], AC_DEFINE(FEATURE_FAST_REDIRECTS))
+  AC_DEFINE(FAST_REDIRECTS)
+fi], AC_DEFINE(FAST_REDIRECTS))
 
 AC_ARG_ENABLE(killpopup,
-[  --disable-killpopup      Never block popups],
+[  --disable-killpopup     Never block popups],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_KILL_POPUPS)
-fi],AC_DEFINE(FEATURE_KILL_POPUPS))
+  AC_DEFINE(KILLPOPUPS)
+fi],AC_DEFINE(KILLPOPUPS))
 
 AC_ARG_ENABLE(stats,
-[  --disable-stats          Don't keep statistics],
+[  --disable-stats         Don't keep statistics],
+[if test $enableval = yes; then
+  AC_DEFINE(STATISTICS)
+fi],AC_DEFINE(STATISTICS))
+
+AC_ARG_ENABLE(split-proxy-args,
+[  --disable-split-proxy-args  One big show-proxy-args page, not one per file.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_STATISTICS)
-fi],AC_DEFINE(FEATURE_STATISTICS))
+  AC_DEFINE(SPLIT_PROXY_ARGS)
+fi],AC_DEFINE(SPLIT_PROXY_ARGS))
+
+AC_ARG_ENABLE(webdav,
+[  --disable-webdav        Don't support WebDAV.  This option stops MS Outlook
+                          Express from accessing HotMail e-mail.],
+[if test $enableval = yes; then
+  AC_DEFINE(WEBDAV)
+fi],
+AC_DEFINE(WEBDAV))
 
 AC_ARG_ENABLE(ie-images,
-[  --disable-ie-images      Don't auto-detect whether a request from MS Internet
-                           Explorer is for an image or HTML.],
+[  --disable-ie-images     Don't auto-detect whether a request from MS Internet
+                          Explorer is for an image or HTML.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_IMAGE_DETECT_MSIE)
+  AC_DEFINE(DETECT_MSIE_IMAGES)
 fi],
-AC_DEFINE(FEATURE_IMAGE_DETECT_MSIE))
+AC_DEFINE(DETECT_MSIE_IMAGES))
 
 AC_ARG_ENABLE(image-blocking,
-[  --disable-image-blocking Don't try to figure out whether a request is 
-                           for an image or HTML - assume HTML.],
+[  --disable-image-blocking  Don't try to figure out whether a request is 
+                            for an image or HTML - assume HTML.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_IMAGE_BLOCKING)
+  AC_DEFINE(IMAGE_BLOCKING)
 fi],
-AC_DEFINE(FEATURE_IMAGE_BLOCKING))
+AC_DEFINE(IMAGE_BLOCKING))
 
 AC_ARG_ENABLE(acl-files,
-[  --disable-acl-files      Prevents the use of ACL files to control access to
-                           the proxy by IP address.],
+[  --disable-acl-files     Prevents the use of ACL files to control access to
+                          the proxy by IP address.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_ACL)
+  AC_DEFINE(ACL_FILES)
 fi],
-AC_DEFINE(FEATURE_ACL))
+AC_DEFINE(ACL_FILES))
 
 AC_ARG_ENABLE(trust-files,
-[  --disable-trust-files    Prevents the use of trust files.],
+[  --disable-trust-files   Prevents the use of trust files.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_TRUST)
+  AC_DEFINE(TRUST_FILES)
 fi],
-AC_DEFINE(FEATURE_TRUST))
+AC_DEFINE(TRUST_FILES))
 
 AC_ARG_ENABLE(jar-files,
-[  --disable-jar-files      Prevents the use of jar files to capture cookies.],
-[if test $enableval = yes; then
-  AC_DEFINE(FEATURE_COOKIE_JAR)
-fi],
-AC_DEFINE(FEATURE_COOKIE_JAR))
-
-AC_ARG_ENABLE(editor,
-[  --disable-editor         Prevents the use of the web-based actions file
-                           editor and web-based temporary disable setting.],
+[  --disable-jar-files     Prevents the use of jar files to capture cookies.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_CGI_EDIT_ACTIONS)
+  AC_DEFINE(JAR_FILES)
 fi],
-AC_DEFINE(FEATURE_CGI_EDIT_ACTIONS))
-
-AC_ARG_ENABLE(no-gifs,
-[  --enable-no-gifs         Use politically correct PNG format instead of GIF
-                           for built-in images. May not work with all browsers.],
-[if test $enableval = yes; then
-  AC_DEFINE(FEATURE_NO_GIFS)
-fi])
-
+AC_DEFINE(JAR_FILES))
 
 dnl pcre/pcrs is needed for CGI anyway, so
 dnl the choice is only between static and
 dnl dynamic:
 
 AC_ARG_ENABLE(regex-matching,
-[  --enable-regex-matching=pcre  Use perl-compatible regex for actionsfile
-                                pattern matching (default)
-  --enable-regex-matching=gnu   Use gnu style regex for actionsfile pattern
-                                matching (-> bigger binary)
-  --disable-regex-matching      Don't use regex matching, compare URL
-                                prefix instead (won't shrink birary)],
+[  --enable-regex-matching=pcre     Use perl-compatible regex for actionsfile pattern matching (default)
+  --enable-regex-matching=gnu      Use gnu style regex for actionsfile pattern matching (-> bigger binary)
+  --disable-regex-matching         Don't use regex matching, compare URL prefix instead (won't shrink birary)],
 [ regex_matching=$enableval ],
 [ regex_matching=pcre ])
 
 AC_ARG_ENABLE(dynamic-pcre,
-[  --disable-dynamic-pcre        Use the built-in, static pcre, even if
-                                libpcre is available],
+[  --disable-dynamic-pcre           Use the built-in, static pcre, even if libpcre is available],
 [ if test $enableval = "no"; then have_pcre=no; fi ])
 
 AC_ARG_ENABLE(dynamic-pcrs,
-[  --disable-dynamic-pcrs        Use the built-in, static pcrs, even if
-                                libpcrs is available],
+[  --disable-dynamic-pcrs           Use the built-in, static pcrs, even if libpcrs is available],
 [ if test $enableval = "no"; then have_pcrs=no; fi ])
 
 
@@ -991,15 +440,5 @@ AC_SUBST(PCRE_REGEX_ONLY)
 AC_SUBST(STATIC_PCRE_ONLY)
 AC_SUBST(STATIC_PCRS_ONLY)
 
-dnl =================================================================
-dnl Final cleanup and output
-dnl =================================================================
-
-dnl Remove the SPECIAL_CFLAGS stuff from CFLAGS, and add it seperately
-dnl in the Makefile
-CFLAGS=$old_CFLAGS_nospecial
-AC_SUBST(SPECIAL_CFLAGS)
-
-AC_SUBST(PTHREAD_LIB)
+AC_OUTPUT(Makefile)
 
-AC_OUTPUT(GNUmakefile)
old mode 100644 (file)
new mode 100755 (executable)
similarity index 83%
rename from vc_console.dsp
rename to console_junkbuster.dsp
index 6e1ee2d..7168d3b
@@ -1,30 +1,30 @@
-# Microsoft Developer Studio Project File - Name="vc_console" - Package Owner=<4>\r
+# Microsoft Developer Studio Project File - Name="console_junkbuster" - Package Owner=<4>\r
 # Microsoft Developer Studio Generated Build File, Format Version 5.00\r
 # ** DO NOT EDIT **\r
 \r
 # TARGTYPE "Win32 (x86) Console Application" 0x0103\r
 \r
-CFG=vc_console - Win32 Debug with Win32 threads\r
+CFG=console_junkbuster - Win32 Debug with Win32 threads\r
 !MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
 !MESSAGE use the Export Makefile command and run\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_console.mak".\r
+!MESSAGE NMAKE /f "console_junkbuster.mak".\r
 !MESSAGE \r
 !MESSAGE You can specify a configuration when running NMAKE\r
 !MESSAGE by defining the macro CFG on the command line. For example:\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_console.mak"\\r
- CFG="vc_console - Win32 Debug with Win32 threads"\r
+!MESSAGE NMAKE /f "console_junkbuster.mak"\\r
+ CFG="console_junkbuster - Win32 Debug with Win32 threads"\r
 !MESSAGE \r
 !MESSAGE Possible choices for configuration are:\r
 !MESSAGE \r
-!MESSAGE "vc_console - Win32 Release" (based on\\r
+!MESSAGE "console_junkbuster - Win32 Release" (based on\\r
  "Win32 (x86) Console Application")\r
-!MESSAGE "vc_console - Win32 Debug" (based on\\r
+!MESSAGE "console_junkbuster - Win32 Debug" (based on\\r
  "Win32 (x86) Console Application")\r
-!MESSAGE "vc_console - Win32 Debug with Win32 threads" (based on\\r
+!MESSAGE "console_junkbuster - Win32 Debug with Win32 threads" (based on\\r
  "Win32 (x86) Console Application")\r
-!MESSAGE "vc_console - Win32 Release with Win32 threads" (based on\\r
+!MESSAGE "console_junkbuster - Win32 Release with Win32 threads" (based on\\r
  "Win32 (x86) Console Application")\r
 !MESSAGE \r
 \r
@@ -34,7 +34,7 @@ CFG=vc_console - Win32 Debug with Win32 threads
 CPP=cl.exe\r
 RSC=rc.exe\r
 \r
-!IF  "$(CFG)" == "vc_console - Win32 Release"\r
+!IF  "$(CFG)" == "console_junkbuster - Win32 Release"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 0\r
@@ -58,7 +58,7 @@ LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /machine:I386\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug"\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Debug"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 1\r
@@ -82,7 +82,7 @@ LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Debug with Win32 threads"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 1\r
@@ -107,7 +107,7 @@ LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Release with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Release with Win32 threads"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 0\r
@@ -136,10 +136,10 @@ LINK32=link.exe
 \r
 # Begin Target\r
 \r
-# Name "vc_console - Win32 Release"\r
-# Name "vc_console - Win32 Debug"\r
-# Name "vc_console - Win32 Debug with Win32 threads"\r
-# Name "vc_console - Win32 Release with Win32 threads"\r
+# Name "console_junkbuster - Win32 Release"\r
+# Name "console_junkbuster - Win32 Debug"\r
+# Name "console_junkbuster - Win32 Debug with Win32 threads"\r
+# Name "console_junkbuster - Win32 Release with Win32 threads"\r
 # Begin Group "JunkBuster"\r
 \r
 # PROP Default_Filter ""\r
@@ -173,22 +173,6 @@ SOURCE=.\cgi.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\cgiedit.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgiedit.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.h\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=.\config.h\r
 # End Source File\r
 # Begin Source File\r
@@ -261,11 +245,11 @@ SOURCE=.\project.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.c\r
+SOURCE=.\showargs.c\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.h\r
+SOURCE=.\showargs.h\r
 # End Source File\r
 # End Group\r
 # Begin Group "Win32"\r
@@ -291,20 +275,20 @@ SOURCE=.\win32.h
 \r
 SOURCE=.\pcre\chartables.c\r
 \r
-!IF  "$(CFG)" == "vc_console - Win32 Release"\r
+!IF  "$(CFG)" == "console_junkbuster - Win32 Release"\r
 \r
 # PROP Exclude_From_Build 1\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug"\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Debug"\r
 \r
 # PROP Exclude_From_Build 1\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Debug with Win32 threads"\r
 \r
 # PROP BASE Exclude_From_Build 1\r
 # PROP Exclude_From_Build 1\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Release with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Release with Win32 threads"\r
 \r
 # PROP BASE Exclude_From_Build 1\r
 # PROP Exclude_From_Build 1\r
diff --git a/contrib.sh b/contrib.sh
deleted file mode 100755 (executable)
index 74d5b72..0000000
+++ /dev/null
@@ -1,4035 +0,0 @@
-#!/bin/bash
-
-echo "This script will create the gen_list contrib files in the current"
-echo "directory.  Do you wish to continue? [y/n]"
-
-typeset ans="n"
-read ans
-
-if [[ ${ans} != [Yy]* ]]; then
-       echo "Goodbye."
-       exit 1
-fi
-
-
-typeset fileList="Makefile README addr_clean.pl gen_list.c gen_list.h isa.c
-isa.h main.c malloc_police.c malloc_police.h rec_char.c rec_char.h
-rec_charptr.c rec_charptr.h rec_double.c rec_double.h rec_long.c
-rec_long.h rec_malloc_police.c rec_malloc_police.h"
-
-
-for i in ${fileList}; do
-
-       echo "creating ${i}"
-
-       ####################################
-       ##  sed explained:
-       ##
-       ##              -e "s/^\(#${i}:\)\(.*\)/\2/"
-       ##                      Find lines belonging to
-       ##                      this file and remove the
-       ##                      filename prefix.
-       ##
-       ##              -e "t print"
-       ##                      Jump to label print if the
-       ##                      above s command matched
-       ##
-       ##              -e "d"
-       ##                      This command is skipped
-       ##                      when the s command fails.
-       ##                      This will remove any
-       ##                      non-matching data.
-       ##
-       ##              -e ":print"
-       ##                      The last thing sed does
-       ##                      is print the data.  So,
-       ##                      by now, we only print
-       ##                      lines belonging to the file.
-       ##
-       ####################################
-
-       sed     -e "s/^\(#${i}:\)\(.*\)/\2/" \
-                       -e "t print" \
-                       -e "d" \
-                       -e ":print" \
-                       ${0} > ${i}
-
-done
-
-echo "done."
-
-exit 0
-
-#Makefile:PROGRAM      = test_list
-#Makefile:CFLAGS       = -g
-#Makefile:SRC          = main.c isa.c gen_list.c rec_char.c rec_charptr.c rec_double.c rec_long.c rec_malloc_police.c malloc_police.c
-#Makefile:OBJS         = main.o isa.o gen_list.o rec_char.o rec_charptr.o rec_double.o rec_long.o rec_malloc_police.o malloc_police.o
-#Makefile:
-#Makefile:all : $(PROGRAM)
-#Makefile:
-#Makefile:$(PROGRAM) : $(OBJS)
-#Makefile:     gcc $(CFLAGS) -o $(PROGRAM) $(OBJS)
-#Makefile:
-#Makefile:clean:
-#Makefile:     rm -f $(OBJS)
-#Makefile:
-#Makefile:clobber: clean
-#Makefile:     rm -f $(PROGRAM)
-
-
-#README:This list supports:
-#README:       copy construction,
-#README:       "virtual" destruction,
-#README:       streaming,
-#README:       comparison (equal comparison currently supported).
-#README:
-#README:With the "object oriented" nature of the list, nodes, and records; it is
-#README:easily concievable that sorted lists and hash tables could be implemented
-#README:with little extra effort.
-#README:
-#README:
-#README:Philosophical point:
-#README:
-#README:I am sure there is room for improvement with this design.  I am
-#README:submitting this as a generic doubly linked list recomendation for IJB.
-#README:Whatever the "collective" decides is fine with me.
-#README:
-#README:This implementation uses the "naming space" of gen_list, derived_rec,
-#README:construct, copy construct, stream, destruct, etc...  These are open to
-#README:argument.  I just used what was familiar to me and others in the "OO"
-#README:community.  If these need changed to be adopted ... "so be it".
-#README:
-#README:
-#README:Implementation point:
-#README:
-#README:I assume this is too late for a "3.0" release.  As I work for an
-#README:airline, the whole past summer has been hectic (not to mention the
-#README:last 4 months); but things have begun to settle down and I am
-#README:following the IJB lists a bit more closely.  And I would like to say
-#README:"HOLY CRAP!" .. you guys have accompolished a lot!  Way to go.
-#README:
-#README:But, the adoption of a better linked list package should at least be
-#README:high on the next release list (if not the current one).  If you choose
-#README:this submission or not, so be it.  But as a "data structure" man, I
-#README:think IJB's linked lists need addressing.
-#README:
-#README:
-#README:List/Enlist note:
-#README:
-#README:I have noticed the list.c file.  If this generic list is adopted, I
-#README:think all existing functionallity could be duplicated with the
-#README:"copy_contruct", "equal", and "destruct" `virtuals'.  This would also
-#README:eliminate and/or enhance the other manually maintained lists in IJB.
-#README:
-#README:
-#README:Debug note:
-#README:
-#README:Since the generic list defined a "stream" virtual, it could be programmed
-#README:that the list could print itself whenever a FATAL error occurs.  A user (or
-#README:programmer) could read the list and hopefully determine the cause of the
-#README:abend.
-#README:
-#README:
-#README:Potential note:
-#README:
-#README:Think of the possibilites of a linked list, sorted list, and/or a hash
-#README:list.  Think of a request to a web site that has been referenced
-#README:before.  If a hash list keep track of all block requests and regexp
-#README:change commands, then a site could be blocked and/or modified without
-#README:ever consulting the actions lists again.  What a speed up!
-#README:
-#README:What if some of the current lists were kept in sorted lists?  Then a
-#README:search for a particular record could be a binary search instead of a
-#README:linear search.
-#README:
-#README:The actions file(s) and regexp files(s) could be inserted into the
-#README:list from front to back order (or visa versa) and the processing would
-#README:take place in actual file order (which is more natural); rather than
-#README:in reverse order (as it is today).
-#README:
-#README:
-#README:Thank you for you time and attention to this contribution.  If it is
-#README:"blessed" by the group, I am available to give time to integrating
-#README:this into IJB.
-#README:
-#README:Let me know what y'all think about this package.
-#README:
-#README:-- 
-#README:Rodney
-
-
-#addr_clean.pl:#!/usr/bin/perl
-#addr_clean.pl:
-#addr_clean.pl:##      *********************************************************************
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * File                  :       $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * Purpose               :       Cleans addresses out of ./test_list and replaces
-#addr_clean.pl:##      *                                               them with "english" replacements.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * Usage                 :       ./test_list | ./addr_clean.pl
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * Copyright             :       This program is free software; you can redistribute it 
-#addr_clean.pl:##      *                                               and/or modify it under the terms of the GNU General
-#addr_clean.pl:##      *                                               Public License as published by the Free Software
-#addr_clean.pl:##      *                                               Foundation; either version 2 of the License, or (at
-#addr_clean.pl:##      *                                               your option) any later version.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      *                                               This program is distributed in the hope that it will
-#addr_clean.pl:##      *                                               be useful, but WITHOUT ANY WARRANTY; without even the
-#addr_clean.pl:##      *                                               implied warranty of MERCHANTABILITY or FITNESS FOR A
-#addr_clean.pl:##      *                                               PARTICULAR PURPOSE.     See the GNU General Public
-#addr_clean.pl:##      *                                               License for more details.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      *                                               The GNU General Public License should be included with
-#addr_clean.pl:##      *                                               this file.      If not, you can view it at
-#addr_clean.pl:##      *                                               http://www.gnu.org/copyleft/gpl.html
-#addr_clean.pl:##      *                                               or write to the Free Software Foundation, Inc., 59
-#addr_clean.pl:##      *                                               Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      **********************************************************************/
-#addr_clean.pl:
-#addr_clean.pl:use strict;
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:my $nMaxList = 0;
-#addr_clean.pl:my $nMaxNode = 0;
-#addr_clean.pl:my $nMaxRec = 0;
-#addr_clean.pl:my %aaTranslation;
-#addr_clean.pl:my $strLine;
-#addr_clean.pl:
-#addr_clean.pl:while ( $strLine = <STDIN> )
-#addr_clean.pl:{
-#addr_clean.pl:        if ( $strLine =~ m!(list.*=\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "list" . ++ $nMaxList;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(list.*=\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(node.*=\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "node" . ++ $nMaxNode;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(node.*=\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(rec.*=\s*(iter_. \.\.\. )?)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $3;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "rec" . ++ $nMaxRec;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(rec.*=\s*(iter_. \.\.\. )?)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        ## Catch the copy constuct syntax
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(list.*=>\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "list" . ++ $nMaxList;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(list.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(node.*=>\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "node" . ++ $nMaxNode;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(node.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(rec.*=>\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "rec" . ++ $nMaxRec;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(rec.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:        print( $strLine );
-#addr_clean.pl:
-#addr_clean.pl:}
-
-
-#gen_list.c:const char gen_list_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#gen_list.c: *
-#gen_list.c: * Purpose     :  To create some functions to do generic doubly linked
-#gen_list.c: *                                         list management.
-#gen_list.c: *
-#gen_list.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#gen_list.c: *                Privoxy team. http://www.privoxy.org/
-#gen_list.c: *
-#gen_list.c: *                This program is free software; you can redistribute it
-#gen_list.c: *                and/or modify it under the terms of the GNU General
-#gen_list.c: *                Public License as published by the Free Software
-#gen_list.c: *                Foundation; either version 2 of the License, or (at
-#gen_list.c: *                your option) any later version.
-#gen_list.c: *
-#gen_list.c: *                This program is distributed in the hope that it will
-#gen_list.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#gen_list.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#gen_list.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#gen_list.c: *                License for more details.
-#gen_list.c: *
-#gen_list.c: *                The GNU General Public License should be included with
-#gen_list.c: *                this file.  If not, you can view it at
-#gen_list.c: *                http://www.gnu.org/copyleft/gpl.html
-#gen_list.c: *                or write to the Free Software Foundation, Inc., 59
-#gen_list.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#gen_list.c: *
-#gen_list.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#gen_list.c: *                                         and edit IJB, correctly.
-#gen_list.c: *
-#gen_list.c: * Revisions   :
-#gen_list.c: *    $Log: contrib.sh,v $
-#gen_list.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#gen_list.c: *    name change related issues
-#gen_list.c: *
-#gen_list.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#gen_list.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#gen_list.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#gen_list.c: *    contrib directory and I cannot upload a tarball ... it gets
-#gen_list.c: *    corrupted).  This script will expand all files needed to create the
-#gen_list.c: *    linked list modules and an example program.  Please see the README.
-#gen_list.c: *    Feed back is welcomed.  Enjoy.
-#gen_list.c: *
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:\f
-#gen_list.c:
-#gen_list.c:#include <malloc.h>
-#gen_list.c:#include <stdio.h>
-#gen_list.c:#include <stdlib.h>
-#gen_list.c:#include <string.h>
-#gen_list.c:
-#gen_list.c:#include "gen_list.h"
-#gen_list.c:#include "malloc_police.h"
-#gen_list.c:
-#gen_list.c:const char gen_list_h_rcs[] = GEN_LIST_H_VERSION;
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/* This is used (for the moment) to cut out all the        */
-#gen_list.c:/* extra verbige of the malloc_police module.  After       */
-#gen_list.c:/* all, we do not want to see construct/destruct of a      */
-#gen_list.c:/* class that is supposed to be "in the background".       */
-#gen_list.c:
-#gen_list.c:/* But it could lead to broader usage.                                             */
-#gen_list.c:
-#gen_list.c:int list_is_quiet = 0;
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:#define CALL_VT_REC_COPY_CONSTRUCT(rec)    (((rec_copy_construct)(rec)->vtable[ VT_REC_COPY_CONSTRUCT ])( rec ))
-#gen_list.c:#define CALL_VT_REC_DESTRUCT(rec)                  (((rec_destruct)(rec)->vtable[ VT_REC_DESTRUCT ])( rec ))
-#gen_list.c:#define CALL_VT_REC_STREAM(rec)                            (((rec_stream)(rec)->vtable[ VT_REC_STREAM ])( rec ))
-#gen_list.c:#define CALL_VT_REC_EQUAL(rec,eq_rec)              (((rec_equal)((rec)->vtable[ VT_REC_EQUAL ]))( rec, eq_rec ))
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Called from a derived list record class ONLY.
-#gen_list.c: *                                         This function "construct" a classs: malloc_ed,
-#gen_list.c: *                                         vtable, isa, and sizeof_rec "attributes".
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.  If NULL, malloc is called.
-#gen_list.c: *                         2       :       isa (prounced "is a") ... type of the record.
-#gen_list.c: *                         3       :       Memory image size of this record.
-#gen_list.c: *                  ...    :       The "virtuals" for this record.  NOTE: this list
-#gen_list.c: *                                         may increase if more "virtuals" are added.
-#gen_list.c: *
-#gen_list.c: * Returns     :  A pointer to the record (either the orig record
-#gen_list.c: *                                         or the malloc_ed copy.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_rec_construct( enum GEN_LIST_ISA isa, int sizeof_rec, const t_vtable _vtable )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_rec *this_rec = (struct gen_list_rec *)MALLOC( sizeof_rec );
-#gen_list.c:   this_rec->vtable                = _vtable;
-#gen_list.c:   this_rec->isa                   = isa;
-#gen_list.c:   this_rec->sizeof_rec    = sizeof_rec;
-#gen_list.c:
-#gen_list.c:   return( this_rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_copy_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Makes a copy of the current existing record.  All
-#gen_list.c: *                                         inherited properties (isa, vtable, malloc_ed, ...)
-#gen_list.c: *                                         are kept in tact after the copy.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  Existing record.
-#gen_list.c: *                         2       :  New record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The newly constructed copy record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_rec_copy_construct( const struct gen_list_rec *this_rec )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_rec *copy_rec = (struct gen_list_rec *)MALLOC( this_rec->sizeof_rec );
-#gen_list.c:   copy_rec->vtable                = this_rec->vtable;
-#gen_list.c:   copy_rec->isa                   = this_rec->isa;
-#gen_list.c:   copy_rec->sizeof_rec    = this_rec->sizeof_rec;
-#gen_list.c:
-#gen_list.c:   return( copy_rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_destruct
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the record.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_rec_destruct( struct gen_list_rec *this_rec )
-#gen_list.c:{
-#gen_list.c:   FREE( this_rec );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_stream
-#gen_list.c: *
-#gen_list.c: * Description :  Displays all attributes on the STDOUT stream.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_rec *gen_list_rec_stream( const struct gen_list_rec *this_rec )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\t\tstream rec isa = %s\n", isa_ra[ this_rec->isa ] ) );
-#gen_list.c:   return( this_rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_equal
-#gen_list.c: *
-#gen_list.c: * Description :  Compares two records to see if they are equal.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  A record.
-#gen_list.c: *          2  :  Another record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:int gen_list_rec_equal( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_rec && NULL == eq_rec )
-#gen_list.c:   {
-#gen_list.c:           return( 1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( NULL == this_rec && NULL != eq_rec )  ||
-#gen_list.c:                   ( NULL != this_rec && NULL == eq_rec ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( this_rec->isa != eq_rec->isa ) ||
-#gen_list.c:                   ( this_rec->sizeof_rec != eq_rec->sizeof_rec ) )
-#gen_list.c:   {
-#gen_list.c:           LIST_SHOW( printf( "INFORMATION: sorry, but comparing different rec types is unsupported at this time.\n" ) );
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( 1 );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*\f*********************************************************************/
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:struct gen_list_node
-#gen_list.c:{
-#gen_list.c:   /* private: */
-#gen_list.c:   struct gen_list_node    *next;
-#gen_list.c:   struct gen_list_node    *prev;
-#gen_list.c:
-#gen_list.c:   struct gen_list_rec     *rec;
-#gen_list.c:};
-#gen_list.c:/* public: */
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_construct( struct gen_list_rec *_rec );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_copy_construct( const struct gen_list_node *this_node );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_destruct( struct gen_list_node *this_node );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_remove( struct gen_list_node *this_node );
-#gen_list.c:
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_set_next( struct gen_list_node *this_node, struct gen_list_node *_next );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_set_prev( struct gen_list_node *this_node, struct gen_list_node *_prev );
-#gen_list.c:
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_get_next( const struct gen_list_node *this_node );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_get_prev( const struct gen_list_node *this_node );
-#gen_list.c:
-#gen_list.c:extern const struct gen_list_rec   *       gen_list_node_stream( const struct gen_list_node *this_node );
-#gen_list.c:extern int                                                                 gen_list_node_equal( const struct gen_list_node *this_node, const struct gen_list_node *eq_node );
-#gen_list.c:
-#gen_list.c:/* struct/class COMPLETE */
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Constructs a generic list node and sets its record.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.  If NULL, malloc is called.
-#gen_list.c: *          2  :  The nodes record contents.
-#gen_list.c: *
-#gen_list.c: * Returns     :  A pointer to the node (either the orig node
-#gen_list.c: *                                         or the malloc_ed copy.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_construct( struct gen_list_rec *_rec )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *this_node = (struct gen_list_node *)MALLOC( sizeof( struct gen_list_node ) );
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tconstruct new node\t\t= %p
-#gen_list.c:\tconstruct new node->rec\t= %p\n\n", (const void *)this_node, (const void *)_rec ) );
-#gen_list.c:
-#gen_list.c:   this_node->rec          = _rec;
-#gen_list.c:   this_node->next = NULL;
-#gen_list.c:   this_node->prev = NULL;
-#gen_list.c:
-#gen_list.c:   return( this_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_copy_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Makes a copy of the current node.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  Existing node.
-#gen_list.c: *                         2       :  New node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The newly constructed copy node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_copy_construct( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *copy_node = (struct gen_list_node *)MALLOC( sizeof( struct gen_list_node ) );
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\tcopy construct new node = %p => %p\n\n", (const void *)this_node, (const void *)copy_node ) );
-#gen_list.c:
-#gen_list.c:   copy_node->rec          = CALL_VT_REC_COPY_CONSTRUCT( this_node->rec );
-#gen_list.c:   copy_node->next = NULL;
-#gen_list.c:   copy_node->prev = NULL;
-#gen_list.c:
-#gen_list.c:   return( copy_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_destruct
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the node.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_destruct( struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tdestruct this_node\t\t\t= %p
-#gen_list.c:\tdestruct this_node->rec\t\t= %p
-#gen_list.c:\tdestruct this_node->next\t= %p
-#gen_list.c:\tdestruct this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
-#gen_list.c:
-#gen_list.c:   if ( NULL != this_node->rec )
-#gen_list.c:   {
-#gen_list.c:           CALL_VT_REC_DESTRUCT( this_node->rec );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   FREE( this_node );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_remove
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the node.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_remove( struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tremove this_node\t\t\t= %p
-#gen_list.c:\tremove this_node->rec\t= %p
-#gen_list.c:\tremove this_node->next\t= %p
-#gen_list.c:\tremove this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
-#gen_list.c:
-#gen_list.c:   FREE( this_node );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_set_next
-#gen_list.c: *
-#gen_list.c: * Description :  Sets the next node in the list series.  Used mainly
-#gen_list.c: *                                         when constructing and adding/removing nodes.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *          2  :  The next node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_set_next( struct gen_list_node *this_node, struct gen_list_node *_next )
-#gen_list.c:{
-#gen_list.c:   this_node->next = _next;
-#gen_list.c:   return( this_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_set_prev
-#gen_list.c: *
-#gen_list.c: * Description :  Sets the previous node in the list series.  Used mainly
-#gen_list.c: *                                         when constructing and adding/removing nodes.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *          2  :  The previous node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_set_prev( struct gen_list_node *this_node, struct gen_list_node *_prev )
-#gen_list.c:{
-#gen_list.c:   this_node->prev = _prev;
-#gen_list.c:   return( this_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_get_next
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the next node in the list series.  Used mainly
-#gen_list.c: *                                         for traversing a list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The next node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_get_next( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   return( this_node->next );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_get_prev
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the previous node in the list series.  Used mainly
-#gen_list.c: *                                         for traversing a list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The previous node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_get_prev( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   return( this_node->prev );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_stream
-#gen_list.c: *
-#gen_list.c: * Description :  Displays all attributes on the STDOUT stream,
-#gen_list.c: *                                         including the contents of the nodes record.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The result of streaming the nodes record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_rec *gen_list_node_stream( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tstream this_node\t\t\t= %p
-#gen_list.c:\tstream this_node->rec\t= %p
-#gen_list.c:\tstream this_node->next\t= %p
-#gen_list.c:\tstream this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
-#gen_list.c:
-#gen_list.c:   return( CALL_VT_REC_STREAM( this_node->rec ) );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_equal
-#gen_list.c: *
-#gen_list.c: * Description :  Compares two nodes (and their records) to see if they are equal.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  A node.
-#gen_list.c: *          2  :  Another node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:int gen_list_node_equal( const struct gen_list_node *this_node, const struct gen_list_node *eq_node )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_node && NULL == eq_node )
-#gen_list.c:   {
-#gen_list.c:           return( 1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( NULL == this_node && NULL != eq_node ) ||
-#gen_list.c:                   ( NULL != this_node && NULL == eq_node ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( gen_list_rec_equal( this_node->rec, eq_node->rec ) );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*\f*********************************************************************/
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/* private: */
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_insert_node
-#gen_list.c: *
-#gen_list.c: * Description :  Inserts a node (not a record!) into a list.  This
-#gen_list.c: *                                         is (currently) only used in copy construction.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  A new node to insert into the list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_node *gen_list_insert_node( struct gen_list *this_list, struct gen_list_node *node )
-#gen_list.c:{
-#gen_list.c:   gen_list_node_set_next( node, NULL );
-#gen_list.c:
-#gen_list.c:   if ( NULL == this_list->first )
-#gen_list.c:   {
-#gen_list.c:           this_list->first = node;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if ( NULL == this_list->last )
-#gen_list.c:   {
-#gen_list.c:           this_list->last = node;
-#gen_list.c:   }
-#gen_list.c:   else
-#gen_list.c:   {
-#gen_list.c:           gen_list_node_set_next( this_list->last, node );
-#gen_list.c:           gen_list_node_set_prev( node, this_list->last );
-#gen_list.c:           this_list->last = node;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   this_list->last = node;
-#gen_list.c:
-#gen_list.c:   return( node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Constructs a generic list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :   None
-#gen_list.c: *
-#gen_list.c: * Returns     :  A pointer to the list (either the orig list
-#gen_list.c: *                                         or the malloc_ed copy.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_construct()
-#gen_list.c:{
-#gen_list.c:   struct gen_list *this_list = (struct gen_list *)MALLOC( sizeof( struct gen_list ) );
-#gen_list.c:   LIST_SHOW( printf( "construct new list = %p\n\n", (const void *)this_list ) );
-#gen_list.c:
-#gen_list.c:   this_list->first        = NULL;
-#gen_list.c:   this_list->last = NULL;
-#gen_list.c:
-#gen_list.c:   return( this_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_copy_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Makes a copy of the current list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  Existing list.
-#gen_list.c: *                         2       :  New list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The newly constructed copy list.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_copy_construct( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:   struct gen_list *copy_list = (struct gen_list *)MALLOC( sizeof( struct gen_list ) );
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "copy construct new list = %p => %p\n\n", (const void *)this_list, (const void *)copy_list ) );
-#gen_list.c:
-#gen_list.c:   copy_list->first        = NULL;
-#gen_list.c:   copy_list->last = NULL;
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node *copy_node = gen_list_node_copy_construct( curr );
-#gen_list.c:           gen_list_insert_node( copy_list, copy_node );
-#gen_list.c:           curr = gen_list_node_get_next( curr );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( copy_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_destruct
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the list.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_destruct( struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:destruct this_list\t\t\t= %p
-#gen_list.c:destruct this_list->first\t= %p
-#gen_list.c:destruct this_list->last\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node *next = gen_list_node_get_next( curr );
-#gen_list.c:           gen_list_node_destruct( curr );
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   FREE( this_list );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_remove_all
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the list.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_remove_all( struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:remove_all this_list\t\t\t\t= %p
-#gen_list.c:remove_all this_list->first\t= %p
-#gen_list.c:remove_all this_list->last\t\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node *next = gen_list_node_get_next( curr );
-#gen_list.c:           gen_list_node_remove( curr );
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   this_list->first = this_list->last = NULL;
-#gen_list.c:   return( this_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_remove
-#gen_list.c: *
-#gen_list.c: * Description :  A record from the list and return it if found.  This
-#gen_list.c: *                                         will allow a futher call to rec_destruct.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The record to be removed.
-#gen_list.c: *
-#gen_list.c: * Returns     :  rec if found and removed, NULL otherwise.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_remove( struct gen_list *this_list, struct gen_list_rec *rec )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node    *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:remove this_list\t\t\t= %p
-#gen_list.c:remove this_list->first\t= %p
-#gen_list.c:remove this_list->last\t= %p
-#gen_list.c:remove rec\t\t\t\t\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last, rec ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           /* Grab these values before the are destroyed. */
-#gen_list.c:           struct gen_list_node    *prev = gen_list_node_get_prev( curr );
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:
-#gen_list.c:           /* Access to rec, next, prev of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           if ( curr->rec == rec )
-#gen_list.c:           {
-#gen_list.c:                   /* Destruct the node, but not the record. */
-#gen_list.c:                   gen_list_node_remove( curr );
-#gen_list.c:
-#gen_list.c:                   if ( NULL == prev )
-#gen_list.c:                   {
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           /* This is the first node in the list.                          */
-#gen_list.c:                           /*      Picture:                                                                                                */
-#gen_list.c:                           /* [first] ---------------------> [next]                        */
-#gen_list.c:                           /* [NULL] <---------------------- [next->prev]  */
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           this_list->first = next;
-#gen_list.c:
-#gen_list.c:                           if ( NULL == next )
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since next is NULL, then this is an empty list. */
-#gen_list.c:                                   this_list->last = NULL;
-#gen_list.c:                           }
-#gen_list.c:                           else
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since next is not NULL, then there is another node to make first. */
-#gen_list.c:                                   gen_list_node_set_prev( next, NULL );
-#gen_list.c:                           }
-#gen_list.c:                   }
-#gen_list.c:                   else if ( NULL == next )
-#gen_list.c:                   {
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           /* This is the last node in the list.                           */
-#gen_list.c:                           /*      Picture:                                                                                                */
-#gen_list.c:                           /* [last] ----------------------> [prev]                        */
-#gen_list.c:                           /* [prev->next] ----------------> [NULL]                        */
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           this_list->last = prev;
-#gen_list.c:
-#gen_list.c:                           if ( NULL == prev )
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since prev is NULL, then this is an empty list. */
-#gen_list.c:                                   this_list->first = NULL;
-#gen_list.c:                           }
-#gen_list.c:                           else
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since prev is NULL, then there is another node to make last. */
-#gen_list.c:                                   gen_list_node_set_next( prev, NULL );
-#gen_list.c:                           }
-#gen_list.c:                   }
-#gen_list.c:                   else
-#gen_list.c:                   {
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           /* This is a middle node in the list.                           */
-#gen_list.c:                           /*      Picture:                                                                                                */
-#gen_list.c:                           /* [prev->next] ----------------> [next]                        */
-#gen_list.c:                           /*                                      [removing middle]                                               */
-#gen_list.c:                           /* [prev] <---------------------- [next->prev]  */
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           gen_list_node_set_next( prev, next );
-#gen_list.c:                           gen_list_node_set_prev( next, prev );
-#gen_list.c:                   }
-#gen_list.c:
-#gen_list.c:                   return( rec );
-#gen_list.c:           }
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_get_first
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the first record in the list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The first node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_get_first( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_list->first )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:   return( this_list->first->rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_get_last
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the last record in the list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The last node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_get_last( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_list->last )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:   return( this_list->last->rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_insert
-#gen_list.c: *
-#gen_list.c: * Description :  Inserts a record into the list.  This is the
-#gen_list.c: *                                         primary API interface for inserting a record.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  A new record to insert into the list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_node *gen_list_insert( struct gen_list *this_list, struct gen_list_rec *_rec )
-#gen_list.c:{
-#gen_list.c:   return( gen_list_insert_node( this_list, gen_list_node_construct( _rec ) ) );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_stream
-#gen_list.c: *
-#gen_list.c: * Description :  Displays all attributes on the STDOUT stream,
-#gen_list.c: *                                         including the contents of the nodes.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The list.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list *gen_list_stream( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   const struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:stream this_list\t\t\t= %p
-#gen_list.c:stream this_list->first\t= %p
-#gen_list.c:stream this_list->last\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:           gen_list_node_stream( curr );
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( this_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_equal
-#gen_list.c: *
-#gen_list.c: * Description :  Compares two lists (and their nodes) to see if they are equal.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  A list.
-#gen_list.c: *          2  :  Another list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:int gen_list_equal( const struct gen_list *this_list, const struct gen_list *eq_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *c1 = this_list->first;
-#gen_list.c:   struct gen_list_node *c2 = eq_list->first;
-#gen_list.c:   int eq = 1;
-#gen_list.c:
-#gen_list.c:   if ( ( NULL == c1 && NULL != c2 ) || ( NULL != c1 && NULL == c2 ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   while ( ( eq ) && ( NULL != c1 ) && ( NULL != c2 ) )
-#gen_list.c:   {
-#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           eq = CALL_VT_REC_EQUAL( c1->rec, c2->rec );
-#gen_list.c:           if ( NULL != c1 )
-#gen_list.c:           {
-#gen_list.c:                   c1 = gen_list_node_get_next( c1 );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           if ( NULL != c2 )
-#gen_list.c:           {
-#gen_list.c:                   c2 = gen_list_node_get_next( c2 );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if ( NULL == c1 && NULL == c2 )
-#gen_list.c:   {
-#gen_list.c:           return( 1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( eq );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_find
-#gen_list.c: *
-#gen_list.c: * Description :  Find a record that matches the one passed to this
-#gen_list.c: *                                         function.
-#gen_list.c: *                                         NOTE: this function receives a RECORD and not a NODE.
-#gen_list.c: *                                         Some implementation issues might be easier addressed
-#gen_list.c: *                                         if a node was passed ... but for the time being, I
-#gen_list.c: *                                         would like to keep the use/programmer isolated from
-#gen_list.c: *                                         the node structure/class.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The record to find.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL => none found, anything else is a pointer to the record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_find( const struct gen_list *this_list, struct gen_list_rec *rec )
-#gen_list.c:{
-#gen_list.c:   const struct gen_list_node *curr = this_list->first;
-#gen_list.c:   int eq = 0;
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr && NULL == rec )
-#gen_list.c:   {
-#gen_list.c:           return( (struct gen_list_rec *)1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( NULL == curr && NULL != rec ) ||
-#gen_list.c:                   ( NULL != curr && NULL == rec ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:   if ( curr->rec->isa != rec->isa )
-#gen_list.c:   {
-#gen_list.c:           LIST_SHOW( printf( "INFORMATION: sorry, but comparing different list types is unsupported at this time.\n" ) );
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:   while ( ( !eq ) && ( NULL != curr ) )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:
-#gen_list.c:           eq = CALL_VT_REC_EQUAL( curr->rec, rec );
-#gen_list.c:
-#gen_list.c:           if ( eq )
-#gen_list.c:           {
-#gen_list.c:                   return( curr->rec );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           curr = next;
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_iterate
-#gen_list.c: *
-#gen_list.c: * Description :  Pass over the list, calling "iter" for every record.
-#gen_list.c: *                                         If the "iter" function returns a non-NULL value,
-#gen_list.c: *                                         return it and stop iterating.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The iterator function.
-#gen_list.c: *
-#gen_list.c: * Returns     :  Whatever the iterator does, or NULL if the entire
-#gen_list.c: *                                         list was processed.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_iterate( struct gen_list *this_list, rec_iterate iter )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:           struct gen_list_rec *r = iter( curr->rec );
-#gen_list.c:
-#gen_list.c:           if ( NULL != r )
-#gen_list.c:           {
-#gen_list.c:                   return( r );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           curr = next;
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_iterate
-#gen_list.c: *
-#gen_list.c: * Description :  Pass over the list (in reverse order), calling "iter"
-#gen_list.c: *                                         for every record.  If the "iter" function returns
-#gen_list.c: *                                         a non-NULL value, return it and stop iterating.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The iterator function.
-#gen_list.c: *
-#gen_list.c: * Returns     :  Whatever the iterator does, or NULL if the entire
-#gen_list.c: *                                         list was processed.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_iterate_reverse( struct gen_list *this_list, rec_iterate iter )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->last;
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           struct gen_list_node    *prev = gen_list_node_get_prev( curr );
-#gen_list.c:           struct gen_list_rec *r = iter( curr->rec );
-#gen_list.c:
-#gen_list.c:           if ( NULL != r )
-#gen_list.c:           {
-#gen_list.c:                   return( r );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           curr = prev;
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-
-
-#gen_list.h:#ifndef GEN_LIST_H_INCLUDED
-#gen_list.h:#define GEN_LIST_H_INCLUDED
-#gen_list.h:#define GEN_LIST_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#gen_list.h:/*********************************************************************
-#gen_list.h: *
-#gen_list.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#gen_list.h: *
-#gen_list.h: * Purpose     :  To create some functions to do generic doubly linked
-#gen_list.h: *                                         list management.
-#gen_list.h: *
-#gen_list.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#gen_list.h: *                Privoxy team. http://www.privoxy.org/
-#gen_list.h: *
-#gen_list.h: *                This program is free software; you can redistribute it
-#gen_list.h: *                and/or modify it under the terms of the GNU General
-#gen_list.h: *                Public License as published by the Free Software
-#gen_list.h: *                Foundation; either version 2 of the License, or (at
-#gen_list.h: *                your option) any later version.
-#gen_list.h: *
-#gen_list.h: *                This program is distributed in the hope that it will
-#gen_list.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#gen_list.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#gen_list.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#gen_list.h: *                License for more details.
-#gen_list.h: *
-#gen_list.h: *                The GNU General Public License should be included with
-#gen_list.h: *                this file.  If not, you can view it at
-#gen_list.h: *                http://www.gnu.org/copyleft/gpl.html
-#gen_list.h: *                or write to the Free Software Foundation, Inc., 59
-#gen_list.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#gen_list.h: *
-#gen_list.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#gen_list.h: *                                         and edit IJB, correctly.
-#gen_list.h: *
-#gen_list.h: * Revisions   :
-#gen_list.h: *    $Log: contrib.sh,v $
-#gen_list.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#gen_list.h: *    name change related issues
-#gen_list.h: *
-#gen_list.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#gen_list.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#gen_list.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#gen_list.h: *    contrib directory and I cannot upload a tarball ... it gets
-#gen_list.h: *    corrupted).  This script will expand all files needed to create the
-#gen_list.h: *    linked list modules and an example program.  Please see the README.
-#gen_list.h: *    Feed back is welcomed.  Enjoy.
-#gen_list.h: *
-#gen_list.h: *
-#gen_list.h: *********************************************************************/
-#gen_list.h:\f
-#gen_list.h:
-#gen_list.h:#ifdef __cplusplus
-#gen_list.h:extern "C" {
-#gen_list.h:#endif
-#gen_list.h:
-#gen_list.h:#include "isa.h"
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:extern int list_is_quiet;
-#gen_list.h:
-#gen_list.h:#define LIST_SHOW(stmt)  if ( ! list_is_quiet ) { stmt; }
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:struct gen_list_rec;
-#gen_list.h:typedef struct gen_list_rec *                      (*rec_copy_construct)( struct gen_list_rec *copy_rec );
-#gen_list.h:typedef struct gen_list_rec *                      (*rec_destruct)( struct gen_list_rec *this_rec );
-#gen_list.h:typedef const struct gen_list_rec *        (*rec_stream)( const struct gen_list_rec *this_rec );
-#gen_list.h:typedef int                                                                        (*rec_equal)( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec );
-#gen_list.h:typedef struct gen_list_rec *                      (*rec_iterate)( struct gen_list_rec *this_rec );
-#gen_list.h:
-#gen_list.h:typedef void * (*rec_method)( void *this_rec, ... );
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:enum VT_ENTRIES
-#gen_list.h:{
-#gen_list.h:   VT_REC_COPY_CONSTRUCT,
-#gen_list.h:   VT_REC_DESTRUCT,
-#gen_list.h:   VT_REC_STREAM,
-#gen_list.h:   VT_REC_EQUAL,
-#gen_list.h:   VT_REC_MAX
-#gen_list.h:};
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:typedef const rec_method *t_vtable;
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:struct gen_list_rec
-#gen_list.h:{
-#gen_list.h:   /* private: */
-#gen_list.h:   t_vtable vtable;
-#gen_list.h:   enum GEN_LIST_ISA isa;
-#gen_list.h:   int sizeof_rec;
-#gen_list.h:   /* contents HERE */
-#gen_list.h:};
-#gen_list.h:/* public: */
-#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_construct( enum GEN_LIST_ISA isa, int sizeof_rec, const t_vtable _vtable );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_copy_construct( const struct gen_list_rec *this_rec );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_destruct( struct gen_list_rec *this_rec );
-#gen_list.h:extern const struct gen_list_rec * gen_list_rec_stream( const struct gen_list_rec *this_rec );
-#gen_list.h:extern int                                                                 gen_list_rec_equal( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec );
-#gen_list.h:
-#gen_list.h:/* struct/class COMPLETE */
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:/*\f*********************************************************************/
-#gen_list.h:
-#gen_list.h:/* private: to gen_list */
-#gen_list.h:struct gen_list_node;
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:struct gen_list
-#gen_list.h:{
-#gen_list.h:   /* private: */
-#gen_list.h:   struct gen_list_node *first;
-#gen_list.h:   struct gen_list_node *last;
-#gen_list.h:};
-#gen_list.h:/* gen_list_insert_node */
-#gen_list.h:
-#gen_list.h:/* public: */
-#gen_list.h:extern struct gen_list *                           gen_list_construct();
-#gen_list.h:extern struct gen_list *                           gen_list_copy_construct( const struct gen_list *this_list );
-#gen_list.h:extern struct gen_list *                           gen_list_destruct( struct gen_list *this_list );
-#gen_list.h:extern struct gen_list *                           gen_list_remove_all( struct gen_list *this_list );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_remove( struct gen_list *this_list, struct gen_list_rec *_rec );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_get_first( const struct gen_list *this_list );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_get_last( const struct gen_list *this_list );
-#gen_list.h:extern const struct gen_list_node *        gen_list_insert( struct gen_list *this_list, struct gen_list_rec *_rec );
-#gen_list.h:extern const struct gen_list *             gen_list_stream( const struct gen_list *this_list );
-#gen_list.h:extern int                                                                 gen_list_equal( const struct gen_list *this_list, const struct gen_list *eq_list );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_find( const struct gen_list *this_list, struct gen_list_rec *rec );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_iterate( struct gen_list *this_list, rec_iterate iter );
-#gen_list.h:/* struct/class COMPLETE */
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:#ifdef __cplusplus
-#gen_list.h:} /* extern "C" */
-#gen_list.h:#endif
-#gen_list.h:
-#gen_list.h:#endif /* ndef GEN_LIST_H_INCLUDED */
-#gen_list.h:
-#gen_list.h:/*
-#gen_list.h:  Local Variables:
-#gen_list.h:  tab-width: 3
-#gen_list.h:  end:
-#gen_list.h:*/
-
-
-#isa.c:const char isa_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#isa.c:/*********************************************************************
-#isa.c: *
-#isa.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#isa.c: *
-#isa.c: * Purpose     :  Pronounced "is a".  To create "english" translations
-#isa.c: *                                              for all linked "classes".
-#isa.c: *
-#isa.c: *                                              NOTE:   this header file must appear once and only once
-#isa.c: *                                                              per project.
-#isa.c: *
-#isa.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#isa.c: *                Privoxy team. http://www.privoxy.org/
-#isa.c: *
-#isa.c: *                This program is free software; you can redistribute it
-#isa.c: *                and/or modify it under the terms of the GNU General
-#isa.c: *                Public License as published by the Free Software
-#isa.c: *                Foundation; either version 2 of the License, or (at
-#isa.c: *                your option) any later version.
-#isa.c: *
-#isa.c: *                This program is distributed in the hope that it will
-#isa.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#isa.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#isa.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#isa.c: *                License for more details.
-#isa.c: *
-#isa.c: *                The GNU General Public License should be included with
-#isa.c: *                this file.  If not, you can view it at
-#isa.c: *                http://www.gnu.org/copyleft/gpl.html
-#isa.c: *                or write to the Free Software Foundation, Inc., 59
-#isa.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#isa.c: *
-#isa.c: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#isa.c: *                                              and edit IJB, correctly.
-#isa.c: *
-#isa.c: * Revisions   :
-#isa.c: *    $Log: contrib.sh,v $
-#isa.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#isa.c: *    name change related issues
-#isa.c: *
-#isa.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#isa.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#isa.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#isa.c: *    contrib directory and I cannot upload a tarball ... it gets
-#isa.c: *    corrupted).  This script will expand all files needed to create the
-#isa.c: *    linked list modules and an example program.  Please see the README.
-#isa.c: *    Feed back is welcomed.  Enjoy.
-#isa.c: *
-#isa.c: *    Revision 1.1  2001/11/30 21:55:51  rodney
-#isa.c: *    Initial revision
-#isa.c: *
-#isa.c: *
-#isa.c: *********************************************************************/
-#isa.c:\f
-#isa.c:
-#isa.c:#include <malloc.h>
-#isa.c:#include <stdio.h>
-#isa.c:#include <stdlib.h>
-#isa.c:#include <string.h>
-#isa.c:
-#isa.c:#include "gen_list.h"
-#isa.c:#include "isa.h"
-#isa.c:
-#isa.c:const char isa_h_rcs[] = ISA_H_VERSION;
-#isa.c:
-#isa.c:
-#isa.c:/* Pronounce "ra" phonectically and you get "array", which this variable is. */
-#isa.c:char *isa_ra[] =
-#isa.c:{
-#isa.c:        "GEN_LIST_REC",
-#isa.c:        "REC_MALLOC_POLICE",
-#isa.c:        "REC_CHAR",
-#isa.c:        "REC_CHARPTR",
-#isa.c:        "REC_DOUBLE",
-#isa.c:        "REC_LONG",
-#isa.c:        NULL
-#isa.c:};
-
-
-#isa.h:#ifndef ISA_H_INCLUDED
-#isa.h:#define ISA_H_INCLUDED
-#isa.h:#define ISA_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#isa.h:/*********************************************************************
-#isa.h: *
-#isa.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#isa.h: *
-#isa.h: * Purpose     :  Pronounced "is a".  To create "english" translations
-#isa.h: *                                              for all linked "classes".
-#isa.h: *
-#isa.h: *                                              NOTE:   this header file must appear once and only once
-#isa.h: *                                                              per project.
-#isa.h: *
-#isa.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#isa.h: *                Privoxy team. http://www.privoxy.org/
-#isa.h: *
-#isa.h: *                This program is free software; you can redistribute it
-#isa.h: *                and/or modify it under the terms of the GNU General
-#isa.h: *                Public License as published by the Free Software
-#isa.h: *                Foundation; either version 2 of the License, or (at
-#isa.h: *                your option) any later version.
-#isa.h: *
-#isa.h: *                This program is distributed in the hope that it will
-#isa.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#isa.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#isa.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#isa.h: *                License for more details.
-#isa.h: *
-#isa.h: *                The GNU General Public License should be included with
-#isa.h: *                this file.  If not, you can view it at
-#isa.h: *                http://www.gnu.org/copyleft/gpl.html
-#isa.h: *                or write to the Free Software Foundation, Inc., 59
-#isa.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#isa.h: *
-#isa.h: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#isa.h: *                                              and edit IJB, correctly.
-#isa.h: *
-#isa.h: * Revisions   :
-#isa.h: *    $Log: contrib.sh,v $
-#isa.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#isa.h: *    name change related issues
-#isa.h: *
-#isa.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#isa.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#isa.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#isa.h: *    contrib directory and I cannot upload a tarball ... it gets
-#isa.h: *    corrupted).  This script will expand all files needed to create the
-#isa.h: *    linked list modules and an example program.  Please see the README.
-#isa.h: *    Feed back is welcomed.  Enjoy.
-#isa.h: *
-#isa.h: *
-#isa.h: *********************************************************************/
-#isa.h:\f
-#isa.h:
-#isa.h:#ifdef __cplusplus
-#isa.h:extern "C" {
-#isa.h:#endif
-#isa.h:
-#isa.h:
-#isa.h:enum GEN_LIST_ISA
-#isa.h:{
-#isa.h:        ISA_GEN_LIST_REC,
-#isa.h:        ISA_MALLOC_POLICE,
-#isa.h:        ISA_CHAR,
-#isa.h:        ISA_CHARPTR,
-#isa.h:        ISA_DOUBLE,
-#isa.h:        ISA_LONG,
-#isa.h:        ISA_MAX
-#isa.h:};
-#isa.h:
-#isa.h:
-#isa.h:/* Pronounce "ra" phonectically and you get "array", which this variable is. */
-#isa.h:extern char *isa_ra[];
-#isa.h:
-#isa.h:
-#isa.h:#ifdef __cplusplus
-#isa.h:} /* extern "C" */
-#isa.h:#endif
-#isa.h:
-#isa.h:#endif /* ndef ISA_H_INCLUDED */
-#isa.h:
-#isa.h:/*
-#isa.h:  Local Variables:
-#isa.h:  tab-width: 3
-#isa.h:  end:
-#isa.h:*/
-
-
-#main.c:const char main_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#main.c: *
-#main.c: * Purpose     :  To test "generic list" creation and manipulation.
-#main.c: *
-#main.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#main.c: *                Privoxy team. http://www.privoxy.org/
-#main.c: *
-#main.c: *                This program is free software; you can redistribute it
-#main.c: *                and/or modify it under the terms of the GNU General
-#main.c: *                Public License as published by the Free Software
-#main.c: *                Foundation; either version 2 of the License, or (at
-#main.c: *                your option) any later version.
-#main.c: *
-#main.c: *                This program is distributed in the hope that it will
-#main.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#main.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#main.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#main.c: *                License for more details.
-#main.c: *
-#main.c: *                The GNU General Public License should be included with
-#main.c: *                this file.  If not, you can view it at
-#main.c: *                http://www.gnu.org/copyleft/gpl.html
-#main.c: *                or write to the Free Software Foundation, Inc., 59
-#main.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#main.c: *
-#main.c: * VI users            :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#main.c: *                                             and edit IJB, correctly.
-#main.c: *
-#main.c: * Note                        :       This output assumes (per IJB standards) that tabs are
-#main.c: *                                             set to 3 characters.  If you run this in a terminal,
-#main.c: *                                             you may want to run this as so:
-#main.c: *                                                     >./test_list 2>&1 | expand -t3 | ./addr_clean.pl
-#main.c: *                                             This will expand the tab to 3 columns and then replace
-#main.c: *                                             "0x" style addresses with more human readable ones.
-#main.c: *
-#main.c: * Revisions   :
-#main.c: *    $Log: contrib.sh,v $
-#main.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#main.c: *    name change related issues
-#main.c: *
-#main.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#main.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#main.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#main.c: *    contrib directory and I cannot upload a tarball ... it gets
-#main.c: *    corrupted).  This script will expand all files needed to create the
-#main.c: *    linked list modules and an example program.  Please see the README.
-#main.c: *    Feed back is welcomed.  Enjoy.
-#main.c: *
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:\f
-#main.c:
-#main.c:#include <malloc.h>
-#main.c:#include <stdio.h>
-#main.c:#include <stdlib.h>
-#main.c:#include <string.h>
-#main.c:
-#main.c:#include "gen_list.h"
-#main.c:#include "rec_char.h"
-#main.c:#include "rec_charptr.h"
-#main.c:#include "rec_double.h"
-#main.c:#include "rec_long.h"
-#main.c:#include "malloc_police.h"
-#main.c:
-#main.c:
-#main.c:extern const char isa_rcs[];
-#main.c:extern const char isa_h_rcs[];
-#main.c:extern const char gen_list_rcs[];
-#main.c:extern const char gen_list_h_rcs[];
-#main.c:extern const char malloc_police_rcs[];
-#main.c:extern const char malloc_police_h_rcs[];
-#main.c:extern const char rec_charptr_rcs[];
-#main.c:extern const char rec_charptr_h_rcs[];
-#main.c:extern const char rec_long_rcs[];
-#main.c:extern const char rec_long_h_rcs[];
-#main.c:extern const char rec_double_rcs[];
-#main.c:extern const char rec_double_h_rcs[];
-#main.c:extern const char rec_char_rcs[];
-#main.c:extern const char rec_char_h_rcs[];
-#main.c:extern const char rec_malloc_police_rcs[];
-#main.c:extern const char rec_malloc_police_h_rcs[];
-#main.c:extern const char main_rcs[];
-#main.c:
-#main.c:
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * Function    :  my_custom_charptr_iterator_1
-#main.c: *
-#main.c: * Description :  This funtion is called once for every record in a
-#main.c: *                                             list.  Or at least until we return non-NULL.  BTW,
-#main.c: *                                             this function always returns NULL, thus it will
-#main.c: *                                             iterate over the entire list.
-#main.c: *
-#main.c: * Parameters  :
-#main.c: *          1  :  The record.
-#main.c: *
-#main.c: * Returns     :  NULL
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:struct derived_rec_charptr *my_custom_charptr_iterator_1( struct derived_rec_charptr *this_rec )
-#main.c:{
-#main.c:       printf( "\
-#main.c:\t\tcharptr iterator_1 this_rec\t\t\t\t= iter_1 ... %p
-#main.c:\t\tcharptr iterator_1 this_rec->contents\t= iter_1 ... %s\n\n", (const void *)this_rec, this_rec->contents );
-#main.c:       return( NULL );
-#main.c:
-#main.c:}
-#main.c:
-#main.c:
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * Function    :  my_custom_charptr_iterator_2
-#main.c: *
-#main.c: * Description :  This funtion is called once for every record in a
-#main.c: *                                             list.  Or at least until we return non-NULL.  BTW,
-#main.c: *                                             this function always returns non-NULL, thus it will
-#main.c: *                                             iterate over only 1 record.
-#main.c: *
-#main.c: * Parameters  :
-#main.c: *          1  :  The record.
-#main.c: *
-#main.c: * Returns     :  The record.
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:struct derived_rec_charptr *my_custom_charptr_iterator_2( struct derived_rec_charptr *this_rec )
-#main.c:{
-#main.c:       printf( "\
-#main.c:\t\tcharptr iterator_1 this_rec\t\t\t\t= iter_2 ... %p
-#main.c:\t\tcharptr iterator_1 this_rec->contents\t= iter_2 ... %s\n\n", (const void *)this_rec, this_rec->contents );
-#main.c:       return( this_rec );
-#main.c:
-#main.c:}
-#main.c:
-#main.c:
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * Function    :  main
-#main.c: *
-#main.c: * Description :  Test the doubly linked list as it is so far.
-#main.c: *
-#main.c: * Parameters  :  None
-#main.c: *
-#main.c: * Returns     :  N/A
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:int main( int argc, const char **argv )
-#main.c:{
-#main.c:       struct gen_list *lcharptr;
-#main.c:       struct gen_list *llong;
-#main.c:       struct gen_list *ldouble;
-#main.c:       struct gen_list *lchar;
-#main.c:
-#main.c:       struct gen_list *lcharptr_c;
-#main.c:       struct gen_list *llong_c;
-#main.c:       struct gen_list *ldouble_c;
-#main.c:       struct gen_list *lchar_c;
-#main.c:
-#main.c:       struct gen_list_rec *f_rec;
-#main.c:
-#main.c:       struct gen_list *no_own_list;
-#main.c:       struct gen_list_rec *no_own_rec1;
-#main.c:       struct gen_list_rec *no_own_rec2;
-#main.c:       struct gen_list_rec *no_own_rec3;
-#main.c:
-#main.c:       printf( "\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n",
-#main.c:                         gen_list_rcs,
-#main.c:                         gen_list_h_rcs,
-#main.c:                         isa_rcs,
-#main.c:                         isa_h_rcs,
-#main.c:                         malloc_police_rcs,
-#main.c:                         malloc_police_h_rcs,
-#main.c:                         rec_char_rcs,
-#main.c:                         rec_char_h_rcs,
-#main.c:                         rec_charptr_rcs,
-#main.c:                         rec_charptr_h_rcs,
-#main.c:                         rec_long_rcs,
-#main.c:                         rec_long_h_rcs,
-#main.c:                         rec_double_rcs,
-#main.c:                         rec_double_h_rcs,
-#main.c:                         rec_malloc_police_rcs,
-#main.c:                         rec_malloc_police_h_rcs,
-#main.c:                         main_rcs );
-#main.c:
-#main.c:
-#main.c:       /* Force a memory leak to test the strdup/malloc/free police. */
-#main.c:       /* NOTE: this should trigger the alphanum check of allocated memory. */
-#main.c:       strcpy( MALLOC( 60 ), "Force a memory leak to test the strdup/malloc/free police." );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a charptr list -- **\n" );
-#main.c:       lcharptr = gen_list_construct();
-#main.c:
-#main.c:       gen_list_insert( lcharptr, (struct gen_list_rec *)derived_rec_charptr_construct( "Rodney Stromlund" ) );
-#main.c:       gen_list_insert( lcharptr, f_rec = (struct gen_list_rec *)derived_rec_charptr_construct( "RJS" ) );
-#main.c:       gen_list_insert( lcharptr, (struct gen_list_rec *)derived_rec_charptr_construct( "jammin!" ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a charptr list -- **\n" );
-#main.c:       gen_list_stream( lcharptr );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_find to find the 2nd charptr record -- **\n" );
-#main.c:       f_rec = gen_list_find( lcharptr, f_rec );
-#main.c:       printf( "Found rec = %p\n", f_rec );
-#main.c:       derived_rec_charptr_stream( (const struct derived_rec_charptr *)f_rec );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the charptr list -- **\n" );
-#main.c:       lcharptr_c = gen_list_copy_construct( lcharptr );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if the copied list is the same as the orig -- **
-#main.c:** -- NOTE: they will NOT be because the charptr copy constructor changes the string contents -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lcharptr, lcharptr_c ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied charptr list -- **\n" );
-#main.c:       gen_list_stream( lcharptr_c );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a long list -- **\n" );
-#main.c:       llong = gen_list_construct();
-#main.c:
-#main.c:
-#main.c:       gen_list_insert( llong, no_own_rec1 = (struct gen_list_rec *)derived_rec_long_construct( 1 ) );
-#main.c:       gen_list_insert( llong, no_own_rec2 = (struct gen_list_rec *)derived_rec_long_construct( 100 ) );
-#main.c:       gen_list_insert( llong, no_own_rec3 = (struct gen_list_rec *)derived_rec_long_construct( 200 ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a long list -- **\n" );
-#main.c:       gen_list_stream( llong );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the long list -- **\n" );
-#main.c:       llong_c = gen_list_copy_construct( llong );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied long list -- **\n" );
-#main.c:       gen_list_stream( llong_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to test a no-owner long list -- **\n" );
-#main.c:       no_own_list = gen_list_construct();
-#main.c:       gen_list_insert( no_own_list, no_own_rec1 );
-#main.c:       gen_list_insert( no_own_list, no_own_rec2 );
-#main.c:       gen_list_insert( no_own_list, no_own_rec3 );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a no-owner list -- **\n" );
-#main.c:       gen_list_stream( no_own_list );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if list and no-owner list are equal  NOTE: they should be. -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( llong, no_own_list ) );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a double list -- **\n" );
-#main.c:       ldouble = gen_list_construct();
-#main.c:
-#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.0 ) );
-#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.1 ) );
-#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.14 ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a double list -- **\n" );
-#main.c:       gen_list_stream( ldouble );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the double list -- **\n" );
-#main.c:       ldouble_c = gen_list_copy_construct( ldouble );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied double list -- **\n" );
-#main.c:       gen_list_stream( ldouble_c );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a char list -- **\n" );
-#main.c:       lchar = gen_list_construct();
-#main.c:
-#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( '1' ) );
-#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( 'A' ) );
-#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( 'a' ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a char list -- **\n" );
-#main.c:       gen_list_stream( lchar );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the char list -- **\n" );
-#main.c:       lchar_c = gen_list_copy_construct( lchar );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if the copied list is the same as the orig  NOTE: they should be. -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lchar, lchar_c ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied char list -- **\n" );
-#main.c:       gen_list_stream( lchar_c );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate to iterate a charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_1) will iterate the whole list. -- **\n" );
-#main.c:       gen_list_iterate( lcharptr,     (rec_iterate)my_custom_charptr_iterator_1 );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate to iterate a copied charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_2) will return after the first iteration. -- **\n" );
-#main.c:       gen_list_iterate( lcharptr_c,   (rec_iterate)my_custom_charptr_iterator_2 );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate_reverse to iterate a charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_1) will iterate the whole list. -- **\n" );
-#main.c:       gen_list_iterate_reverse( lcharptr,     (rec_iterate)my_custom_charptr_iterator_1 );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate_reverse to iterate a copied charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_2) will return after the first iteration. -- **\n" );
-#main.c:       gen_list_iterate_reverse( lcharptr_c,   (rec_iterate)my_custom_charptr_iterator_2 );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if 2 different typed lists are equal  NOTE: they should not be. -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lcharptr, llong ) );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove_all to erase a no-owner list -- **\n" );
-#main.c:       no_own_list = gen_list_remove_all( no_own_list );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct a no-owner list -- **\n" );
-#main.c:       no_own_list = gen_list_destruct( no_own_list );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the first record of a copied charptr list -- **\n" );
-#main.c:       derived_rec_charptr_destruct( (struct derived_rec_charptr *)gen_list_remove( lcharptr_c, gen_list_get_first( lcharptr_c ) ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the last record of a copied long list -- **\n" );
-#main.c:       derived_rec_long_destruct( (struct derived_rec_long *)gen_list_remove( llong_c, gen_list_get_last( llong_c ) ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the middle record of an original charptr list -- **\n" );
-#main.c:       derived_rec_charptr_destruct( (struct derived_rec_charptr *)gen_list_remove( lcharptr, f_rec ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the all 3 records of a copied char list (first to last) -- **\n" );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the all 3 records of the original char list (last to first) -- **\n" );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original charptr list (less the middle record) -- **\n" );
-#main.c:       lcharptr = gen_list_destruct( lcharptr );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied charptr list (less the first record) -- **\n" );
-#main.c:       lcharptr_c = gen_list_destruct( lcharptr_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original long list -- **\n" );
-#main.c:       llong = gen_list_destruct( llong );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied long list (less the last record) -- **\n" );
-#main.c:       llong_c = gen_list_destruct( llong_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original double list -- **\n" );
-#main.c:       ldouble = gen_list_destruct( ldouble );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied double list -- **\n" );
-#main.c:       ldouble_c = gen_list_destruct( ldouble_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original char list (less all records last to first) -- **\n" );
-#main.c:       lchar = gen_list_destruct( lchar );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied char list (less all records first to last) -- **\n" );
-#main.c:       lchar_c = gen_list_destruct( lchar_c );
-#main.c:
-#main.c:
-#main.c:       /* Force another memory leak to test the strdup/malloc/free police. */
-#main.c:       /* NOTE: this should trigger the alphanum check of allocated memory. */
-#main.c:       STRDUP( "Force another memory leak to test the strdup/malloc/free police." );
-#main.c:
-#main.c:       /* Force a memory leak in a list and also in 2 nodes. */
-#main.c:       /* NOTE: this should NOT trigger the alphanum check of allocated memory. */
-#main.c:       gen_list_construct();
-#main.c:
-#main.c:       /* NOTE: this should trigger 1 NON check (for the node) */
-#main.c:       /* followed by 1 alphanum check for the charptr string. */
-#main.c:       derived_rec_charptr_construct( "Leaky charptr node." );
-#main.c:
-#main.c:       /* NOTE: this should NOT trigger the alphanum check of allocated memory. */
-#main.c:       derived_rec_char_construct( 'Z' );
-#main.c:
-#main.c:
-#main.c:       printf( "\ndone" );
-#main.c:       return( 0 );
-#main.c:
-#main.c:}
-#main.c:
-#main.c:
-#main.c:/*
-#main.c:  Local Variables:
-#main.c:  tab-width: 3
-#main.c:  end:
-#main.c:*/
-
-
-#malloc_police.c:const char malloc_police_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#malloc_police.c: *
-#malloc_police.c: * Purpose     :  This module uses the rec_malloc_police to build a
-#malloc_police.c: *                                            list of allocated and freed memory.  When the
-#malloc_police.c: *                                            program exits, we will print a list of all memory
-#malloc_police.c: *                                            that was allocated, but never freed.  This could
-#malloc_police.c: *                                            be most helpful to developers and debugers.
-#malloc_police.c: *
-#malloc_police.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#malloc_police.c: *                Privoxy team. http://www.privoxy.org/
-#malloc_police.c: *
-#malloc_police.c: *                This program is free software; you can redistribute it
-#malloc_police.c: *                and/or modify it under the terms of the GNU General
-#malloc_police.c: *                Public License as published by the Free Software
-#malloc_police.c: *                Foundation; either version 2 of the License, or (at
-#malloc_police.c: *                your option) any later version.
-#malloc_police.c: *
-#malloc_police.c: *                This program is distributed in the hope that it will
-#malloc_police.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#malloc_police.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#malloc_police.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#malloc_police.c: *                License for more details.
-#malloc_police.c: *
-#malloc_police.c: *                The GNU General Public License should be included with
-#malloc_police.c: *                this file.  If not, you can view it at
-#malloc_police.c: *                http://www.gnu.org/copyleft/gpl.html
-#malloc_police.c: *                or write to the Free Software Foundation, Inc., 59
-#malloc_police.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#malloc_police.c: *
-#malloc_police.c: * VI users           :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#malloc_police.c: *                                            and edit IJB, correctly.
-#malloc_police.c: *
-#malloc_police.c: * Revisions   :
-#malloc_police.c: *    $Log: contrib.sh,v $
-#malloc_police.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#malloc_police.c: *    name change related issues
-#malloc_police.c: *
-#malloc_police.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#malloc_police.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#malloc_police.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#malloc_police.c: *    contrib directory and I cannot upload a tarball ... it gets
-#malloc_police.c: *    corrupted).  This script will expand all files needed to create the
-#malloc_police.c: *    linked list modules and an example program.  Please see the README.
-#malloc_police.c: *    Feed back is welcomed.  Enjoy.
-#malloc_police.c: *
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:\f
-#malloc_police.c:
-#malloc_police.c:#include <ctype.h>
-#malloc_police.c:#include <malloc.h>
-#malloc_police.c:#include <stdio.h>
-#malloc_police.c:#include <stdlib.h>
-#malloc_police.c:#include <string.h>
-#malloc_police.c:
-#malloc_police.c:#include "gen_list.h"
-#malloc_police.c:#include "malloc_police.h"
-#malloc_police.c:#include "rec_malloc_police.h"
-#malloc_police.c:
-#malloc_police.c:const char malloc_police_h_rcs[] = MALLOC_POLICE_H_VERSION;
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/* When we need to allocate malloc_police records, we */
-#malloc_police.c:/* will do recursion infinately.  This variable will */
-#malloc_police.c:/* stop the STRDUP, MALLOC, and FREE replacements from */
-#malloc_police.c:/* trying to log these allocations. */
-#malloc_police.c:
-#malloc_police.c:char recursion_protect = 0;
-#malloc_police.c:
-#malloc_police.c:struct gen_list *get_police_list();
-#malloc_police.c:static char called_once = 0;
-#malloc_police.c:static const char *leak_report_header = "%s****************************** MEMORY LEAK REPORT %s ******************************%s";
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_list_release_iterator
-#malloc_police.c: *
-#malloc_police.c: * Description :  Iterator for the police list.  We will report
-#malloc_police.c: *                                            "leaked" memory for the developer to correct.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  The record.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  NULL
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:struct derived_rec_malloc_police *police_list_release_iterator( struct derived_rec_malloc_police *this_rec )
-#malloc_police.c:{
-#malloc_police.c:      if ( ! called_once )
-#malloc_police.c:      {
-#malloc_police.c:              called_once = 1;
-#malloc_police.c:              fprintf( stderr, leak_report_header, "\n\n", "BEGIN", "\n\n" );
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      fprintf( stderr, "\
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec\t\t\t\t\t= %p
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->alloced_addr\t= %p
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->source_where\t= %s
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->sz\t\t\t\t= %ld\n",
-#malloc_police.c:                              (const void *)this_rec,
-#malloc_police.c:                              this_rec->alloced_addr,
-#malloc_police.c:                              this_rec->source_where,
-#malloc_police.c:                              this_rec->sz
-#malloc_police.c:      );
-#malloc_police.c:
-#malloc_police.c:      if (
-#malloc_police.c:              this_rec->sz >= 3 &&
-#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 0 ] ) &&
-#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 1 ] ) &&
-#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 2 ] ) )
-#malloc_police.c:      {
-#malloc_police.c:              /* If the memory starts with 3 alpha-numerics,
-#malloc_police.c:               * assume a string was allocated.  This might be
-#malloc_police.c:               * a little dangerous for production code, but I
-#malloc_police.c:               * will take the risk for development payoff
-#malloc_police.c:               * (at least for now ...) */
-#malloc_police.c:                      
-#malloc_police.c:              fprintf( stderr, "\
-#malloc_police.c:\t\tAlpha numeric found, assuming a string was allocated\t\t\t= %s\n",
-#malloc_police.c:                                      this_rec->alloced_addr
-#malloc_police.c:              );
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      fprintf( stderr, "\n" );
-#malloc_police.c:
-#malloc_police.c:      return( NULL );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  release_police_list
-#malloc_police.c: *
-#malloc_police.c: * Description :  Iterates the police_list and reports "leaked" memory.
-#malloc_police.c: *                                            It will then free the list itself.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :      None
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  None.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:void release_police_list()
-#malloc_police.c:{
-#malloc_police.c:      struct gen_list *police_list = get_police_list();
-#malloc_police.c:      fflush( stdout );
-#malloc_police.c:      gen_list_iterate( police_list, (rec_iterate)police_list_release_iterator );
-#malloc_police.c:
-#malloc_police.c:      if ( called_once )
-#malloc_police.c:      {
-#malloc_police.c:              called_once = 0;
-#malloc_police.c:              fprintf( stderr, leak_report_header, "", "END", "\n" );
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  get_police_list
-#malloc_police.c: *
-#malloc_police.c: * Description :  Get the police malloc/strdup/free list.  Generate
-#malloc_police.c: *                                            a new one if it does not yet exist.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :      None
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  The police list.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:struct gen_list *get_police_list()
-#malloc_police.c:{
-#malloc_police.c:      static struct gen_list *police_list = NULL;
-#malloc_police.c:
-#malloc_police.c:      if ( NULL == police_list )
-#malloc_police.c:      {
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              police_list = gen_list_construct();
-#malloc_police.c:              atexit( release_police_list );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      return( police_list );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_strdup
-#malloc_police.c: *
-#malloc_police.c: * Description :  Save the results of the strdup into our linked list.
-#malloc_police.c: *                                            This will be checked against latter free(s).
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  The string to be duplicated.
-#malloc_police.c: *          2  :  Filename where the strdup occured.
-#malloc_police.c: *          3  :  Line# of where the strdup occured.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  Pointer to newly allocated memory.
-#malloc_police.c: *
-#malloc_police.c: * NOTE                       :       This could replace the custom strdup for __MINGW32__
-#malloc_police.c: *                                            systems.  We only need to copy the conditionally
-#malloc_police.c: *                                            compiled code here and eliminate the strdup copy.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:char *police_strdup( const char *s, const char *filename, long lineno )
-#malloc_police.c:{
-#malloc_police.c:      char *ret = strdup( s );
-#malloc_police.c:
-#malloc_police.c:      if ( 0 == recursion_protect )
-#malloc_police.c:      {
-#malloc_police.c:              char buffer[ 255 ];
-#malloc_police.c:              sprintf( buffer, "strdup : %s @ %ld for %ld (%s)", filename, lineno, strlen( s ) + 1, s );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              gen_list_insert(
-#malloc_police.c:                      get_police_list(),
-#malloc_police.c:                      (struct gen_list_rec *)derived_rec_malloc_police_construct( ret, buffer, strlen( s ) + 1 )
-#malloc_police.c:              );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      return( ret );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_malloc
-#malloc_police.c: *
-#malloc_police.c: * Description :  Save the results of the malloc into our linked list.
-#malloc_police.c: *                                            This will be checked against latter free(s).
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  The size of the memory to be malloc(ed).
-#malloc_police.c: *          2  :  Filename where the malloc occured.
-#malloc_police.c: *          3  :  Line# of where the malloc occured.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:void *police_malloc( size_t sz, const char *filename, long lineno )
-#malloc_police.c:{
-#malloc_police.c:      void *ret = malloc( sz );
-#malloc_police.c:
-#malloc_police.c:      if ( 0 == recursion_protect )
-#malloc_police.c:      {
-#malloc_police.c:              char buffer[ 255 ];
-#malloc_police.c:              sprintf( buffer, "malloc : %s @ %ld for %ld", filename, lineno, sz );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              gen_list_insert(
-#malloc_police.c:                      get_police_list(),
-#malloc_police.c:                      (struct gen_list_rec *)derived_rec_malloc_police_construct( ret, buffer, sz )
-#malloc_police.c:              );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      return( ret );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_free
-#malloc_police.c: *
-#malloc_police.c: * Description :  Frees the memory allocation and removes the address
-#malloc_police.c: *                                            from the linked list.  Anything left in this list
-#malloc_police.c: *                                            is "leaked" memory.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  Pointer to the memory to be freed.
-#malloc_police.c: *          2  :  Filename where the free occured.
-#malloc_police.c: *          3  :  Line# of where the free occured.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:void police_free( void *ptr, const char *filename, long lineno )
-#malloc_police.c:{
-#malloc_police.c:      if ( 0 == recursion_protect )
-#malloc_police.c:      {
-#malloc_police.c:              struct derived_rec_malloc_police *rec;
-#malloc_police.c:              struct gen_list_rec *fRec;
-#malloc_police.c:              struct gen_list *l = get_police_list();
-#malloc_police.c:
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              rec = derived_rec_malloc_police_construct( ptr, "FREEING POLICE RECORD.", 23 );
-#malloc_police.c:              fRec = gen_list_find( l, (struct gen_list_rec *)rec );
-#malloc_police.c:              derived_rec_malloc_police_destruct( rec );
-#malloc_police.c:
-#malloc_police.c:              if ( NULL == fRec )
-#malloc_police.c:              {
-#malloc_police.c:                      fprintf( stderr, "\nERROR: free failed to find corresponding strdup/malloc : %s @ %ld\n", filename, lineno );
-#malloc_police.c:              }
-#malloc_police.c:              else
-#malloc_police.c:              {
-#malloc_police.c:                      derived_rec_malloc_police_destruct( (struct derived_rec_malloc_police *)gen_list_remove( l, fRec ) );
-#malloc_police.c:              }
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      free( ptr );
-#malloc_police.c:
-#malloc_police.c:}
-
-
-#malloc_police.h:#ifndef MALLOC_POLICE_H_INCLUDED
-#malloc_police.h:#define MALLOC_POLICE_H_INCLUDED
-#malloc_police.h:#define MALLOC_POLICE_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#malloc_police.h:/*********************************************************************
-#malloc_police.h: *
-#malloc_police.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#malloc_police.h: *
-#malloc_police.h: * Purpose     :  This module uses the rec_malloc_police to build a
-#malloc_police.h: *                                            list of allocated and freed memory.  When the
-#malloc_police.h: *                                            program exits, we will print a list of all memory
-#malloc_police.h: *                                            that was allocated, but never freed.  This could
-#malloc_police.h: *                                            be most helpful to developers and debugers.
-#malloc_police.h: *
-#malloc_police.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#malloc_police.h: *                Privoxy team. http://www.privoxy.org/
-#malloc_police.h: *
-#malloc_police.h: *                This program is free software; you can redistribute it
-#malloc_police.h: *                and/or modify it under the terms of the GNU General
-#malloc_police.h: *                Public License as published by the Free Software
-#malloc_police.h: *                Foundation; either version 2 of the License, or (at
-#malloc_police.h: *                your option) any later version.
-#malloc_police.h: *
-#malloc_police.h: *                This program is distributed in the hope that it will
-#malloc_police.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#malloc_police.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#malloc_police.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#malloc_police.h: *                License for more details.
-#malloc_police.h: *
-#malloc_police.h: *                The GNU General Public License should be included with
-#malloc_police.h: *                this file.  If not, you can view it at
-#malloc_police.h: *                http://www.gnu.org/copyleft/gpl.html
-#malloc_police.h: *                or write to the Free Software Foundation, Inc., 59
-#malloc_police.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#malloc_police.h: *
-#malloc_police.h: * VI users           :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#malloc_police.h: *                                            and edit IJB, correctly.
-#malloc_police.h: *
-#malloc_police.h: * Revisions   :
-#malloc_police.h: *    $Log: contrib.sh,v $
-#malloc_police.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#malloc_police.h: *    name change related issues
-#malloc_police.h: *
-#malloc_police.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#malloc_police.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#malloc_police.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#malloc_police.h: *    contrib directory and I cannot upload a tarball ... it gets
-#malloc_police.h: *    corrupted).  This script will expand all files needed to create the
-#malloc_police.h: *    linked list modules and an example program.  Please see the README.
-#malloc_police.h: *    Feed back is welcomed.  Enjoy.
-#malloc_police.h: *
-#malloc_police.h: *
-#malloc_police.h: *********************************************************************/
-#malloc_police.h:\f
-#malloc_police.h:
-#malloc_police.h:#ifdef __cplusplus
-#malloc_police.h:extern "C" {
-#malloc_police.h:#endif
-#malloc_police.h:
-#malloc_police.h:
-#malloc_police.h:char *police_strdup( const char *s, const char *filename, long lineno );
-#malloc_police.h:void *police_malloc( size_t sz, const char *filename, long lineno );
-#malloc_police.h:void police_free( void *ptr, const char *filename, long lineno );
-#malloc_police.h:
-#malloc_police.h:#define STRDUP(s)                     police_strdup( s, __FILE__, __LINE__ )
-#malloc_police.h:#define MALLOC(sz)            police_malloc( sz, __FILE__, __LINE__ )
-#malloc_police.h:#define FREE(ptr)                     police_free( ptr, __FILE__, __LINE__ )
-#malloc_police.h:
-#malloc_police.h:
-#malloc_police.h:#ifdef __cplusplus
-#malloc_police.h:} /* extern "C" */
-#malloc_police.h:#endif
-#malloc_police.h:
-#malloc_police.h:#endif /* ndef MALLOC_POLICE_H_INCLUDED */
-#malloc_police.h:
-#malloc_police.h:/*
-#malloc_police.h:  Local Variables:
-#malloc_police.h:  tab-width: 3
-#malloc_police.h:  end:
-#malloc_police.h:*/
-
-
-#rec_char.c:const char rec_char_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_char.c: *
-#rec_char.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_char.c: *
-#rec_char.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_char.c: *                Privoxy team. http://www.privoxy.org/
-#rec_char.c: *
-#rec_char.c: *                This program is free software; you can redistribute it
-#rec_char.c: *                and/or modify it under the terms of the GNU General
-#rec_char.c: *                Public License as published by the Free Software
-#rec_char.c: *                Foundation; either version 2 of the License, or (at
-#rec_char.c: *                your option) any later version.
-#rec_char.c: *
-#rec_char.c: *                This program is distributed in the hope that it will
-#rec_char.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_char.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_char.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_char.c: *                License for more details.
-#rec_char.c: *
-#rec_char.c: *                The GNU General Public License should be included with
-#rec_char.c: *                this file.  If not, you can view it at
-#rec_char.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_char.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_char.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_char.c: *
-#rec_char.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_char.c: *                                         and edit IJB, correctly.
-#rec_char.c: *
-#rec_char.c: * Revisions   :
-#rec_char.c: *    $Log: contrib.sh,v $
-#rec_char.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_char.c: *    name change related issues
-#rec_char.c: *
-#rec_char.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_char.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_char.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_char.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_char.c: *    corrupted).  This script will expand all files needed to create the
-#rec_char.c: *    linked list modules and an example program.  Please see the README.
-#rec_char.c: *    Feed back is welcomed.  Enjoy.
-#rec_char.c: *
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:\f
-#rec_char.c:
-#rec_char.c:#include <malloc.h>
-#rec_char.c:#include <stdio.h>
-#rec_char.c:#include <stdlib.h>
-#rec_char.c:#include <string.h>
-#rec_char.c:
-#rec_char.c:#include "gen_list.h"
-#rec_char.c:#include "rec_char.h"
-#rec_char.c:
-#rec_char.c:const char rec_char_h_rcs[] = REC_CHAR_H_VERSION;
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:static const rec_method rec_char_vtable[] =
-#rec_char.c:{
-#rec_char.c:   (rec_method)derived_rec_char_copy_construct,
-#rec_char.c:   (rec_method)derived_rec_char_destruct,
-#rec_char.c:   (rec_method)derived_rec_char_stream,
-#rec_char.c:   (rec_method)derived_rec_char_equal
-#rec_char.c:};
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_construct
-#rec_char.c: *
-#rec_char.c: * Description :  A simple derived record class that contains 1 string.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  The record
-#rec_char.c: *          2  :  The string to contain.
-#rec_char.c: *
-#rec_char.c: * Returns     :  A pointer to the constructed record.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:struct derived_rec_char *derived_rec_char_construct( const char _contents )
-#rec_char.c:{
-#rec_char.c:   struct derived_rec_char *this_rec = (struct derived_rec_char *)gen_list_rec_construct(
-#rec_char.c:           ISA_CHAR,
-#rec_char.c:           sizeof( struct derived_rec_char ),
-#rec_char.c:           rec_char_vtable
-#rec_char.c:   );
-#rec_char.c:
-#rec_char.c:   this_rec->contents = _contents;
-#rec_char.c:
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar construct new rec\t\t\t\t= %p
-#rec_char.c:\t\tchar construct new rec contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   return( this_rec );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_copy_construct
-#rec_char.c: *
-#rec_char.c: * Description :  Copies one char record to another.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  Existing record.
-#rec_char.c: *                         2       :  Copy record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  The newly constructed copy record.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:struct derived_rec_char *derived_rec_char_copy_construct( const struct derived_rec_char *this_rec )
-#rec_char.c:{
-#rec_char.c:   struct derived_rec_char *copy_rec = (struct derived_rec_char *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_char.c:   copy_rec->contents = this_rec->contents;
-#rec_char.c:
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar copy construct new gen rec\t\t\t\t= %p => %p
-#rec_char.c:\t\tchar copy construct new gen rec contents\t= %c\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   return( copy_rec );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_destruct        
-#rec_char.c: *
-#rec_char.c: * Description :  Destruct the char record.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  The record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  NULL
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:struct derived_rec_char *derived_rec_char_destruct( struct derived_rec_char *this_rec )
-#rec_char.c:{
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar destruct this_rec\t\t\t\t= %p
-#rec_char.c:\t\tchar destruct this_rec->contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   this_rec->contents = '!';
-#rec_char.c:   return( (struct derived_rec_char *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_stream
-#rec_char.c: *
-#rec_char.c: * Description :  Displays all char attributes on the STDOUT stream.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  The record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  The record.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:const struct derived_rec_char *derived_rec_char_stream( const struct derived_rec_char *this_rec )
-#rec_char.c:{
-#rec_char.c:   this_rec = (struct derived_rec_char *)gen_list_rec_stream(
-#rec_char.c:           (struct gen_list_rec *)this_rec
-#rec_char.c:   );
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar stream this_rec\t\t\t\t\t= %p
-#rec_char.c:\t\tchar stream this_rec->contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   return( this_rec );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_equal
-#rec_char.c: *
-#rec_char.c: * Description :  Compares two char records to see if they are equal.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  A record.
-#rec_char.c: *          2  :  Another record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:int derived_rec_char_equal( const struct derived_rec_char *this_rec, const struct derived_rec_char *eq_rec )
-#rec_char.c:{
-#rec_char.c:   if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_char.c:   {
-#rec_char.c:           return( 0 );
-#rec_char.c:   }
-#rec_char.c:   return( this_rec->contents == eq_rec->contents );
-#rec_char.c:
-#rec_char.c:}
-
-
-#rec_char.h:#ifndef REC_CHAR_H_INCLUDED
-#rec_char.h:#define REC_CHAR_H_INCLUDED
-#rec_char.h:#define REC_CHAR_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_char.h:/*********************************************************************
-#rec_char.h: *
-#rec_char.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_char.h: *
-#rec_char.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_char.h: *
-#rec_char.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_char.h: *                Privoxy team. http://www.privoxy.org/
-#rec_char.h: *
-#rec_char.h: *                This program is free software; you can redistribute it
-#rec_char.h: *                and/or modify it under the terms of the GNU General
-#rec_char.h: *                Public License as published by the Free Software
-#rec_char.h: *                Foundation; either version 2 of the License, or (at
-#rec_char.h: *                your option) any later version.
-#rec_char.h: *
-#rec_char.h: *                This program is distributed in the hope that it will
-#rec_char.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_char.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_char.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_char.h: *                License for more details.
-#rec_char.h: *
-#rec_char.h: *                The GNU General Public License should be included with
-#rec_char.h: *                this file.  If not, you can view it at
-#rec_char.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_char.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_char.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_char.h: *
-#rec_char.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_char.h: *                                         and edit IJB, correctly.
-#rec_char.h: *
-#rec_char.h: * Revisions   :
-#rec_char.h: *    $Log: contrib.sh,v $
-#rec_char.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_char.h: *    name change related issues
-#rec_char.h: *
-#rec_char.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_char.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_char.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_char.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_char.h: *    corrupted).  This script will expand all files needed to create the
-#rec_char.h: *    linked list modules and an example program.  Please see the README.
-#rec_char.h: *    Feed back is welcomed.  Enjoy.
-#rec_char.h: *
-#rec_char.h: *
-#rec_char.h: *********************************************************************/
-#rec_char.h:\f
-#rec_char.h:
-#rec_char.h:#ifdef __cplusplus
-#rec_char.h:extern "C" {
-#rec_char.h:#endif
-#rec_char.h:
-#rec_char.h:
-#rec_char.h:struct derived_rec_char
-#rec_char.h:{
-#rec_char.h:   /* private: */
-#rec_char.h:   struct gen_list_rec parent_rec;
-#rec_char.h:   char contents;
-#rec_char.h:};
-#rec_char.h:
-#rec_char.h:/* public: */
-#rec_char.h:extern struct derived_rec_char *   derived_rec_char_construct( const char _contents );
-#rec_char.h:extern struct derived_rec_char *   derived_rec_char_copy_construct( const struct derived_rec_char *this_rec );
-#rec_char.h:extern struct derived_rec_char *   derived_rec_char_destruct( struct derived_rec_char *this_rec );
-#rec_char.h:extern const struct derived_rec_char *derived_rec_char_stream( const struct derived_rec_char *this_rec );
-#rec_char.h:extern int                                                         derived_rec_char_equal( const struct derived_rec_char *this_rec, const struct derived_rec_char *eq_rec );
-#rec_char.h:
-#rec_char.h:/* struct/class COMPLETE */
-#rec_char.h:
-#rec_char.h:
-#rec_char.h:#ifdef __cplusplus
-#rec_char.h:} /* extern "C" */
-#rec_char.h:#endif
-#rec_char.h:
-#rec_char.h:#endif /* ndef REC_CHAR_H_INCLUDED */
-#rec_char.h:
-#rec_char.h:/*
-#rec_char.h:  Local Variables:
-#rec_char.h:  tab-width: 3
-#rec_char.h:  end:
-#rec_char.h:*/
-
-
-#rec_charptr.c:const char rec_charptr_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_charptr.c: *
-#rec_charptr.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_charptr.c: *
-#rec_charptr.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_charptr.c: *                Privoxy team. http://www.privoxy.org/
-#rec_charptr.c: *
-#rec_charptr.c: *                This program is free software; you can redistribute it
-#rec_charptr.c: *                and/or modify it under the terms of the GNU General
-#rec_charptr.c: *                Public License as published by the Free Software
-#rec_charptr.c: *                Foundation; either version 2 of the License, or (at
-#rec_charptr.c: *                your option) any later version.
-#rec_charptr.c: *
-#rec_charptr.c: *                This program is distributed in the hope that it will
-#rec_charptr.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_charptr.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_charptr.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_charptr.c: *                License for more details.
-#rec_charptr.c: *
-#rec_charptr.c: *                The GNU General Public License should be included with
-#rec_charptr.c: *                this file.  If not, you can view it at
-#rec_charptr.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_charptr.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_charptr.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_charptr.c: *
-#rec_charptr.c: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_charptr.c: *                                              and edit IJB, correctly.
-#rec_charptr.c: *
-#rec_charptr.c: * Revisions   :
-#rec_charptr.c: *    $Log: contrib.sh,v $
-#rec_charptr.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_charptr.c: *    name change related issues
-#rec_charptr.c: *
-#rec_charptr.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_charptr.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_charptr.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_charptr.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_charptr.c: *    corrupted).  This script will expand all files needed to create the
-#rec_charptr.c: *    linked list modules and an example program.  Please see the README.
-#rec_charptr.c: *    Feed back is welcomed.  Enjoy.
-#rec_charptr.c: *
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:\f
-#rec_charptr.c:
-#rec_charptr.c:#include <malloc.h>
-#rec_charptr.c:#include <stdio.h>
-#rec_charptr.c:#include <stdlib.h>
-#rec_charptr.c:#include <string.h>
-#rec_charptr.c:
-#rec_charptr.c:#include "gen_list.h"
-#rec_charptr.c:#include "rec_charptr.h"
-#rec_charptr.c:#include "malloc_police.h"
-#rec_charptr.c:
-#rec_charptr.c:const char rec_charptr_h_rcs[] = REC_CHARPTR_H_VERSION;
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:static const rec_method rec_charptr_vtable[] =
-#rec_charptr.c:{
-#rec_charptr.c:        (rec_method)derived_rec_charptr_copy_construct,
-#rec_charptr.c:        (rec_method)derived_rec_charptr_destruct,
-#rec_charptr.c:        (rec_method)derived_rec_charptr_stream,
-#rec_charptr.c:        (rec_method)derived_rec_charptr_equal
-#rec_charptr.c:};
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_construct
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  A simple derived record class that contains 1 string.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  The record
-#rec_charptr.c: *          2  :  The string to contain.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  A pointer to the constructed record.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_construct( const char *_contents )
-#rec_charptr.c:{
-#rec_charptr.c:        struct derived_rec_charptr *this_rec = (struct derived_rec_charptr *)gen_list_rec_construct(
-#rec_charptr.c:                ISA_CHARPTR,
-#rec_charptr.c:                sizeof( struct derived_rec_charptr ),
-#rec_charptr.c:                rec_charptr_vtable
-#rec_charptr.c:        );
-#rec_charptr.c:
-#rec_charptr.c:        this_rec->contents = STRDUP( _contents );
-#rec_charptr.c:
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr construct new rec\t\t\t\t= %p
-#rec_charptr.c:\t\tcharptr construct new rec contents\t= %s\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:        return( this_rec );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_copy_construct
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Copies one charptr record to another.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  Existing record.
-#rec_charptr.c: *                              2       :  Copy record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  The newly constructed copy record.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_copy_construct( const struct derived_rec_charptr *this_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        int len;
-#rec_charptr.c:        char *new_contents;
-#rec_charptr.c:
-#rec_charptr.c:        struct derived_rec_charptr *copy_rec = (struct derived_rec_charptr *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_charptr.c:
-#rec_charptr.c:        len = strlen( this_rec->contents );
-#rec_charptr.c:        len += sizeof( "COPY " );
-#rec_charptr.c:
-#rec_charptr.c:        copy_rec->contents = (char *)MALLOC( len );
-#rec_charptr.c:        strcpy( copy_rec->contents, "COPY " );
-#rec_charptr.c:        strcat( copy_rec->contents, this_rec->contents );
-#rec_charptr.c:
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr copy construct new gen rec\t\t\t\t= %p => %p
-#rec_charptr.c:\t\tcharptr copy construct new gen rec contents\t= %s\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:        return( copy_rec );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_destruct  
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Destruct the charptr record.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  The record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  NULL
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_destruct( struct derived_rec_charptr *this_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr destruct this_rec\t\t\t\t= %p
-#rec_charptr.c:\t\tcharptr destruct this_rec->contents\t= %s\n\n", (const void *)this_rec, (const void *)this_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:        memset( this_rec->contents, '!', strlen( this_rec->contents ) );
-#rec_charptr.c:        FREE( this_rec->contents );
-#rec_charptr.c:        return( (struct derived_rec_charptr *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_stream
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Displays all charptr attributes on the STDOUT stream.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  The record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  The record.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:const struct derived_rec_charptr *derived_rec_charptr_stream( const struct derived_rec_charptr *this_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        this_rec = (struct derived_rec_charptr *)gen_list_rec_stream(
-#rec_charptr.c:                (struct gen_list_rec *)this_rec
-#rec_charptr.c:        );
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr stream this_rec\t\t\t\t\t= %p
-#rec_charptr.c:\t\tcharptr stream this_rec->contents\t= %s\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:        return( this_rec );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_equal
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Compares two charptr records to see if they are equal.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  A record.
-#rec_charptr.c: *          2  :  Another record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:int derived_rec_charptr_equal( const struct derived_rec_charptr *this_rec, const struct derived_rec_charptr *eq_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_charptr.c:        {
-#rec_charptr.c:                return( 0 );
-#rec_charptr.c:        }
-#rec_charptr.c:        return( 0 == strcmp( this_rec->contents, eq_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:}
-
-
-#rec_charptr.h:#ifndef REC_CHARPTR_H_INCLUDED
-#rec_charptr.h:#define REC_CHARPTR_H_INCLUDED
-#rec_charptr.h:#define REC_CHARPTR_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_charptr.h:/*********************************************************************
-#rec_charptr.h: *
-#rec_charptr.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_charptr.h: *
-#rec_charptr.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_charptr.h: *
-#rec_charptr.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_charptr.h: *                Privoxy team. http://www.privoxy.org/
-#rec_charptr.h: *
-#rec_charptr.h: *                This program is free software; you can redistribute it
-#rec_charptr.h: *                and/or modify it under the terms of the GNU General
-#rec_charptr.h: *                Public License as published by the Free Software
-#rec_charptr.h: *                Foundation; either version 2 of the License, or (at
-#rec_charptr.h: *                your option) any later version.
-#rec_charptr.h: *
-#rec_charptr.h: *                This program is distributed in the hope that it will
-#rec_charptr.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_charptr.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_charptr.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_charptr.h: *                License for more details.
-#rec_charptr.h: *
-#rec_charptr.h: *                The GNU General Public License should be included with
-#rec_charptr.h: *                this file.  If not, you can view it at
-#rec_charptr.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_charptr.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_charptr.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_charptr.h: *
-#rec_charptr.h: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_charptr.h: *                                              and edit IJB, correctly.
-#rec_charptr.h: *
-#rec_charptr.h: * Revisions   :
-#rec_charptr.h: *    $Log: contrib.sh,v $
-#rec_charptr.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_charptr.h: *    name change related issues
-#rec_charptr.h: *
-#rec_charptr.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_charptr.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_charptr.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_charptr.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_charptr.h: *    corrupted).  This script will expand all files needed to create the
-#rec_charptr.h: *    linked list modules and an example program.  Please see the README.
-#rec_charptr.h: *    Feed back is welcomed.  Enjoy.
-#rec_charptr.h: *
-#rec_charptr.h: *
-#rec_charptr.h: *********************************************************************/
-#rec_charptr.h:\f
-#rec_charptr.h:
-#rec_charptr.h:#ifdef __cplusplus
-#rec_charptr.h:extern "C" {
-#rec_charptr.h:#endif
-#rec_charptr.h:
-#rec_charptr.h:
-#rec_charptr.h:struct derived_rec_charptr
-#rec_charptr.h:{
-#rec_charptr.h:        /* private: */
-#rec_charptr.h:        struct gen_list_rec parent_rec;
-#rec_charptr.h:        char *contents;
-#rec_charptr.h:};
-#rec_charptr.h:
-#rec_charptr.h:/* public: */
-#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_construct( const char *_contents );
-#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_copy_construct( const struct derived_rec_charptr *this_rec );
-#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_destruct( struct derived_rec_charptr *this_rec );
-#rec_charptr.h:extern const struct derived_rec_charptr *derived_rec_charptr_stream( const struct derived_rec_charptr *this_rec );
-#rec_charptr.h:extern int                                                                      derived_rec_charptr_equal( const struct derived_rec_charptr *this_rec, const struct derived_rec_charptr *eq_rec );
-#rec_charptr.h:
-#rec_charptr.h:/* struct/class COMPLETE */
-#rec_charptr.h:
-#rec_charptr.h:
-#rec_charptr.h:#ifdef __cplusplus
-#rec_charptr.h:} /* extern "C" */
-#rec_charptr.h:#endif
-#rec_charptr.h:
-#rec_charptr.h:#endif /* ndef REC_CHARPTR_H_INCLUDED */
-#rec_charptr.h:
-#rec_charptr.h:/*
-#rec_charptr.h:  Local Variables:
-#rec_charptr.h:  tab-width: 3
-#rec_charptr.h:  end:
-#rec_charptr.h:*/
-
-
-#rec_double.c:const char rec_double_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_double.c: *
-#rec_double.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_double.c: *
-#rec_double.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_double.c: *                Privoxy team. http://www.privoxy.org/
-#rec_double.c: *
-#rec_double.c: *                This program is free software; you can redistribute it
-#rec_double.c: *                and/or modify it under the terms of the GNU General
-#rec_double.c: *                Public License as published by the Free Software
-#rec_double.c: *                Foundation; either version 2 of the License, or (at
-#rec_double.c: *                your option) any later version.
-#rec_double.c: *
-#rec_double.c: *                This program is distributed in the hope that it will
-#rec_double.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_double.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_double.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_double.c: *                License for more details.
-#rec_double.c: *
-#rec_double.c: *                The GNU General Public License should be included with
-#rec_double.c: *                this file.  If not, you can view it at
-#rec_double.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_double.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_double.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_double.c: *
-#rec_double.c: * VI users              :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_double.c: *                                               and edit IJB, correctly.
-#rec_double.c: *
-#rec_double.c: * Revisions   :
-#rec_double.c: *    $Log: contrib.sh,v $
-#rec_double.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_double.c: *    name change related issues
-#rec_double.c: *
-#rec_double.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_double.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_double.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_double.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_double.c: *    corrupted).  This script will expand all files needed to create the
-#rec_double.c: *    linked list modules and an example program.  Please see the README.
-#rec_double.c: *    Feed back is welcomed.  Enjoy.
-#rec_double.c: *
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:\f
-#rec_double.c:
-#rec_double.c:#include <malloc.h>
-#rec_double.c:#include <stdio.h>
-#rec_double.c:#include <stdlib.h>
-#rec_double.c:#include <string.h>
-#rec_double.c:
-#rec_double.c:#include "gen_list.h"
-#rec_double.c:#include "rec_double.h"
-#rec_double.c:
-#rec_double.c:const char rec_double_h_rcs[] = REC_DOUBLE_H_VERSION;
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:static const rec_method rec_double_vtable[] =
-#rec_double.c:{
-#rec_double.c: (rec_method)derived_rec_double_copy_construct,
-#rec_double.c: (rec_method)derived_rec_double_destruct,
-#rec_double.c: (rec_method)derived_rec_double_stream,
-#rec_double.c: (rec_method)derived_rec_double_equal
-#rec_double.c:};
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_construct
-#rec_double.c: *
-#rec_double.c: * Description :  A simple derived record class that contains 1 string.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  The record
-#rec_double.c: *          2  :  The string to contain.
-#rec_double.c: *
-#rec_double.c: * Returns     :  A pointer to the constructed record.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:struct derived_rec_double *derived_rec_double_construct( const double _contents )
-#rec_double.c:{
-#rec_double.c: struct derived_rec_double *this_rec = (struct derived_rec_double *)gen_list_rec_construct(
-#rec_double.c:         ISA_DOUBLE,
-#rec_double.c:         sizeof( struct derived_rec_double ),
-#rec_double.c:         rec_double_vtable
-#rec_double.c: );
-#rec_double.c:
-#rec_double.c: this_rec->contents = _contents;
-#rec_double.c:
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble construct new rec\t\t\t\t= %p
-#rec_double.c:\t\tdouble construct new rec contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_double.c:
-#rec_double.c: return( this_rec );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_copy_construct
-#rec_double.c: *
-#rec_double.c: * Description :  Copies one double record to another.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  Existing record.
-#rec_double.c: *                               2       :  Copy record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  The newly constructed copy record.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:struct derived_rec_double *derived_rec_double_copy_construct( const struct derived_rec_double *this_rec )
-#rec_double.c:{
-#rec_double.c: struct derived_rec_double *copy_rec = (struct derived_rec_double *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_double.c: copy_rec->contents = - this_rec->contents;
-#rec_double.c:
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble copy construct new gen rec\t\t\t\t= %p => %p
-#rec_double.c:\t\tdouble copy construct new gen rec contents\t= %8.2lf\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_double.c:
-#rec_double.c: return( copy_rec );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_destruct    
-#rec_double.c: *
-#rec_double.c: * Description :  Destruct the double record.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  The record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  NULL
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:struct derived_rec_double *derived_rec_double_destruct( struct derived_rec_double *this_rec )
-#rec_double.c:{
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble destruct this_rec\t\t\t\t= %p
-#rec_double.c:\t\tdouble destruct this_rec->contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_double.c:
-#rec_double.c: this_rec->contents = -1.1111;
-#rec_double.c: return( (struct derived_rec_double *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_stream
-#rec_double.c: *
-#rec_double.c: * Description :  Displays all double attributes on the STDOUT stream.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  The record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  The record.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:const struct derived_rec_double *derived_rec_double_stream( const struct derived_rec_double *this_rec )
-#rec_double.c:{
-#rec_double.c: this_rec = (struct derived_rec_double *)gen_list_rec_stream(
-#rec_double.c:         (struct gen_list_rec *)this_rec
-#rec_double.c: );
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble stream this_rec\t\t\t\t= %p
-#rec_double.c:\t\tdouble stream this_rec->contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_double.c:
-#rec_double.c: return( this_rec );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_equal
-#rec_double.c: *
-#rec_double.c: * Description :  Compares two double records to see if they are equal.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  A record.
-#rec_double.c: *          2  :  Another record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:int derived_rec_double_equal( const struct derived_rec_double *this_rec, const struct derived_rec_double *eq_rec )
-#rec_double.c:{
-#rec_double.c: if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_double.c: {
-#rec_double.c:         return( 0 );
-#rec_double.c: }
-#rec_double.c: return( this_rec->contents == eq_rec->contents );
-#rec_double.c:
-#rec_double.c:}
-
-
-#rec_double.h:#ifndef REC_DOUBLE_H_INCLUDED
-#rec_double.h:#define REC_DOUBLE_H_INCLUDED
-#rec_double.h:#define REC_DOUBLE_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_double.h:/*********************************************************************
-#rec_double.h: *
-#rec_double.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_double.h: *
-#rec_double.h: * Purpose     :  gen_A "derived class" of gen_list_rec.
-#rec_double.h: *
-#rec_double.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_double.h: *                Privoxy team. http://www.privoxy.org/
-#rec_double.h: *
-#rec_double.h: *                This program is free software; you can redistribute it
-#rec_double.h: *                and/or modify it under the terms of the GNU General
-#rec_double.h: *                Public License as published by the Free Software
-#rec_double.h: *                Foundation; either version 2 of the License, or (at
-#rec_double.h: *                your option) any later version.
-#rec_double.h: *
-#rec_double.h: *                This program is distributed in the hope that it will
-#rec_double.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_double.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_double.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_double.h: *                License for more details.
-#rec_double.h: *
-#rec_double.h: *                The GNU General Public License should be included with
-#rec_double.h: *                this file.  If not, you can view it at
-#rec_double.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_double.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_double.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_double.h: *
-#rec_double.h: * VI users              :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_double.h: *                                               and edit IJB, correctly.
-#rec_double.h: *
-#rec_double.h: * Revisions   :
-#rec_double.h: *    $Log: contrib.sh,v $
-#rec_double.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_double.h: *    name change related issues
-#rec_double.h: *
-#rec_double.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_double.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_double.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_double.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_double.h: *    corrupted).  This script will expand all files needed to create the
-#rec_double.h: *    linked list modules and an example program.  Please see the README.
-#rec_double.h: *    Feed back is welcomed.  Enjoy.
-#rec_double.h: *
-#rec_double.h: *
-#rec_double.h: *********************************************************************/
-#rec_double.h:\f
-#rec_double.h:
-#rec_double.h:#ifdef __cplusplus
-#rec_double.h:extern "C" {
-#rec_double.h:#endif
-#rec_double.h:
-#rec_double.h:
-#rec_double.h:struct derived_rec_double
-#rec_double.h:{
-#rec_double.h: /* private: */
-#rec_double.h: struct gen_list_rec parent_rec;
-#rec_double.h: double contents;
-#rec_double.h:};
-#rec_double.h:
-#rec_double.h:/* public: */
-#rec_double.h:extern struct derived_rec_double *       derived_rec_double_construct( const double _contents );
-#rec_double.h:extern struct derived_rec_double *       derived_rec_double_copy_construct( const struct derived_rec_double *this_rec );
-#rec_double.h:extern struct derived_rec_double *       derived_rec_double_destruct( struct derived_rec_double *this_rec );
-#rec_double.h:extern const struct derived_rec_double *derived_rec_double_stream( const struct derived_rec_double *this_rec );
-#rec_double.h:extern int                                                               derived_rec_double_equal( const struct derived_rec_double *this_rec, const struct derived_rec_double *eq_rec );
-#rec_double.h:
-#rec_double.h:/* struct/class COMPLETE */
-#rec_double.h:
-#rec_double.h:
-#rec_double.h:#ifdef __cplusplus
-#rec_double.h:} /* extern "C" */
-#rec_double.h:#endif
-#rec_double.h:
-#rec_double.h:#endif /* ndef REC_DOUBLE_H_INCLUDED */
-#rec_double.h:
-#rec_double.h:/*
-#rec_double.h:  Local Variables:
-#rec_double.h:  tab-width: 3
-#rec_double.h:  end:
-#rec_double.h:*/
-
-
-#rec_long.c:const char rec_long_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_long.c: *
-#rec_long.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_long.c: *
-#rec_long.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_long.c: *                Privoxy team. http://www.privoxy.org/
-#rec_long.c: *
-#rec_long.c: *                This program is free software; you can redistribute it
-#rec_long.c: *                and/or modify it under the terms of the GNU General
-#rec_long.c: *                Public License as published by the Free Software
-#rec_long.c: *                Foundation; either version 2 of the License, or (at
-#rec_long.c: *                your option) any later version.
-#rec_long.c: *
-#rec_long.c: *                This program is distributed in the hope that it will
-#rec_long.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_long.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_long.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_long.c: *                License for more details.
-#rec_long.c: *
-#rec_long.c: *                The GNU General Public License should be included with
-#rec_long.c: *                this file.  If not, you can view it at
-#rec_long.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_long.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_long.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_long.c: *
-#rec_long.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_long.c: *                                         and edit IJB, correctly.
-#rec_long.c: *
-#rec_long.c: * Revisions   :
-#rec_long.c: *    $Log: contrib.sh,v $
-#rec_long.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_long.c: *    name change related issues
-#rec_long.c: *
-#rec_long.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_long.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_long.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_long.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_long.c: *    corrupted).  This script will expand all files needed to create the
-#rec_long.c: *    linked list modules and an example program.  Please see the README.
-#rec_long.c: *    Feed back is welcomed.  Enjoy.
-#rec_long.c: *
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:\f
-#rec_long.c:
-#rec_long.c:#include <malloc.h>
-#rec_long.c:#include <stdio.h>
-#rec_long.c:#include <stdlib.h>
-#rec_long.c:#include <string.h>
-#rec_long.c:
-#rec_long.c:#include "gen_list.h"
-#rec_long.c:#include "rec_long.h"
-#rec_long.c:
-#rec_long.c:const char rec_long_h_rcs[] = REC_LONG_H_VERSION;
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:static const rec_method rec_long_vtable[] =
-#rec_long.c:{
-#rec_long.c:   (rec_method)derived_rec_long_copy_construct,
-#rec_long.c:   (rec_method)derived_rec_long_destruct,
-#rec_long.c:   (rec_method)derived_rec_long_stream,
-#rec_long.c:   (rec_method)derived_rec_long_equal
-#rec_long.c:};
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_construct
-#rec_long.c: *
-#rec_long.c: * Description :  A simple derived record class that contains 1 string.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  The record
-#rec_long.c: *          2  :  The string to contain.
-#rec_long.c: *
-#rec_long.c: * Returns     :  A pointer to the constructed record.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:struct derived_rec_long *derived_rec_long_construct( const long _contents )
-#rec_long.c:{
-#rec_long.c:   struct derived_rec_long *this_rec = (struct derived_rec_long *)gen_list_rec_construct(
-#rec_long.c:           ISA_LONG,
-#rec_long.c:           sizeof( struct derived_rec_long ),
-#rec_long.c:           rec_long_vtable
-#rec_long.c:   );
-#rec_long.c:
-#rec_long.c:   this_rec->contents = _contents;
-#rec_long.c:
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong construct new rec\t\t\t\t= %p
-#rec_long.c:\t\tlong construct new rec contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   return( this_rec );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_copy_construct
-#rec_long.c: *
-#rec_long.c: * Description :  Copies one long record to another.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  Existing record.
-#rec_long.c: *                         2       :  Copy record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  The newly constructed copy record.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:struct derived_rec_long *derived_rec_long_copy_construct( const struct derived_rec_long *this_rec )
-#rec_long.c:{
-#rec_long.c:   struct derived_rec_long *copy_rec = (struct derived_rec_long *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_long.c:   copy_rec->contents = - this_rec->contents;
-#rec_long.c:
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong copy construct new gen rec\t\t\t\t= %p => %p
-#rec_long.c:\t\tlong copy construct new gen rec contents\t= %d\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   return( copy_rec );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_destruct        
-#rec_long.c: *
-#rec_long.c: * Description :  Destruct the long record.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  The record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  NULL
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:struct derived_rec_long *derived_rec_long_destruct( struct derived_rec_long *this_rec )
-#rec_long.c:{
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong destruct this_rec\t\t\t\t= %p
-#rec_long.c:\t\tlong destruct this_rec->contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   this_rec->contents = -1;
-#rec_long.c:   return( (struct derived_rec_long *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_stream
-#rec_long.c: *
-#rec_long.c: * Description :  Displays all long attributes on the STDOUT stream.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  The record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  The record.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:const struct derived_rec_long *derived_rec_long_stream( const struct derived_rec_long *this_rec )
-#rec_long.c:{
-#rec_long.c:   this_rec = (struct derived_rec_long *)gen_list_rec_stream(
-#rec_long.c:           (struct gen_list_rec *)this_rec
-#rec_long.c:   );
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong stream this_rec\t\t\t\t\t= %p
-#rec_long.c:\t\tlong stream this_rec->contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   return( this_rec );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_equal
-#rec_long.c: *
-#rec_long.c: * Description :  Compares two long records to see if they are equal.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  A record.
-#rec_long.c: *          2  :  Another record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:int derived_rec_long_equal( const struct derived_rec_long *this_rec, const struct derived_rec_long *eq_rec )
-#rec_long.c:{
-#rec_long.c:   if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_long.c:   {
-#rec_long.c:           return( 0 );
-#rec_long.c:   }
-#rec_long.c:   return( this_rec->contents == eq_rec->contents );
-#rec_long.c:
-#rec_long.c:}
-
-
-#rec_long.h:#ifndef REC_LONG_H_INCLUDED
-#rec_long.h:#define REC_LONG_H_INCLUDED
-#rec_long.h:#define REC_LONG_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_long.h:/*********************************************************************
-#rec_long.h: *
-#rec_long.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_long.h: *
-#rec_long.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_long.h: *
-#rec_long.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_long.h: *                Privoxy team. http://www.privoxy.org/
-#rec_long.h: *
-#rec_long.h: *                This program is free software; you can redistribute it
-#rec_long.h: *                and/or modify it under the terms of the GNU General
-#rec_long.h: *                Public License as published by the Free Software
-#rec_long.h: *                Foundation; either version 2 of the License, or (at
-#rec_long.h: *                your option) any later version.
-#rec_long.h: *
-#rec_long.h: *                This program is distributed in the hope that it will
-#rec_long.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_long.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_long.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_long.h: *                License for more details.
-#rec_long.h: *
-#rec_long.h: *                The GNU General Public License should be included with
-#rec_long.h: *                this file.  If not, you can view it at
-#rec_long.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_long.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_long.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_long.h: *
-#rec_long.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_long.h: *                                         and edit IJB, correctly.
-#rec_long.h: *
-#rec_long.h: * Revisions   :
-#rec_long.h: *    $Log: contrib.sh,v $
-#rec_long.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_long.h: *    name change related issues
-#rec_long.h: *
-#rec_long.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_long.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_long.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_long.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_long.h: *    corrupted).  This script will expand all files needed to create the
-#rec_long.h: *    linked list modules and an example program.  Please see the README.
-#rec_long.h: *    Feed back is welcomed.  Enjoy.
-#rec_long.h: *
-#rec_long.h: *
-#rec_long.h: *********************************************************************/
-#rec_long.h:\f
-#rec_long.h:
-#rec_long.h:#ifdef __cplusplus
-#rec_long.h:extern "C" {
-#rec_long.h:#endif
-#rec_long.h:
-#rec_long.h:
-#rec_long.h:struct derived_rec_long
-#rec_long.h:{
-#rec_long.h:   /* private: */
-#rec_long.h:   struct gen_list_rec parent_rec;
-#rec_long.h:   long contents;
-#rec_long.h:};
-#rec_long.h:
-#rec_long.h:/* public: */
-#rec_long.h:extern struct derived_rec_long *   derived_rec_long_construct( const long _contents );
-#rec_long.h:extern struct derived_rec_long *   derived_rec_long_copy_construct( const struct derived_rec_long *this_rec );
-#rec_long.h:extern struct derived_rec_long *   derived_rec_long_destruct( struct derived_rec_long *this_rec );
-#rec_long.h:extern const struct derived_rec_long *derived_rec_long_stream( const struct derived_rec_long *this_rec );
-#rec_long.h:extern int                                                         derived_rec_long_equal( const struct derived_rec_long *this_rec, const struct derived_rec_long *eq_rec );
-#rec_long.h:
-#rec_long.h:/* struct/class COMPLETE */
-#rec_long.h:
-#rec_long.h:
-#rec_long.h:#ifdef __cplusplus
-#rec_long.h:} /* extern "C" */
-#rec_long.h:#endif
-#rec_long.h:
-#rec_long.h:#endif /* ndef REC_LONG_H_INCLUDED */
-#rec_long.h:
-#rec_long.h:/*
-#rec_long.h:  Local Variables:
-#rec_long.h:  tab-width: 3
-#rec_long.h:  end:
-#rec_long.h:*/
-
-
-#rec_malloc_police.c:const char rec_malloc_police_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_malloc_police.c: *                                                This class helps to build a list of allocated and
-#rec_malloc_police.c: *                                                freed memory.  When the program exits, we will print
-#rec_malloc_police.c: *                                                a list of all memory that was allocated, but never
-#rec_malloc_police.c: *                                                freed.  This could be most helpful to developers
-#rec_malloc_police.c: *                                                and debugers.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_malloc_police.c: *                Privoxy team. http://www.privoxy.org/
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *                This program is free software; you can redistribute it
-#rec_malloc_police.c: *                and/or modify it under the terms of the GNU General
-#rec_malloc_police.c: *                Public License as published by the Free Software
-#rec_malloc_police.c: *                Foundation; either version 2 of the License, or (at
-#rec_malloc_police.c: *                your option) any later version.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *                This program is distributed in the hope that it will
-#rec_malloc_police.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_malloc_police.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_malloc_police.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_malloc_police.c: *                License for more details.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *                The GNU General Public License should be included with
-#rec_malloc_police.c: *                this file.  If not, you can view it at
-#rec_malloc_police.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_malloc_police.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_malloc_police.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * VI users               :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_malloc_police.c: *                                                and edit IJB, correctly.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Revisions   :
-#rec_malloc_police.c: *    $Log: contrib.sh,v $
-#rec_malloc_police.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_malloc_police.c: *    name change related issues
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_malloc_police.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_malloc_police.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_malloc_police.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_malloc_police.c: *    corrupted).  This script will expand all files needed to create the
-#rec_malloc_police.c: *    linked list modules and an example program.  Please see the README.
-#rec_malloc_police.c: *    Feed back is welcomed.  Enjoy.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:\f
-#rec_malloc_police.c:
-#rec_malloc_police.c:#include <stdio.h>
-#rec_malloc_police.c:
-#rec_malloc_police.c:#include "gen_list.h"
-#rec_malloc_police.c:#include "malloc_police.h"
-#rec_malloc_police.c:#include "rec_malloc_police.h"
-#rec_malloc_police.c:
-#rec_malloc_police.c:const char rec_malloc_police_h_rcs[] = REC_MALLOC_POLICE_H_VERSION;
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:static const rec_method rec_malloc_police_vtable[] =
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_copy_construct,
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_destruct,
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_stream,
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_equal
-#rec_malloc_police.c:};
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_construct
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  A simple derived record class that contains 1 string.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  The record
-#rec_malloc_police.c: *          2  :  The string to contain.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  A pointer to the constructed record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_construct( void *_alloced_addr, char *_source_where, size_t _sz )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  struct derived_rec_malloc_police *this_rec;
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  this_rec = (struct derived_rec_malloc_police *)gen_list_rec_construct(
-#rec_malloc_police.c:          ISA_MALLOC_POLICE,
-#rec_malloc_police.c:          sizeof( struct derived_rec_malloc_police ),
-#rec_malloc_police.c:          rec_malloc_police_vtable
-#rec_malloc_police.c:  );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  this_rec->alloced_addr  = _alloced_addr;
-#rec_malloc_police.c:  this_rec->source_where  = STRDUP( _source_where );
-#rec_malloc_police.c:  this_rec->sz                            = _sz;
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec\t\t\t\t\t= %p */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec alloced_addr = %p */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec source_where = %s */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec sz\t\t\t\t\t= %ld\n\n", */
-#rec_malloc_police.c:/*                          (const void *)this_rec, */
-#rec_malloc_police.c:/*                          this_rec->alloced_addr, */
-#rec_malloc_police.c:/*                          this_rec->source_where, */
-#rec_malloc_police.c:/*                          this_rec->sz */
-#rec_malloc_police.c:/*        ) ); */
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  return( this_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_copy_construct
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Copies one malloc_police record to another.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  Existing record.
-#rec_malloc_police.c: *                                2       :  Copy record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  The newly constructed copy record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_copy_construct( const struct derived_rec_malloc_police *this_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  int len;
-#rec_malloc_police.c:  char *new_contents;
-#rec_malloc_police.c:  struct derived_rec_malloc_police *copy_rec;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  copy_rec = (struct derived_rec_malloc_police *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  copy_rec->alloced_addr  = this_rec->alloced_addr;
-#rec_malloc_police.c:  copy_rec->source_where  = STRDUP( this_rec->source_where );
-#rec_malloc_police.c:  copy_rec->sz                            = this_rec->sz;
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec = %p => %p */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec alloced_addr = %p */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec source_where = %s */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec sz\t\t\t\t\t= %ld\n\n", */
-#rec_malloc_police.c:/*                          (const void *)this_rec, (const void *)copy_rec, */
-#rec_malloc_police.c:/*                          copy_rec->alloced_addr, */
-#rec_malloc_police.c:/*                          copy_rec->source_where, */
-#rec_malloc_police.c:/*                          copy_rec->sz */
-#rec_malloc_police.c:/*        ) ); */
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  return( copy_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_destruct      
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Destruct the malloc_police record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  The record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  NULL
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_destruct( struct derived_rec_malloc_police *this_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  struct derived_rec_malloc_police *d;
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec\t\t\t\t\t\t= %p */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->alloced_addr\t= %p */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->source_where\t= %s, */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->sz\t\t\t\t\t= %ld\n\n", */
-#rec_malloc_police.c:/*                          (const void *)this_rec, */
-#rec_malloc_police.c:/*                          this_rec->alloced_addr, */
-#rec_malloc_police.c:/*                          this_rec->source_where, */
-#rec_malloc_police.c:/*                          this_rec->sz */
-#rec_malloc_police.c:/*        ) ); */
-#rec_malloc_police.c:
-#rec_malloc_police.c:  memset( this_rec->source_where, '!', strlen( this_rec->source_where ) );
-#rec_malloc_police.c:  FREE( this_rec->source_where );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  d = (struct derived_rec_malloc_police *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec );
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  return( d );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_stream
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Displays all malloc_police attributes on the STDOUT stream.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  The record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  The record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:const struct derived_rec_malloc_police *derived_rec_malloc_police_stream( const struct derived_rec_malloc_police *this_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  this_rec = (struct derived_rec_malloc_police *)gen_list_rec_stream(
-#rec_malloc_police.c:          (struct gen_list_rec *)this_rec
-#rec_malloc_police.c:  );
-#rec_malloc_police.c:  LIST_SHOW( printf( "\
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec\t\t\t\t\t= %p
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec->alloced_addr\t= %p
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec->source_where\t= %s
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec->sz\t\t\t\t= %ld\n\n",
-#rec_malloc_police.c:                                                   (const void *)this_rec,
-#rec_malloc_police.c:                                                   this_rec->alloced_addr,
-#rec_malloc_police.c:                                                   this_rec->source_where,
-#rec_malloc_police.c:                                                   this_rec->sz
-#rec_malloc_police.c:  ) );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:  return( this_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_equal
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Compares two malloc_police records to see if they are equal.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  A record.
-#rec_malloc_police.c: *          2  :  Another record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:int derived_rec_malloc_police_equal( const struct derived_rec_malloc_police *this_rec, const struct derived_rec_malloc_police *eq_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_malloc_police.c:  {
-#rec_malloc_police.c:          return( 0 );
-#rec_malloc_police.c:  }
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:  return( this_rec->alloced_addr == eq_rec->alloced_addr );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-
-
-#rec_malloc_police.h:#ifndef REC_MALLOC_POLICE_H_INCLUDED
-#rec_malloc_police.h:#define REC_MALLOC_POLICE_H_INCLUDED
-#rec_malloc_police.h:#define REC_MALLOC_POLICE_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_malloc_police.h:/*********************************************************************
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_malloc_police.h: *                                                This class helps to build a list of allocated and
-#rec_malloc_police.h: *                                                freed memory.  When the program exits, we will print
-#rec_malloc_police.h: *                                                a list of all memory that was allocated, but never
-#rec_malloc_police.h: *                                                freed.  This could be most helpful to developers
-#rec_malloc_police.h: *                                                and debugers.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_malloc_police.h: *                Privoxy team. http://www.privoxy.org/
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *                This program is free software; you can redistribute it
-#rec_malloc_police.h: *                and/or modify it under the terms of the GNU General
-#rec_malloc_police.h: *                Public License as published by the Free Software
-#rec_malloc_police.h: *                Foundation; either version 2 of the License, or (at
-#rec_malloc_police.h: *                your option) any later version.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *                This program is distributed in the hope that it will
-#rec_malloc_police.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_malloc_police.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_malloc_police.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_malloc_police.h: *                License for more details.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *                The GNU General Public License should be included with
-#rec_malloc_police.h: *                this file.  If not, you can view it at
-#rec_malloc_police.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_malloc_police.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_malloc_police.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * VI users               :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_malloc_police.h: *                                                and edit IJB, correctly.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * Revisions   :
-#rec_malloc_police.h: *    $Log: contrib.sh,v $
-#rec_malloc_police.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_malloc_police.h: *    name change related issues
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_malloc_police.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_malloc_police.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_malloc_police.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_malloc_police.h: *    corrupted).  This script will expand all files needed to create the
-#rec_malloc_police.h: *    linked list modules and an example program.  Please see the README.
-#rec_malloc_police.h: *    Feed back is welcomed.  Enjoy.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *********************************************************************/
-#rec_malloc_police.h:\f
-#rec_malloc_police.h:
-#rec_malloc_police.h:#ifdef __cplusplus
-#rec_malloc_police.h:extern "C" {
-#rec_malloc_police.h:#endif
-#rec_malloc_police.h:
-#rec_malloc_police.h:
-#rec_malloc_police.h:struct derived_rec_malloc_police
-#rec_malloc_police.h:{
-#rec_malloc_police.h:  /* private: */
-#rec_malloc_police.h:  struct  gen_list_rec parent_rec;
-#rec_malloc_police.h:  void            *alloced_addr;
-#rec_malloc_police.h:  char            *source_where;
-#rec_malloc_police.h:  size_t  sz;
-#rec_malloc_police.h:};
-#rec_malloc_police.h:
-#rec_malloc_police.h:/* public: */
-#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_construct( void *_alloced_addr, char *_source_where, size_t _sz );
-#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_copy_construct( const struct derived_rec_malloc_police *this_rec );
-#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_destruct( struct derived_rec_malloc_police *this_rec );
-#rec_malloc_police.h:extern const struct derived_rec_malloc_police *derived_rec_malloc_police_stream( const struct derived_rec_malloc_police *this_rec );
-#rec_malloc_police.h:extern int                                                                                        derived_rec_malloc_police_equal( const struct derived_rec_malloc_police *this_rec, const struct derived_rec_malloc_police *eq_rec );
-#rec_malloc_police.h:
-#rec_malloc_police.h:/* struct/class COMPLETE */
-#rec_malloc_police.h:
-#rec_malloc_police.h:
-#rec_malloc_police.h:#ifdef __cplusplus
-#rec_malloc_police.h:} /* extern "C" */
-#rec_malloc_police.h:#endif
-#rec_malloc_police.h:
-#rec_malloc_police.h:
-#rec_malloc_police.h:#endif /* ndef REC_MALLOC_POLICE_H_INCLUDED */
-#rec_malloc_police.h:
-#rec_malloc_police.h:/*
-#rec_malloc_police.h:  Local Variables:
-#rec_malloc_police.h:  tab-width: 3
-#rec_malloc_police.h:  end:
-#rec_malloc_police.h:*/
-
-
-###########################################################################
-##  Description:                       makeInsertableFile
-##             Use this function to make a file suitable for insertion into this
-##             script.  This file (x), will contain all of the files listed.
-##
-##  Inputs :
-##             None
-##
-##  Outputs :
-##             Return status:  (0) - Everything is Okay, anything else is an error
-###########################################################################
-
-function makeInsertableFile {
-
-       rm -f x
-
-       for i in ${fileList}; do
-               sed -e "s/^/#${i}:/" ${i} >> x
-               echo "" >> x
-               echo "" >> x
-       done
-
-       return 0
-
-}
-
-
-#
-#Local Variables:
-#tab-width: 3
-#end:
-#
index b28dd6a..4568ea8 100644 (file)
--- a/cygwin.h
+++ b/cygwin.h
@@ -1,16 +1,16 @@
-#ifndef CYGWIN_H_INCLUDED
-#define CYGWIN_H_INCLUDED
-#define CYGWIN_H_VERSION "$Id: cygwin.h,v 1.3 2002/03/24 13:25:43 swa Exp $"
+#ifndef _CYGWIN_H
+#define _CYGWIN_H
+#define CYGWIN_H_VERSION "$Id: cygwin.h,v 1.1 2001/05/13 21:57:06 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/cygwin.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/cygwin.h,v $
  *
  * Purpose     :  The windows.h file seems to be a *tad* different, so I
  *                will bridge the gaps here.  Perhaps I should convert the
  *                latest SDK too?  Shudder, I think not.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: cygwin.h,v $
- *    Revision 1.3  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:58:51  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 
@@ -63,7 +53,7 @@
  */
 
 #endif /* def __MINGW32__ */
-#endif /* ndef CYGWIN_H_INCLUDED */
+#endif /* ndef _CYGWIN_H */
 
 
 /*
index 94311d4..637743b 100644 (file)
@@ -1,4 +1,4 @@
-const char deanimate_rcs[] = "$Id: deanimate.c,v 1.10 2002/03/24 13:25:43 swa Exp $";
+const char deanimate_rcs[] = "$Id: deanimate.c,v 1.3 2001/07/15 13:57:50 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/deanimate.c,v $
@@ -10,7 +10,7 @@ const char deanimate_rcs[] = "$Id: deanimate.c,v 1.10 2002/03/24 13:25:43 swa Ex
  *                gif_extract_image
  *
  * Copyright   :  Written by and Copyright (C) 2001 by the the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the GIF file format specification (see
  *                http://tronche.com/computer-graphics/gif/gif89a.html)
@@ -37,31 +37,6 @@ const char deanimate_rcs[] = "$Id: deanimate.c,v 1.10 2002/03/24 13:25:43 swa Ex
  *
  * Revisions   :
  *    $Log: deanimate.c,v $
- *    Revision 1.10  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.9  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.8  2002/03/09 19:42:47  jongfoster
- *    Fixing more warnings
- *
- *    Revision 1.7  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.6  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.5  2001/09/10 10:16:06  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.4  2001/07/18 12:28:49  oes
- *    - Added feature for extracting the first frame
- *      to gif_deanimate
- *    - Separated image buffer extension into buf_extend
- *    - Extended gif deanimation to GIF87a (untested!)
- *    - Cosmetics
- *
  *    Revision 1.3  2001/07/15 13:57:50  jongfoster
  *    Adding #includes string.h and miscutil.h
  *
@@ -115,7 +90,7 @@ void buf_free(struct binbuffer *buf)
  *
  * Description :  Ensure that a given binbuffer can hold a given amount
  *                of bytes, by reallocating its buffer if necessary.
- *                Allocate new mem in chunks of 1024 bytes, so we don't
+ *                Allocate new mem in chunks of 1000 bytes, so we don't
  *                have to realloc() too often.
  *
  * Parameters  :
@@ -126,13 +101,13 @@ void buf_free(struct binbuffer *buf)
  * Returns     :  0 on success, 1 on failiure.
  *
  *********************************************************************/
-int buf_extend(struct binbuffer *buf, size_t length)
+int buf_extend(struct binbuffer *buf, int length)
 {
    char *newbuf;
 
    if (buf->offset + length > buf->size)
    {
-      buf->size = ((buf->size + length + (size_t)1023) & ~(size_t)1023);
+      buf->size = buf->size + length + 1000 - (buf->size + length) % 1000;
       newbuf = (char *)realloc(buf->buffer, buf->size);
 
       if (newbuf == NULL)
@@ -167,7 +142,7 @@ int buf_extend(struct binbuffer *buf, size_t length)
  * Returns     :  0 on success, 1 on failiure.
  *
  *********************************************************************/
-int buf_copy(struct binbuffer *src, struct binbuffer *dst, size_t length)
+int buf_copy(struct binbuffer *src, struct binbuffer *dst, int length)
 {
 
    /*
@@ -213,7 +188,7 @@ int buf_copy(struct binbuffer *src, struct binbuffer *dst, size_t length)
  * Returns     :  The byte on success, or 0 on failiure
  *
  *********************************************************************/
-unsigned char buf_getbyte(struct binbuffer *src, size_t offset)
+unsigned char buf_getbyte(struct binbuffer *src, int offset)
 {
    if (src->offset + offset < src->size)
    {
@@ -251,7 +226,7 @@ int gif_skip_data_block(struct binbuffer *buf)
     * by a one-byte length field, with the last chunk having
     * zero length.
     */
-   while((c = buf_getbyte(buf, 0)) != '\0')
+   while(c = buf_getbyte(buf, 0))
    {
       if ((buf->offset += c + 1) >= buf->size - 1)
       {
@@ -299,7 +274,7 @@ int gif_extract_image(struct binbuffer *src, struct binbuffer *dst)
     */
    if (c & 0x80)
    {
-      if (buf_copy(src, dst, (size_t) 3 * (1 << ((c & 0x07) + 1))))
+      if (buf_copy(src, dst, 3 * (1 << ((c & 0x07) + 1))))
       {
          return 1;
       }           
@@ -309,9 +284,9 @@ int gif_extract_image(struct binbuffer *src, struct binbuffer *dst)
    /*
     * Copy the image chunk by chunk.
     */
-   while((c = buf_getbyte(src, 0)) != '\0')
+   while(c = buf_getbyte(src, 0))
    {
-      if (buf_copy(src, dst, 1 + (size_t) c)) return 1;
+      if (buf_copy(src, dst, c + 1)) return 1;
    }
    if (buf_copy(src, dst, 1)) return 1;
 
@@ -378,7 +353,7 @@ int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_im
     */
    if(c & 0x80)
    {
-      if (buf_copy(src, dst, (size_t) 3 * (1 << ((c & 0x07) + 1))))
+      if (buf_copy(src, dst, 3 * (1 << ((c & 0x07) + 1))))
       {
          return 1;
       }
index ede9847..ba5b0a6 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef DEANIMATE_H_INCLUDED
-#define DEANIMATE_H_INCLUDED
-#define DEANIMATE_H_VERSION "$Id: deanimate.h,v 1.7 2002/03/24 13:25:43 swa Exp $"
+#ifndef _DEANIMATE_H
+#define _DEANIMATE_H
+#define DEANIMATE_H_VERSION "$Id: deanimate.h,v 1.2 2001/07/13 13:46:20 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/deanimate.h,v $
@@ -11,7 +11,7 @@
  *                
  *
  * Copyright   :  Written by and Copyright (C) 2001 Andreas S. Oesterhelt
- *                for the Privoxy team. http://www.privoxy.org/
+ *                for the SourceForge IJBSWA team. http://ijbswa.sourceforge.net
  *
  *                Based on ideas from the Image::DeAnim Perl module by
  *                Ken MacFarlane, <ksm+cpan@universal.dca.net>
  *
  * Revisions   :
  *    $Log: deanimate.h,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.5  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.4  2001/07/29 18:50:04  jongfoster
- *    Fixing "extern C" block, and renaming #define _DEANIMATE_H
- *
- *    Revision 1.3  2001/07/18 12:29:05  oes
- *    Updated prototype for gif_deanimate
- *
  *    Revision 1.2  2001/07/13 13:46:20  oes
  *    Introduced GIF deanimation feature
  *
  *********************************************************************/
 \f
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
  * A struct that holds a buffer, a read/write offset,
  * and the buffer's capacity.
@@ -73,8 +54,8 @@ extern "C" {
 struct binbuffer
 {
    char *buffer; 
-   size_t offset;   
-   size_t size;    
+   int offset;   
+   int size;    
 };
 
 /*
@@ -93,7 +74,7 @@ extern const char deanimate_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef DEANIMATE_H_INCLUDED */
+#endif /* ndef _DEANIMATE_H */
 
 /*
   Local Variables:
diff --git a/default.filter b/default.filter
deleted file mode 100644 (file)
index 728a718..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-# ********************************************************************
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/default.filter,v $
-# 
-#  $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $
-#
-#  Purpose     :  Rules to process the content of web pages
-# 
-#  Copyright   :  Written by and Copyright
-#                 Privoxy team. http://www.privoxy.org/
-#
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-#
-# We value your feedback. However, to provide you with the best support,
-# please note:
-#  
-#  * Use the support forum to get help:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118
-#  * Submit bugs only thru our bug forum:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 
-#    Make sure that the bug has not already been submitted. Please try
-#    to verify that it is a Junkbuster bug, and not a browser or site
-#    bug first. If you are using your own custom configuration, please
-#    try the stock configs to see if the problem is a configuration
-#    related bug. And if not using the latest development snapshot,
-#    please try the latest one. Or even better, CVS sources.
-#  * Submit feature requests only thru our feature request forum:
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-#      
-# For any other issues, feel free to use the mailing lists:
-# http://sourceforge.net/mail/?group_id=11118
-#    
-# Anyone interested in actively participating in development and related
-# discussions can join the appropriate mailing list here:
-# http://sourceforge.net/mail/?group_id=11118. Archives are available
-# here too.
-# 
-#################################################################################
-#
-# Syntax:
-#
-# Filters start with a line "FILTER: name description". They are then referrable
-# from the actionsfile with +filter{name}
-#
-# Inside the filters, write one Perl-Style substitution (job) per line.
-# Jobs that precede the first FILTER: line are ignored.
-#
-# For Details see the pcrs manpage contained in this distribution.
-# (and the perlre, perlop and pcre manpages)
-#
-# Note that you are free to choose the delimter as you see fit.
-#
-# Note2: In addidion to the Perl options gimsx, the following nonstandard
-# options are supported:
-# 
-# 'U' turns the default to ungreedy matching.  Add ? to quantifiers to
-#     switch back to greedy.
-# 'T' (trivial) prevents parsing for backreferences in the substitute.
-#     Use if you want to include text like '$&' in your substitute without
-#     quoting.
-# 
-#################################################################################
-
-
-#################################################################################
-#
-# html-annoyances: Get rid of particularly annoying HTML abuse
-#
-#################################################################################
-FILTER: html-annoyances Get rid of particularly annoying HTML abuse
-
-# New browser windows (if allowed -- see no-popups filter below) should be
-# resizeable and have a location and status bar
-#
-s/(<a\s+href[^>]+)resizable=['"]?(no|0|false)['"]?(.*>)/$1resizable=1$3/igU 
-s/(<a\s+href[^>]+)location=['"]?(no|0)['"]?(.*>)/$1location=1$3/igU 
-s/(<a\s+href[^>]+)status=['"]?(no|0)['"]?(.*>)/$1status=1$3/igU
-s/(<a\s+href[^>]+)scrolling=['"]?(no|0|auto)['"]?(.*>)/$1scrolling=no$3/igU
-s/(<a\s+href[^>]+)menubar=['"]?(no|0)['"]?(.*>)/$1menubar=1$3/igU
-
-# The <BLINK> tag was a crime!
-#
-s*<blink>|</blink>**ig
-
-# Is this evil? 
-#
-#s/margin(height|width)=[0-9]*//gi
-#s/noresize/yesresize/igU
-
-
-#################################################################################
-#
-# js-annoyances: Get rid of particularly annoying JavaScript abuse
-#
-#################################################################################
-FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
-
-# Get rid of Javascript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
-#
-s|(<script.*)document\.referrer(.*</script>)|$1"Not Your Business!"$2|Usg
-
-# The status bar is for displaying link targets, not pointless blahblah
-#
-s/status='.*?';*//ig
-
-# Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
-#
-s/(<body .*)onunload(.*>)/$1never$2/iU
-
-
-#################################################################################
-#
-# content-cookies: Kill cookies that come in the HTML or JS content
-#
-#################################################################################
-FILTER: content-cookies Kill cookies that come in the HTML or JS content
-
-# JS cookies, like found on privacy.net:
-#
-s|(document\.cookie)([ \t\r\n]*=)|documenZapCooky$2|g
-
-# HTML cookies:
-#
-s|<meta\s+http-equiv=['"]?set-cookie['"]?\s+content=[^>].*>|<!--no cookies here -->|iUT  
-
-
-##################################################################################
-#
-# no-popups: Kill all popups in JS and HTML
-#
-#################################################################################
-FILTER: no-popups Kill all popups in JS and HTML
-
-s/window\.open\(/1;''\.concat\(/ig           # JavaScript
-s/target=['"]?_blank['"]?/target_crunched/ig # HTML
-s/target=['"]?_new['"]?/target_crunched/ig   # HTML
-
-#################################################################################
-#
-# frameset-borders: Give frames a border and make them resizable
-#
-#################################################################################
-FILTER: frameset-borders Give frames a border and make them resizable
-
-s/(<frameset [^>]+)framespacing=['"]?(no|0)['"]?(.*>)/$1$3/igU
-s/(<frameset [^>]+)frameborder=['"]?(no|0)['"]?(.*>)/$1$3/igU
-s/(<frame [^>]+)border=['"]?(no|0)['"]?(.*>)/$1$3/igU
-s/(<frame [^>]+)resizable=['"]?(no|0|false)['"]?(.*>)/$1$3/igU 
-
-#################################################################################
-#
-# webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
-#
-#################################################################################
-FILTER: webbugs Squish WebBugs (1x1 invisible GIFs used for user tracking)
-
-s/<img\s+[^>]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\s*['"]?1(\D[^>]*?)?>/<!-- Squished WebBug -->/sig
-
-
-#################################################################################
-#
-# no-refresh: Kill automatic refresh tags (for dial-on-demand setups)
-#
-#################################################################################
-FILTER: no-refresh Kill automatic refresh tags (for dial-on-demand setups)
-
-s/<meta\s+http-equiv=['"]?refresh['"]?\s+content=['"]?[0-9]*;\s+url=([^>]*)['"]?>/<link rev="x-refresh" href=$1>/iU   
-s/<meta\s+http-equiv=['"]?page-enter['"]?\s+content=[^>].*>/<!--no page enter for me-->/iU 
-
-
-#################################################################################
-#
-# fun: Text replacements for subversive browsing fun!
-#
-#################################################################################
-FILTER: fun Text replacements for subversive browsing fun!
-
-s/microsoft(?!.com)/MicroSuck/ig
-
-# Buzzword Bingo (example for extended syntax)
-#
-s* industry[ -]leading \
-|  cutting[ -]edge \
-|  award[ -]winning # Comments are OK, too! \
-|  high[ -]performance \
-|  solutions[ -]based \
-|  unmatched \
-|  unparalleled \
-|  unrivalled \
-*<font color=red><b>BINGO!</b></font> \
-*igx
-
-
-#################################################################################
-#
-# nimda: Remove Nimda (virus) code
-#
-#################################################################################
-FILTER: nimda Remove Nimda (virus) code
-
-s%<script language="JavaScript">(window\.open|1;''\.concat)\("readme\.eml", null, "resizable=no,top=6000,left=6000"\)</script>%<br><hr><font size=7><b>Internet J</b></font><b><font size=6>UNK</font><font size=5 color="red"><i>BUSTER</i></font></b><font size=7> WARNING: This Server is infected with <a href="http://www.cert.org/advisories/CA-2001-26.html">Nimda</a>!</font>%g
-
-
-#################################################################################
-#
-# banners-by-size: Kill banners by size
-#
-#################################################################################
-#
-# Standard banner sizes taken from http://www.iab.net/iab_banner_standards/bannersizes.html
-#
-# Note: Use http://config.privoxy.org/send-banner?type=trans for a transparent 1x1 image
-#       Use http://config.privoxy.org/send-banner?type=pattern for a grey/white pattern image
-#       Use http://config.privoxy.org/send-banner?type=auto  to auto-select.
-#
-#################################################################################
-FILTER: banners-by-size Kill banners by size
-
-s|<img\s+[^>]*?(width=['"]?468\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?234\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?88\D)[^>]*(height=['"]?31[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?90[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?600[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?160\D)[^>]*(height=['"]?600[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?125\D)[^>]*(height=['"]?125[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?240[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?180\D)[^>]*(height=['"]?150[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?300\D)[^>]*(height=['"]?250[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?250\D)[^>]*(height=['"]?250[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?240\D)[^>]*(height=['"]?400[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?336\D)[^>]*(height=['"]?280[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-
-# One more. (Where is 200x50 from?)
-#
-s|<img\s+[^>]*?(width=['"]?200\D)[^>]*(height=['"]?50[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-
-
-#################################################################################
-#
-# crude-parental: Crude parental filtering?  (Use along with a suitable blocklist).
-#                 Shows how to deny access to whole page based on a keyword.
-#
-#################################################################################
-#
-# (Note: Middlesex, Sussex and Essex are counties in the UK, not rude words)
-# (Note #2: Is 'sex' a rude word?!)
-#
-#################################################################################
-FILTER: crude-parental Crude parental filtering (demo only)
-
-s%^.*(?<!middle)(?<!sus)(?<!es)sex.*$%<html><head><title>Blocked</title></head><body><h3>Blocked due to possible adult content. Please see <a href="http://dmoz.org/Kids_and_Teens/">this site</a>.</h3></body></html>%is
-s+^.*warez.*$+<html><head><title>No Warez</title></head><body><h3>You're not searching for illegal stuff, are you?</h3></body></html>+is
-
-############################################################################## 
-#
-#  Revisions   :
-#     $Log: default.filter,v $
-#     Revision 1.4  2002/03/26 22:29:54  swa
-#     we have a new homepage!
-#
-#     Revision 1.3  2002/03/24 16:08:03  jongfoster
-#     Fixing banners-by-size for new config URLs
-#
-#     Revision 1.2  2002/03/24 13:02:18  swa
-#     name change related issues.
-#
-#     Revision 1.1  2002/03/24 11:37:39  jongfoster
-#     Name change
-#
-#     Revision 1.24  2002/03/16 20:39:54  oes
-#      - Added descriptions to the filters so users will know what they select in the cgi editor
-#      - Added content-cookies filter
-#      - Bugfixed many jobs (Thanks to Al for some hints)
-#
-#     Revision 1.22  2002/03/12 13:42:50  oes
-#     Fixing & Optimizing REs
-#
-#     Revision 1.21  2002/03/12 11:59:20  oes
-#     Beefed up Buzzword Bingo
-#
-#     Revision 1.20  2002/03/12 01:42:50  oes
-#     Introduced modular filters
-#
-#     Revision 1.19  2002/03/10 19:49:24  oes
-#     Added expression to kill referer tracking in JavaScripts
-#
-#     Revision 1.18  2002/03/08 17:14:12  oes
-#     PNG -> image in comments
-#
-#     Revision 1.17  2002/03/07 03:50:54  oes
-#     Adapted comments to new built-in images
-#
-#     Revision 1.16  2002/02/21 00:12:19  jongfoster
-#     Modifying the banner regexps to use long URLS and to autodetect
-#     whether to show a logo or a transparent GIF, based on actionsfile
-#     setting.
-#
-#     Revision 1.15  2001/12/28 23:54:20  steudten
-#     Fix for feature Req #495374: http-equiv problem
-#
-#     Revision 1.14  2001/12/09 18:55:11  david__schmidt
-#     Updated CODE_STATUS to beta, commented out microsuck line in re_filterfile
-#     for 2.9.10 beta
-#
-#     Revision 1.13  2001/10/13 13:11:20  joergs
-#     Fixed WebBug filter.
-#
-#     Revision 1.12  2001/10/07 15:46:42  oes
-#     Followed Guy's proposal to change the document.cookie job
-#
-#     Revision 1.11  2001/09/21 12:34:00  joergs
-#     Added filter to replace "Nimda" code by a warning.
-#
-#     Revision 1.10  2001/07/20 11:04:26  oes
-#     Added Rodneys javascript cookie filter
-#
-#     Revision 1.9  2001/07/13 14:03:48  oes
-#     Elimiated yet another bug in the banner-by-size jobs. Shame on me!
-#
-#     Revision 1.8  2001/06/29 13:34:00  oes
-#     - Added explanation for U and T options
-#     - Added hint on image replacement by CGI call
-#     - Fixed bug in banner-by-size jobs
-#
-#     Revision 1.7  2001/06/19 14:21:56  oes
-#     Fixed microsuck line
-#
-#     Revision 1.6  2001/06/09 14:01:57  swa
-#     header. cosmetics. default: no messing ala microsuck.
-#
-#
-# 
diff --git a/doc/.gitignore b/doc/.gitignore
deleted file mode 100644 (file)
index 769562f..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-man
-text
diff --git a/doc/STANDARDS.txt b/doc/STANDARDS.txt
new file mode 100644 (file)
index 0000000..c30f8db
--- /dev/null
@@ -0,0 +1,1119 @@
+@ Introduction
+
+
+This set of standards is designed to make our lives easier. It is
+developed with the simple goal of helping us keep the "new and
+improved Junkbusters" consistent and reliable.  Thus making
+maintenance easier and increasing chances of success of the
+project.
+
+And that of course comes back to us as individuals. If we can
+increase our development and product efficiencies then we can
+solve more of the request for changes/improvements and in general 
+feel good about ourselves.  ;->
+
+
+@ Using Comments
+
+
+@@ Comment, Comment, Comment
+
+@@@ Explanation:
+
+Comment as much as possible without commenting the obvious.  For
+example do not comment "aVariable is equal to bVariable".  Instead
+explain why aVariable should be equal to the bVariable.  Just
+because a person can read code does not mean they will understand
+why or what is being done.  A reader may spend a lot more time
+figuring out what is going on when a simple comment or explanation
+would have prevented the extra research.  Please help your brother
+IJB'ers out!
+
+The comments will also help justify the intent of the code.  If the
+comment describes something different than what the code is doing
+then maybe a programming error is occurring.
+
+@@@ Example:
+
+/* if page size greater than 1k ... */
+if ( PageLength() > 1024 )
+{
+    ... "block" the page up ...
+}
+
+/* if page size is small, send it in blocks */
+if ( PageLength() > 1024 )
+{
+    ... "block" the page up ...
+}
+
+This demonstrates 2 cases of "what not to do".  The first is a
+"syntax comment".  The second is a comment that does not fit what
+is actually being done.
+
+
+@@ Use blocks for comments
+
+@@@ Explanation:
+
+Comments can help or they can clutter.  They help when they are
+differentiated from the code they describe.  One line comments do
+not offer effective separation between the comment and the code.
+Block identifiers do, by surrounding the code with a clear,
+definable pattern.
+
+@@@ Example:
+
+/*********************************************************************
+ * This will stand out clearly in your code!
+ *********************************************************************/
+if ( thisVariable == thatVariable )
+{
+   DoSomethingVeryImportant();
+}
+
+
+/* unfortunately, this may not */
+if ( thisVariable == thatVariable )
+{
+   DoSomethingVeryImportant();
+}
+
+
+if ( thisVariable == thatVariable ) /* this may not either */
+{
+   DoSomethingVeryImportant();
+}
+
+@@@ Exception:
+
+If you are trying to add a small logic comment and do not wish to
+"disrubt" the flow of the code, feel free to use a 1 line comment
+which is NOT on the same line as the code.
+
+
+@@ Keep Comments on their own line
+
+@@@ Explanation:
+
+It goes back to the question of readability.  If the comment is on
+the same line as the code it will be harder to read than the
+comment that is on its own line.
+
+There are three exceptions to this rule, which should be violated
+freely and often: during the definition of variables, at the end
+of closing braces, when used to comment parameters.
+
+@@@ Example:
+
+/*********************************************************************
+ * This will stand out clearly in your code,
+ * But the second example won't.
+ *********************************************************************/
+if ( thisVariable == thatVariable )
+{
+   DoSomethingVeryImportant();
+}
+
+if ( thisVariable == thatVariable ) /*can you see me?*/
+{
+   DoSomethingVeryImportant(); /*not easily*/
+}
+
+
+/*********************************************************************
+ * But, the encouraged exceptions:
+ *********************************************************************/
+int urls_read     = 0;     /* # of urls read + rejected */
+int urls_rejected = 0;     /* # of urls rejected */
+
+if ( 1 == X )
+{
+   DoSomethingVeryImportant();
+}
+
+
+short DoSomethingVeryImportant(
+   short firstParam,   /* represents something */
+   short nextParam     /* represents something else */ )
+{
+   ...code here...
+
+}   /* -END- DoSomethingVeryImportant */
+
+
+@@ Comment each logical step
+
+@@@ Explanation:
+
+Logical steps should be commented to help others follow the
+intent of the written code and comments will make the code more
+readable.
+
+If you have 25 lines of code without a comment, you should
+probably go back into it to see where you forgot to put one.
+
+Most "for", "while", "do", etc... loops _probably_ need a
+comment.  After all, these are usually major logic containers.
+
+
+@@ Comment All Functions Thoroughly
+
+@@@ Explanation:
+
+A reader of the code should be able to look at the comments just
+prior to the beginning of a function and discern the reason for
+its existence and the consequences of using it.  The reader
+should not have to read through the code to determine if a given
+function is safe for a desired use.  The proper information
+thoroughly presented at the introduction of a function not only
+saves time for subsequent maintenance or debugging, it more
+importantly aids in code reuse by allowing a user to determine
+the safety and applicability of any function for the problem at
+hand.  As a result of such benefits, all functions should contain
+the information presented in the addendum section of this
+document.
+
+
+@@ Comment at the end of braces if the content is more than one screen length
+
+@@@ Explanation:
+
+Each closing brace should be followed on the same line by a
+comment that describes the origination of the brace if the
+original brace is off of the screen, or otherwise far away from
+the closing brace.  This will simplify the debugging, maintenance,
+and readability of the code.
+
+As a suggestion , use the following flags to make the comment and
+its brace more readable:
+
+use following a closing brace:
+   } /* -END- if() or while () or etc... */
+
+@@@ Example:
+
+if ( 1 == X )
+{
+   DoSomethingVeryImportant();
+   ...some long list of commands...
+} /* -END- if x is 1 */
+
+or:
+
+if ( 1 == X )
+{
+   DoSomethingVeryImportant();
+   ...some long list of commands...
+} /* -END- if ( 1 == X ) */
+
+
+@ Naming Conventions
+
+
+@@ Variable Names
+
+@@@ Explanation:
+
+Seperate words via an underscore ('_').
+
+@@@ Example:
+
+int ms_iis5_hack = 0;
+
+@@@ Instead of:
+
+int msiis5hack = 0;
+int msIis5Hack = 0;
+
+
+@@ Function Names
+
+@@@ Explanation:
+
+Seperate words via an underscore ('_').
+
+@@@ Example:
+
+int load_aclfile( struct client_state *csp )
+
+@@@ Instead of:
+
+int loadaclfile( struct client_state *csp )
+int loadAclFile( struct client_state *csp )
+
+
+@@ Header file prototypes
+
+@@@ Explanation:
+
+Use a descriptive parameter name in the function prototype in
+header files.  Use the same parameter name in the header file
+that you use in the c file.
+
+@@@ Example:
+
+(.h) extern int load_aclfile( struct client_state *csp );
+(.c) int load_aclfile( struct client_state *csp )
+
+@@@ Instead of:
+(.h) extern int load_aclfile( struct client_state * );   or
+(.h) extern int load_aclfile();
+(.c) int load_aclfile( struct client_state *csp )
+
+
+18.  Ennumerations, and #defines
+
+@@@ Explanation:
+
+Use all capital letters, with underscores between words.
+
+@@@ Example:
+
+(enumeration) : enum Boolean { FALSE, TRUE };
+(#define) : #define DEFAULT_SIZE 100;
+
+@@@ Note: We should have a standard naming scheme for Symbols that
+toggle a feature in the precompiler, and the constants used by that
+feature. I'd propose that the toggles should be just one word, with
+a common prefix, and that any depandant constants should be
+prefixed by that word.
+
+The prefix could be WITH_, HAVE_, ENABLE_, FEATURE_ etc.
+
+@@@ Status: I see some this in the code currently!  Anybody "figured"
+out a standard way to do this?
+
+@@@ Example:
+
+#define ENABLE_FORCE 1
+
+#ifdef ENABLE_FORCE
+#define FORCE_PREFIX blah
+#endif /* def ENABLE_FORCE */
+
+
+@@ Constants
+
+@@@ Explanation:
+
+Spell common words out entirely (do not remove vowels).
+
+Use only widely-known domain acronyms and abbreviations.  Capitalize
+all letters of an acronym.
+
+Use underscore (_) to separate adjacent acronyms and
+abbreviations.  Never terminate a name with an underscore.
+
+@@@ Example:
+
+#define USE_IMAGE_LIST 1
+
+@@@ Instead of:
+
+#define USE_IMG_LST 1       or
+#define _USE_IMAGE_LIST 1   or
+#define USE_IMAGE_LIST_ 1   or
+#define use_image_list  1   or
+#define UseImageList    1
+
+
+@ Using Space
+
+
+@@ Put braces on a line by themselves.
+
+@@@ Explanation:
+
+The brace needs to be on a line all by itself, not at the end of
+the statement.  Curly braces should line up with the construct
+that they're associated with.  This practice makes it easier to
+identify the opening and closing braces for a block.
+
+@@@ Example:
+
+if ( this == that )
+{
+   ...
+}
+
+@@@ Instead of:
+
+if ( this == that ) {
+   ...
+}
+
+or
+
+if ( this == that ) { ...  }
+
+@@@ Note: In the special case that the if-statement is inside a loop,
+and it is trivial, i.e. it tests for a condidtion that is obvious
+from the purpose of the block, one-liners as above may optically
+preserve the loop structure and make it easier to read.
+
+@@@ Status: developer-discrection.
+
+@@@ Example exception:
+
+while ( more lines are read )
+{
+   /* Please document what is/is not a comment line here */
+   if ( it's a comment ) continue;
+
+   do_something( line );
+}
+
+
+@@ ALL control statements should have a block
+
+@@@ Explanation:
+
+Using braces to make a block will make your code more readable
+and less prone to error.  All control statements should have a
+block defined.
+
+@@@ Example:
+
+if ( this == that )
+{
+   DoSomething();
+   DoSomethingElse();
+}
+
+@@@ Instead of:
+
+if ( this == that )
+   DoSomething();
+   DoSomethingElse();
+
+or
+
+if ( this == that ) DoSomething();
+
+@@@ Note: The first example in "Instead of" will execute in a manner
+other than that which the developer desired (per indentation).  Using
+code braces would have prevented this "feature".  The "explanation"
+and "exception" from the point above also applies.
+
+
+@@ Do not belabor/blow-up boolean expressions
+
+@@@ Example:
+
+structure->flag = ( condition );
+
+@@@ Instead of:
+
+if ( condition )
+{
+   structure->flag = 1;
+}
+else
+{
+   structure->flag = 0;
+}
+
+@@@ Note: The former is readable and consice.  The later is wordy and
+inefficient.  Please assume that any developer new to the project has
+at least a "good" knowledge of C/C++.  (Hope I do not offend by that
+last comment ... 8-)
+
+
+@@ Use white space freely because it is free
+
+@@@ Explanation:
+
+Make it readable.  The notable exception to using white space
+freely is listed in the next guideline.
+
+@@@ Example:
+
+int firstValue   = 0;
+int someValue    = 0;
+int anotherValue = 0;
+int thisVariable = 0;
+
+if ( thisVariable == thatVariable )
+
+firstValue = oldValue + ( ( someValue - anotherValue ) - whatever )
+
+
+@@ Don't use white space around structure operators
+
+@@@ Explanation:
+
+- structure pointer operator ( "->" ) 
+- member operator ( "." )
+- functions and parentheses
+
+It is a general coding practice to put pointers, references, and
+function parentheses next to names.  With spaces, the connection
+between the object and variable/function name is not as clear.
+
+@@@ Example:
+
+aStruct->aMember;
+aStruct.aMember;
+FunctionName();
+
+@@@ Instead of:
+aStruct -> aMember;
+aStruct .  aMember;
+FunctionName ();
+
+
+@@ Make the last brace of a function stand out
+
+@@@ Example:
+
+int function1( ... )
+{
+   ...code...
+   return( retCode );
+
+}   /* -END- function1 */
+
+
+int function2( ... )
+{
+}   /* -END- function2 */
+
+
+@@@ Instead of:
+
+int function1( ... )
+{
+   ...code...
+   return( retCode );
+}
+int function2( ... )
+{
+}
+
+@@@ Note: Use 1 blank line before the closing brace and 2 lines
+afterwards.  This makes the end of function standout to the most
+casual viewer.  Although function comments help seperate functions,
+this is still a good coding practice.  In fact, I follow these rules
+when using blocks in "for", "while", "do" loops, and long if {}
+statements too.  After all whitespace is free!
+
+@@@ Status: developer-discrection on the number of blank lines.
+Enforced is the end of function comments.
+
+
+@@ Use 3 character indentions
+
+@@@ Explanation:
+
+If some use 8 character TABs and some use 3 character TABs, the code
+can look *very* ragged.  So use 3 character indentions only.  If you
+like to use TABs, pass your code through a filter such as "expand -t3"
+before checking in your code.
+
+@@@ Example:
+
+static const char * const url_code_map[256] =
+{
+   NULL, ...
+};
+
+
+int function1( ... )
+{
+   if ( 1 )
+   {
+      return( ALWAYS_TRUE );
+   }
+   else
+   {
+      return( HOW_DID_YOU_GET_HERE );
+   }
+
+   return( NEVER_GETS_HERE );
+
+}
+
+
+@ Initializing
+
+
+@@ Initialize all variables
+
+@@@ Explanation:
+
+Do not assume that the variables declared will not be used until
+after they have been assigned a value somewhere else in the
+code.  Remove the chance of accidentally using an unassigned
+variable.
+
+@@@ Example:
+
+short anShort = 0;
+float aFloat  = 0;
+struct *ptr = NULL;
+
+@@@ Note: It is much easier to debug a SIGSEGV if the message says
+you are trying to access memory address 00000000 and not
+129FA012; or arrayPtr[20] causes a SIGSEV vs. arrayPtr[0].
+
+@@@ Status: developer-discrection if and only if the variable is
+assigned a value "shortly after" declaration.
+
+
+@ Functions
+
+
+@@ Name functions that return a boolean as a question.
+
+@@@ Explanation:
+
+Value should be phrased as a question that would logically be
+answered as a true or false statement
+
+@@@ Example:
+
+ShouldWeBlockThis();
+ContainsAnImage();
+IsWebPageBlank();
+
+
+@@ Always specify a return type for a function.
+
+@@@ Explanation:
+
+The default return for a function is an int.  To avoid ambiguity,
+create a return for a function when the return has a purpose, and
+create a void return type if the function does not need to return
+anything.
+
+
+@@ Minimize function calls when iterating by using variables
+
+@@@ Explanation:
+
+It is easy to write the following code, and a clear argument can
+be made that the code is easy to understand:
+
+@@@ Example:
+
+for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ )
+{
+   ....
+}
+
+@@@ Note: Unfortunately, this makes a function call for each and every
+iteration.  This increases the overhead in the program, because the
+compiler has to look up the function each time, call it, and return a
+value.  Depending on what occurs in the blockListLength() call, it
+might even be creating and destroying structures with each iteration,
+even though in each case it is comparing "cnt" to the same value, over
+and over.  Remember too - even a call to blockListLength() is a
+function call, with the same overhead.
+
+Instead of using a function call during the iterations, assign
+the value to a variable, and evaluate using the variable.
+
+@@@ Example:
+
+size_t len = blockListLength();
+
+for ( size_t cnt = 0; cnt < len; cnt ++ )
+{
+   ....
+}
+
+@@@ Exceptions: if the value of blockListLength() *may* change or could
+*potentially* change, then you must code the function call in the
+for/while loop.
+
+
+@@ Pass and Return by Const Reference
+
+@@@ Explanation:
+
+This allows a developer to define a const pointer and call your
+function.  If your function does not have the const keyword, we
+may not be able to use your function.  Consider strcmp, if it
+were defined as:
+   extern int strcmp( char *s1, char *s2 );
+
+I could then not use it to compare argv's in main:
+   int main( int argc, const char *argv[] )
+   {
+     strcmp( argv[0], "junkbusters" );
+   }
+
+Both these pointers are *const*!  If the c runtime library maintainers
+do it, we should too.
+
+
+@@ Pass and Return by Value
+
+@@@ Explanation:
+
+Most structures cannot fit onto a normal stack entry (i.e. they
+are not 4 bytes or less).  Aka, a function declaration like:
+   int load_aclfile( struct client_state csp )
+
+would not work.  So, to be consistent, we should declare all
+prototypes with "pass by value":
+   int load_aclfile( struct client_state *csp )
+
+
+@@ Use #include <fileName> and #include "fileName" for locals
+
+@@@ Explanation:
+
+Your include statements should contain the file name without a
+path.  The path should be listed in the Makefile, using -I as
+processor directive to search the indicated paths.  An exception
+to this would be for some proprietary software that utilizes a
+partial path to distinguish their header files from system or
+other header files.
+
+@@@ Example:
+
+#include <iostream.h>     /* This is not a local include */
+#include "config.h"       /* This IS a local include */
+
+@@@ Exception:
+
+/* This is not a local include, but requires a path element. */
+#include <sys/fileName.h>
+
+@@@ Note: Please! do not add "-I." to the Makefile without a _very_
+good reason.  This duplicates the #include "file.h" behaviour.
+
+
+@@ Provide multiple inclusion protection
+
+@@@ Explanation:
+
+Prevents compiler and linker errors resulting from redefinition of
+items.
+
+Wrap each header file with the following syntax to prevent multiple
+inclusions of the file.  Of course, replace FILENAME_UPPERCASE with
+your file name, with "." Changed to "_", and make it uppercase.
+
+@@@ Example:
+
+#ifndef _PROJECT_H
+#define _PROJECT_H
+   ...
+#endif /* ndef _PROJECT_H */
+
+
+@@ Where Possible, Use Forward Struct Declaration Instead of Includes
+
+@@@ Explanation:
+
+Useful in headers that include pointers to other struct's.
+Modifications to excess header files may cause needless compiles.
+
+@@@ Example:
+
+/*********************************************************************
+ * We're avoiding an include statement here!
+ *********************************************************************/
+struct file_list;
+extern file_list *xyz;
+
+@@@ Note: If you declare "file_list xyz;" (without the pointer), then
+including the proper header file is necessary.  If you only want to
+prototype a pointer, however, the header file is unneccessary.
+
+@@@ Status: Use with discrection.
+
+
+@ General Coding Practices
+
+
+@@ Provide a default case for all switch statements
+
+@@@ Explanation:
+
+What you think is guaranteed is never really guaranteed.  The value
+that you don't think you need to check is the one that someday will be
+passed.  So, to protect yourself from the unknown, always have a
+default step in a switch statement.
+
+@@@ Example:
+
+switch( hash_string( cmd ) )
+{
+   case hash_actions_file :
+      ... code ...
+      break;
+
+   case hash_confdir :
+      ... code ...
+      break;
+
+   default :
+      log_error( ... );
+      ... anomly code goes here ...
+      continue; / break; / exit( 1 ); / etc ...
+
+} /* end switch( hash_string( cmd ) ) */
+
+@@@ Note: If you already have a default condition, you are obviously
+exempt from this point.  Of note, most of the WIN32 code calls
+`DefWindowProc' after the switch statement.  This API call
+*should* be included in a default statement.
+
+@@@ Another Note: This is not so much a readability issue as a robust
+programming issue.  The "anomly code goes here" may be no more than a
+print to the STDERR stream (as in load_config).  Or it may really be
+an ABEND condition.
+
+@@@ Status: Programmer discretion is advised.
+
+
+@@ Try to avoid falling through cases in a switch statement.
+
+@@@ Explanation:
+
+In general, you will want to have a 'break' statement within each
+'case' of a switch statement.  This allows for the code to be more
+readable and understandable, and furthermore can prevent unwanted
+surprises if someone else later gets creative and moves the code
+around.
+
+The language allows you to plan the fall through from one case
+statement to another simply by omitting the break statement within the
+case statement.  This feature does have benefits, but should only be
+used in rare cases.  In general, use a break statement for each case
+statement.
+
+If you choose to allow fall through, you should comment both the fact
+of the fall through and reason why you felt it was necessary.
+
+
+@@ Use 'long' or 'short' Instead of 'int'
+
+@@@ Explanation:
+
+On 32-bit platforms, int usually has the range of long.  On 16-bit
+platforms, int has the range of short.
+
+@@@ Status: open-to-debate.  In the case of most FSF projects
+(including X/GNU-Emacs), there are typedefs to int4, int8, int16, (or
+equivalence ... I forget the exact typedefs now).  Should we add these
+to IJB now that we have a "configure" script?
+
+
+@@ Declare each variable and struct on its own line.
+
+@@@ Explanation:
+
+It can be tempting to declare a series of variables all on one line.
+Don't.
+
+@@@ Example:
+
+long a = 0;
+long b = 0;
+long c = 0;
+
+@@@ Instead of:
+
+long a, b, c;
+
+@@@ Explanation:
+- there is more room for comments on the individual variables
+- easier to add new variables without messing up the original ones
+- when searching on a variable to find its type, there is less
+  clutter to "visually" eliminate
+
+@@@ Exceptions: when you want to declare a bunch of loop variables or
+other trivial variables; feel free to declare them on 1 line.  You
+should, although, provide a good comment on their functions.
+
+@@@ Status: developer-discrection.
+
+
+@@ Use malloc/zalloc sparingly
+
+@@@ Explanation:
+
+Create a local stuct (on the stack) if the variable will live
+and die within the context of one function call.
+
+Only "malloc" a struct (on the heap) if the variable's life will
+extend beyond the context of one function call.
+
+@@@ Example:
+
+If a function creates a struct and stores a pointer to it in a
+list, then it should definately be allocated via `malloc'.
+
+
+@@ The Programmer Who Uses 'malloc' is Responsible for Ensuring 'free'
+
+@@@ Explanation:
+
+If you have to "malloc" an instance, you are responsible for insuring
+that the instance is `free'd, even if the deallocation event falls
+within some other programmer's code.  You are also responsible for
+ensuring that deletion is timely (i.e. not too soon, not too late).
+This is known as "low-coupling" and is a "good thing (tm)".  You may
+need to offer a free/unload/destuctor type function to accomodate
+this.
+
+@@@ Example:
+
+int load_re_filterfile( struct client_state *csp ) { ... }
+static void unload_re_filterfile( void *f ) { ... }
+
+@@@ Exceptions:
+
+The developer cannot be expected to provide `free'ing functions for 
+C run-time library functions ... such as `strdup'.
+
+@@@ Status: developer-discrection.  The "main" use of this standard is
+for allocating and freeing data structures (complex or nested).
+
+
+@@ Add loaders to the `file_list' structure and in order
+
+@@@ Explanation:
+
+I have ordered all of the "blocker" file code to be in alpha
+order.  It is easier to add/read new blockers when you expect a
+certain order.
+
+@@@ Note: It may appear that the alpha order is broken in places by
+POPUP tests coming before PCRS tests.  But since POPUPs can also
+be referred to as KILLPOPUPs, it is clear that it should come
+first.
+
+
+@@ "Uncertain" new code and/or changes to exitinst code, use FIXME
+
+@@@ Explanation:
+
+If you have enough confidence in new code or confidence in your
+changes, but are not *quite* sure of the reprocussions, add this:
+
+/* FIXME: this code has a logic error on platform XYZ,
+ * attempthing to fix
+ */
+#ifdef PLATFORM
+   ...changed code here...
+#endif
+
+or:
+
+/* FIXME: I think the original author really meant this... */
+   ...changed code here...
+
+or:
+
+/* FIXME: new code that *may* break something else... */
+   ...new code here...
+
+@@@ Note: If you make it clear that this may or may not be a "good
+thing (tm)", it will be easier to identify and include in the project
+(or conversly exclude from the project).
+
+
+@ Addendum: Template for files and function comment blocks:
+
+
+@@@ Example for file comments:
+
+const char FILENAME_rcs[] = "$Id: STANDARDS.txt,v 1.3 2001/07/02 01:50:04 iwanttokeepanon Exp $";
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/doc/STANDARDS.txt,v $
+ *
+ * Purpose     :  (Fill me in with a good description!)
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: STANDARDS.txt,v $
+ *    Revision 1.3  2001/07/02 01:50:04  iwanttokeepanon
+ *    A modified STANDARDS.txt file.  I removed my XEmacs test lines (commited in v1.2)
+ *    and made the file Outline-mode compatible.  I used "@" for my header lines instead
+ *    of "*" (which interfered in some C comments).  I also removed the formfeed character
+ *    from the `outline-regexp' variable because it interfered with the "H" file header and
+ *    the "C" file header comments.
+ *
+ *    All of the "stardards points/issues" are still available for discussion, cussing,
+ *    and/or flaming <G>.
+ *
+ *    Revision 1.2  2001/06/28 04:02:42  iwanttokeepanon
+ *    Testing XEmacs and VC/CVS modes.  Will this work?   We shall see...
+ *
+ *    Revision 1.1  2001/06/28 03:01:32  iwanttokeepanon
+ *    A suggested standard for IJB.  Outline-mode formatting and spell checking to follow.  Developer comments encouraged and requested.
+ *
+ *
+ *********************************************************************/
+\f
+
+#include "config.h"
+
+   ...necessary include files for us to do our work...
+
+const char FILENAME_h_rcs[] = FILENAME_H_VERSION;
+
+
+@@@ Note: This declares the rcs variables that should be added to the
+"show-proxy-args" page.  If this is a brand new creation by you, you
+are free to change the "Copyright" section to represent the rights you
+wish to maintain.
+
+@@@ Note: The formfeed character that is present right after the
+comment flower box is handy for (X|GNU)Emacs users to skip the verbige
+and get to the heart of the code (via `forward-page' and
+`backward-page').  Please include it if you can.
+
+@@@ Example for file header comments:
+
+#ifndef _FILENAME_H
+#define _FILENAME_H
+#define FILENAME_H_VERSION "$Id: STANDARDS.txt,v 1.3 2001/07/02 01:50:04 iwanttokeepanon Exp $"
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/doc/STANDARDS.txt,v $
+ *
+ * Purpose     :  (Fill me in with a good description!)
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: STANDARDS.txt,v $
+ *    Revision 1.3  2001/07/02 01:50:04  iwanttokeepanon
+ *    A modified STANDARDS.txt file.  I removed my XEmacs test lines (commited in v1.2)
+ *    and made the file Outline-mode compatible.  I used "@" for my header lines instead
+ *    of "*" (which interfered in some C comments).  I also removed the formfeed character
+ *    from the `outline-regexp' variable because it interfered with the "H" file header and
+ *    the "C" file header comments.
+ *
+ *    All of the "stardards points/issues" are still available for discussion, cussing,
+ *    and/or flaming <G>.
+ *
+ *    Revision 1.2  2001/06/28 04:02:42  iwanttokeepanon
+ *    Testing XEmacs and VC/CVS modes.  Will this work?   We shall see...
+ *
+ *    Revision 1.1  2001/06/28 03:01:32  iwanttokeepanon
+ *    A suggested standard for IJB.  Outline-mode formatting and spell checking to follow.  Developer comments encouraged and requested.
+ *
+ *
+ *********************************************************************/
+\f
+
+#include "project.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+   ... function headers here ...
+
+
+/* Revision control strings from this header and associated .c file */
+extern const char FILENAME_rcs[];
+extern const char FILENAME_h_rcs[];
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* ndef _FILENAME_H */
+
+/*
+  Local Variables:
+  tab-width: 3
+  end:
+*/
+
+
+@@@ Example for function comments:
+
+/*********************************************************************
+ *
+ * Function    :  FUNCTION_NAME
+ *
+ * Description :  (Fill me in with a good description!)
+ *
+ * Parameters  :
+ *          1  :  param1 = pointer to an important thing
+ *          2  :  x      = pointer to something else
+ *
+ * Returns     :  0 => Ok, everything else is an error.
+ *
+ *********************************************************************/
+int FUNCTION_NAME( void *param1, const char *x )
+{
+   ...
+   return( 0 );
+
+}
+
+
+@@@ Note: If we all follow this practice, we should be able to parse
+our code to create a "self-documenting" web page.
+
+
+@ Local variables for this standards file
+
+
+\f
+Local variables:
+mode: outline
+mode: auto-fill
+outline-regexp: "[@]+"
+tab-width: 3
+End:
diff --git a/doc/USER_DOC_IS_WIDELY_OBSOLETED b/doc/USER_DOC_IS_WIDELY_OBSOLETED
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/changes.txt b/doc/changes.txt
new file mode 100644 (file)
index 0000000..6aa1482
--- /dev/null
@@ -0,0 +1,991 @@
+This file contains details of the changes made to JunkBuster, in
+chronological order.  Scroll down to the bottom for the newest 
+additions!
+
+
+*****************************************************************************
+* Copied from old README                                                    *
+*****************************************************************************
+
+README for the Internet Junkbuster Proxy (TM) Copyright 1997-8 Junkbusters Corp.
+
+   Id: README,v 1.1 2001/04/16 21:10:38 rodney Exp 
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 2 of the License,
+   or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+   See the GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+The version of the code with this makefile is Version 2.0.2.
+No CHANGES file is included here; for a history of previous versions see
+   http://www.junkbusters.com/ht/en/ijbdist.html#previous
+This version tightens security over 2.0.1; some multi-user sites will need
+to change the listen-address in the configuration file (see previous URL).
+
+For installation on Windows see http://www.junkbusters.com/ht/en/ijbwin.html
+An executable is provided so you don't need nmake or a C compiler.
+
+For UNIX and other systems see the FAQ. If you just want to test it with its
+defaults of simply stopping cookies and private info, all you need to do now
+on most Unix systems is type make, run junkbuster & and configure your browser.
+
+This directory should contain the following files.  The .html files are also
+in http://www.junkbusters.com/ht/en/ and http://internet.junkbuster.com
+You are welcome to publish copies of the .html files on your local web server,
+according to the GNU General Public License.
+
+gpl.html GNU General Public Licence
+junkbstr.exe   Executable (binary) for Windows 95/NT
+Makefile A very bland Makefile; Most versions of Unix except HP & Suns
+      compile without change. Windows requires the changes indicated.
+ijbman.html Manual for the Internet Junkbuster, HTML format
+junkbuster.1   Manual for the Internet Junkbuster, man macro format:
+         man ./junkbuster.1 # or nroff -man junkbuster.1 | more
+ijbfaq.html FAQ: Frequently Asked Questions on the Internet Junkbuster
+      Includes installation instructions
+junkbstr.ini   Sample configuration file with almost all options commented out
+sblock.ini  Sample blockfile (which doesn't really block much, see FAQ)
+scookie.ini Sample cookiefile (permits little; you decide who to trust)
+saclfile.ini   Sample access control file (block access to everyone)
+sforward.ini   Sample forwardfile (does no fowarding, no gateways, so SOCKS)
+strust.ini  Sample trustfile (has no trusted sites and blocks nothing)
+conn.c, bind.c, encode.c, loaders.c, parsers.c, ssplit.c   Various utilities
+socks4.c Code for SOCKS4 and SOCKS4A gateways
+jcc.c    The main program
+jcc.h    #included declarations etc
+gnu_regex.c, gnu_regex.h:  Regular expression code from the FSF, not us.
+win32.c     A few lines of code specific to the Windows version (95 & NT)
+acl.c    Access controls (new in version 2.0) - doesn't replace firewalls
+filters.c   Strings for the presentation of messages to user
+
+If you find that the Internet Junkbuster improves the quality of your life
+online, we hope you'll visit http://www.junkbusters.com to see how our free
+services can help you bust other kinds of junk out of your life:
+junk mail, spam, telemarketing, and invasions of your private data.
+And please tell your friends about this free product, and help them set it up.
+
+If your company finds this software useful in protecting its confidential
+information and making its people happier and more productive, please consider
+purchasing one of our our commercial support packages:
+   http://www.junkbusters.com/ht/en/ijbfaq.html#commercial
+
+We don't advertise, so please tell others in your community about us.
+
+Junkbusters Corp.    http://www.junkbusters.com
+
+
+*****************************************************************************
+* Copied from old README.too                                                *
+*****************************************************************************
+
+Id: README.TOO,v 1.1 2001/04/16 21:10:38 rodney Exp
+
+This is the README.TOO file for Stefan's version of the Internet
+Junkbuster (from http://www.waldherr.org/junkbuster/).
+
+
+
+Installation:
+-------------
+Install the RPM with the usual command `rpm -Uvh foobar.rpm'. Since we
+run the Junkbuster as user `nobody', cd to a directory where `nobody'
+has read access (in particular NOT /root) and issue (as root)
+
+   /etc/rc.d/init.d/junkbuster start
+
+This will be done automagically for you any time you boot your machine.
+
+
+
+Configuration:
+--------------
+To let Junkbuster take `care' of the ads, you have to setup your
+browser to use the Junkbuster.
+
+  Short instructions for the advanced user:
+
+   Configure Netscape to use 127.0.0.1 on port 8000 as 
+        a proxy server.
+
+  Detailed instructions for the beginner:
+
+        Remove Internet Explorer and install Netscape. No `real' 
+        user would ever use MSIE. Though the Junkbuster works 
+        with IE as well. Read 
+        http://www.junkbusters.com/ht/en/ijbfaq.html#browser
+
+Check to see if the Junkbuster works correctly by surfing to
+
+   http://127.0.0.1/show-proxy-args
+
+or any other place and add the text `/show-proxy-args' to the URL.
+Ok? Then enjoy your ad-free surfing.
+
+
+
+Mailinglists:
+-------------
+In case you are interested in the Junkbuster, there are two
+mailinglists (junkbuster-users and junkbuster-announce). Instructions
+on how to subscribe and unsubscribe are at
+
+   http://www.waldherr.org/junkbuster/
+
+Bugs:
+-----
+Please fill out
+
+   http://sourceforge.net/bugs/?func=addbug&group_id=11118
+
+Patches:
+--------
+Please fill out
+
+   http://sourceforge.net/patch/?func=addpatch&group_id=11118
+
+Need Help?
+----------
+Please fill out
+
+   http://sourceforge.net/support/?func=addsupport&group_id=11118
+
+
+Comments:
+---------
+I would greatly appreciate feedback for this program. Send comments to
+Stefan Waldherr <stefan@waldherr.org> (in either German or English). I
+prefer plain text. If you happen to see an ad which got thru the filter
+PLEASE use the `contribute' form at http://www.waldherr.org/junkbuster/.
+
+Have fun,
+Stefan.
+
+
+*****************************************************************************
+* Copied from old README.win                                                *
+*****************************************************************************
+
+$Id: README.WIN,v 1.1 2001/04/16 21:10:38 rodney Exp $
+
+This is the README.WIN file for the Windows version of the Internet
+Junkbuster (from http://www.waldherr.org/junkbuster/).
+
+Installation:
+-------------
+Congrats, since you are reading this file, you have already unzipped
+the archive correctly.
+
+Start the Junkbuster with `junkbstr' (i.e., click on the icon in the
+ijb subdirectory). If you want to start Junkbuster automatically,
+make a link to the program in the `Autostart' folder.
+
+
+
+Configuration:
+--------------
+To let Junkbuster take `care' of the ads, you have to setup your
+browser to use the Junkbuster.
+
+  Short instructions for the advanced user:
+
+   Configure Netscape to use 127.0.0.1 on port 8000 as 
+        a proxy server.
+
+  Detailed instructions for the beginner:
+
+        Remove Internet Explorer and install Netscape. No `real' 
+        user would ever use MSIE. Though the Junkbuster works 
+        with IE as well. Read 
+        http://www.junkbusters.com/ht/en/ijbfaq.html#browser
+
+Check to see if the Junkbuster works correctly by surfing to
+
+   http://127.0.0.1/show-proxy-args
+
+or any other place and add the text `/show-proxy-args' to the URL.
+Ok? Then enjoy your ad-free surfing.
+
+
+
+Mailinglists:
+-------------
+In case you are interested in the Junkbuster, there are two
+mailinglists (junkbuster-users and junkbuster-announce). Instructions
+on how to subscribe and unsubscribe are at
+
+   http://www.waldherr.org/junkbuster/
+
+Bugs:
+-----
+Please fill out
+
+   http://sourceforge.net/bugs/?func=addbug&group_id=11118
+
+Patches:
+--------
+Please fill out
+
+   http://sourceforge.net/patch/?func=addpatch&group_id=11118
+
+Need Help?
+----------
+Please fill out
+
+   http://sourceforge.net/support/?func=addsupport&group_id=11118
+
+Comments:
+---------
+I would greatly appreciate feedback for this program. Send comments to
+Stefan Waldherr <stefan@waldherr.org> (in either German or English). I
+prefer plain text. If you happen to see an ad which got thru the filter
+PLEASE use the `contribute' form at http://www.waldherr.org/junkbuster/.
+
+Have fun,
+Stefan.
+
+
+*****************************************************************************
+* Copied from old README.re_filter                                          *
+*****************************************************************************
+
+DISCLAIMER:
+   This is pre-alpha code. Using it in any other way
+   than just reading it is a high risk activity and
+   the author disclaims all liability for any damage.
+
+   See the GNU General Public License at
+   http://www.gnu.org/copyleft/gpl.html for details.
+
+
+Dear alpha-Tester,
+
+Thank you for trying out the experimental re_filter feature of
+Junkbuster. As this is still a very early pre-release version,
+and I'm neither much of an autoconf or make wizard, building
+the patched junkbuster involves some manual work, that is 
+described below. Please also see the Request for Thoughts section,
+as the whole point of this pre-release ist to collect ideas for
+improvement and bug reports.
+
+
+INSTALLATION:
+
+  - Get and install pcre from
+    ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
+    Version 3.1 or any later one will do. I recommend 3.4.
+    It *should* install on Win32 as well, but I haven't tried
+    that. Don't forget to run ldconfig afterwards.
+
+  - Now you have two options:
+
+    A) Install pcrs as a shared library:
+       pcrs.c and pcrs.h are included in the (patched) ijb subdirectory.
+       1.) patch Makefile < Makefile.re_shared.diff  
+       2.) gcc -Wall -fPIC -c pcrs.c  
+       3.) gcc -shared -Wl,-soname,libpcrs.so.1 -o libpcrs.so.1.0.1 pcrs.o -lc -lpcre
+       If this worked OK,
+       4.) copy libpcrs.so.1.0.1 to /usr/local/lib
+       5.) ln -s /usr/local/lib/libpcrs.1.0.1 /usr/local/lib/libpcrs.so
+       6.) ldconfig (Or whatever the equivalent on your platform might be)
+       7.) cp pcrs.h /usr/local/include
+
+    OR
+
+    B) Incorporate pcrs into the junkbuster (much easier):
+       Smile and relax. You're done.
+
+  - Edit the provided re_filterfile to suit your needs and place it
+    with the rest of junkbusters configfiles.
+
+  - Now junkbuster should build with a simple 'make'.
+    Note: Setting debug = REF in jcc.c will enable debugging
+    for the re_filter.
+
+  - Include a line "re_filterfile <wherever>" in your junkbuster
+    config file, pointing at the re_filterfile
+
+  - (Optional:) Include a line "re_filter_all" in the config
+    file. This will set the Policy to filter content from all sites.
+    Default is to filter only from sites that you wouldn't send a
+    cookie either. 
+
+  - Fire up junkbuster.
+
+HOW IT WORKS:
+
+    Nah, not tonight anymore ;-)
+
+REQUEST FOR THOUGHTS:
+
+  - The main decision is whether to filter on-the-fly or to buffer
+    up the whole document and then run the filter on it. I've built
+    both versions and currently prefer buffering.
+
+    The advantage of on-the-fly-filtering is obviously that the
+    document begins to display before it's fully loaded. The big
+    disadvantage is that with arbitraty content altering in place,
+    you don't know the size that the document will have after
+    altering when the Content-Length Header is to be sent. Only
+    option is to chew it altogether.
+
+    Apart from preserving the ability to generate a valid Content-Length
+    header (which the patch currently does not yet do), buffering up
+    the document has some advantages from the filtering point of view:
+
+     - Reliability. Patterns in the document cannot be ripped apart
+       and are reliably found. (If you look at the document fragment-wise
+       while it's being transmitted, you miss any pattern that spans
+       a fragment border) This is especially bad for patterns that do
+       serious HTML reformatting, as fragments are typically in the order
+       of 1500 bytes each.
+
+     - Flexibility: The re_filter gives you the choice whether you want
+       to replace only the pattern's first occurance or replace it globally.
+       This becomes meningless with fragments. (Solution possible, though.)
+
+    As the filter only processes objects of MIME type text/*, which are typically
+    rather small compared to binary multimedia (sic) type data, I don't think
+    that the disadvantage of delayed display of the first bytes is really grave.
+
+    What do you think?
+
+  - Is the choice between a radical (filter all) and semi-smart (filter only when
+    also crunching cookies) flexible enough? Should I really introduce yet another
+    configfile for specifying the domains to filter content from? Would anyone use
+    that?
+
+  - Should I use pcre as a shared library and work out a nice installation
+    automagic, or should the relevant functions be incorporated in re_filter.c?
+
+  - Even if yes, do we really want an extension that relies on an external library
+    like pcre?
+
+  - Any bugs, stupid parts in the code ?
+
+  - Cool suggestions for the re_filterfile? (PLEASE!)
+
+  - Should character set translation along the lines of Perl's 'tr' operator
+    be included?
+
+  - Is the whole feature just pathetic?
+
+FEEDBACK:
+
+    A whole lot of work has gone into this feature (the pcrs code was also
+    just written for this) and I'd really like to know if and how you like
+    it. Since I'm more of a perl than C programmer (and after doing so much
+    string manipulation in C I'm once again glad abaout that!), I'm sure there
+    is much to improve. Please send any suggestions/observations/hellos to
+    oes@paradis.rhein.de. I would also be very glad about any assistance for
+    a autoconf/make procedure for prcs.
+
+Well, have fun!
+--Andreas
+
+
+*****************************************************************************
+* Copied from old README.cygwin                                             *
+*****************************************************************************
+
+Id: README.cygwin,v 1.2 2001/04/29 23:16:29 rodney Exp
+
+
+What I did:  I saw too many "personalities" in IJB; so I
+ran the code through a couple of regexp's and then let XEmacs
+reformat the whole shebang!  The results is a uniform
+looking code base; aka. as if 1 person created the whole
+project.
+
+Why I did it:  (1) it is easier to maintain  (2) easier for
+a new person to make changes/additions  (3) it *looks* more
+professional  (4) IMHO, it is easier to read (this is very
+much a personal preference).
+
+What I propose: A IJB standards list be included in the
+distro and all source/patch checkins be checked for
+compliance.  We don't need to be an arse on this point, but
+submitters should make a valiant attempt to support the
+standards.
+
+Note: do not even try to diff my code with another code
+base, you will be overwhelmed.  After all, the regexps did a
+good bit of changing and XEmacs reformatter did a great deal
+more.
+
+One more note: these changes include conditional compilation for
+un?x (namely Linux), cygwin (un?x like compile for WIN32), and
+mingw32 (WIN32 like compilation w/o VC++).  Right now, all seems
+fully functional except cygwin.  The cygwin compile will work,
+but includes code to make it single threaded.  I need to debug
+the fork issues, but that will have to come later.
+
+
+Specific changes to expect:
+
+
+1: I've majorly reworked the Makefiles.  The existing Makefile was
+too *spaghetti* for me!  For one, I eliminated the "-I." from the
+include path (ugly).  Use #include "" for local directory files
+and #include <> for path found files (that's basic even to c).
+
+
+2: In accordance with #1, I changed #include "windows.h" to
+#include <windows.h> and #include <gnu_regex.h> to #include
+"gnu_regex.h".
+
+
+3: As part of my standards suggestions (to come later in this
+file), I added a standard comment block to every function.  There
+were too many functions with *no* comment and about 20 different
+styles to those that did.  This is an example of the block I used:
+/*********************************************************************
+ *
+ * Function    :  block_acl
+ *
+ * Description :  Block this request?
+ *                Decide yes or no based on ACL file.
+ *
+ * Parameters  :
+ *          1  :  src = Address the browser/user agent is requesting.
+ *          2  :  dst = The proxy or gateway address this is going to.
+ *          3  :  csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns     : 0 = FALSE (don't block) and 1 = TRUE (do block)
+ *
+ *********************************************************************/
+
+
+4: Some files prototyped like this:
+      void
+      func(param1)
+      int param1;
+      {
+      }
+and other like this:
+      void func(int param1)
+      {
+      }
+I made all look like the second.
+
+
+5: Made:
+      if(  to be  if (
+      while(  to be  while (
+      switch(  to be switch (
+      etc ...
+The former looks too much like a function call.
+
+
+6: Put braces on their own line and aligned under the
+reserved word:
+      if () {
+      } else {
+      }
+to be:
+      if ()
+      {
+      }
+      else
+      {
+      }
+The same for while, do, etc...
+
+
+7: Casted malloc in several places, e.g.:
+      p = malloc(n);
+to be:
+      p = (char *)malloc(n);
+This eliminates compiler warnings.
+
+
+8: Applied the Perl regexp patch and made it fully conditionally
+compiled (-DPCRS=TRUE).
+
+
+9: It *appears* that if MINGW32 sees a "main" function, it will
+try to link it and start with main (ala console mode).  Since I
+need MINGW32 to find WinMain instead, I conditionally changed
+"main" to "_main" (for MINGW32 only!).
+
+
+10: Changed popup.c to be killpopup.c.  This was necessary to
+clean up the Makefile.  Since there was an ini type file called
+"popup" and "popup.c", make got confused on target names.  No
+other ini file has a .c file with the same name, so I hope this
+isn't a big deal.  Plus, it fits its config variable
+(kill_all_popups) much better.
+
+
+11: Added:
+  /*
+    Local Variables:
+    tab-width: 3
+    end:
+  */
+to all .c and .h files.  I use 3 character tabs and this will make
+the files display correctly in Emacs editors.  This is just my
+default setting.  Perhaps I will filter all files via "expand
+-t3", so not to pi$$ everyone off.  Vi is capable of using 3
+character tabs, as I am sure VC++ would be.
+
+
+12: Several places included regexp code with out "#ifdef REGEX"
+which broke the ability to compile w/o regexp's.  I fixed the code
+and can compile w/o regexp (which I don't normally do, but now I
+*can*).
+
+
+13: In WinMain, changed:
+      pszLastTok = strchr(pszLastTok, ' ');
+to be:
+      pszLastTok = strchr(pszLastTok+1, ' ');
+The former causes an infinite loop with 2 or more parameters.
+
+
+14: Added my own strdup for Cygwin, see jcc.c for why.
+
+
+15: Added defines in the Makefile and this to jcc.h:
+      #define VERSION VERSION_MAJOR "." VERSION_MINOR "." VERSION_POINT
+This makes "update the numbers also in jcc.h manually" unnecessary
+(see your Makefile for this quote).
+
+
+16: Split the "inifiles" target in Makefile into separate targets,
+this way each file can be regenerated individually according to
+the same implicit rule.
+
+
+17: With the Makefile restructure, I can only provide for
+Cygwin/gcc.  Hopefully this is a bit cleaner and others can add
+their compilers w/o re-spaghetting the file.  I have provided
+several makefiles as examples only, I do not intend for the
+project to start maintaining multiple Makefiles.  Perhaps some of
+the platform specific Makefile code could be split out into
+separate files and we could use the "include" directive to read in
+the correct one.
+
+Better than this, let's get a configure.in guru on the project and
+dynamically create the Makefiles!
+
+
+18: In an effort to get this to market (you knew this was coming
+eh?), I am going to put the standards suggestions in another file
+and ship this one as is.  But then, you can probably guess most of
+the standards by the changes you see.
+
+
+19: Added a really quick and dirty "install" target to the
+Makefile.  This needs to be cleaned up and proper directories put
+in for each platform.
+
+
+-- release 1 (obsoleted) --
+
+
+20: Incorporated the TOGGLE and webDAV support patches into my
+Cygwin patch.  I added conditional compilation to both features.
+I changed "extern BOOL g_bToggleIJB;" to be of type "int".  This
+makes jcc.h independent of "windows.h".  The inclusion of such
+should not (and is not) necessary for compilation on all
+platforms.  Besides, BOOL is really only a char or an int anyway!
+
+
+21: Added a new ini!  I modified the usual un?x type config file
+to M$ type ini file for a Perl regexp compile.  This was necessary
+to call EditFile on the Perl regexp config file.  The new ini
+filename is "sregexp.ini" (naturally).  I then added menu items to
+edit the popup.ini and sregexp.ini files.
+
+
+22: I made "dot h" files for all the "dot c" files.  I used this
+command to do the *dirty* work:
+    grep -e "^[A-z]" *.c | sed -e "/=/d" -e "/^[^(]*$/d" \
+         -e "/^extern/d" -e "/^static/d" -e "/;$/d"
+
+And I made each "dot h" file be immune to multiple inclusion via
+conditional compilation.  Ie. the "jcc.h" file will only include
+itself if _JCC_H is undefined.
+
+After this was done, I compiled the project source by source and
+let the compiler tell me what each file was dependent on.  Once I
+got all the objects to compile, I included the new dependencies in
+the Makefiles.
+
+BTW, I intend to get the Makefile to be generated by a configure
+script.  Whether this is a GNU "configure.in" type file or a shell
+script, I do not know.  All I do know is that this is a must for a
+"Go/No go" type decision.  We cannot proceed with the philosophy
+"leave it up to the user to get it to work".
+
+
+23: I broke out the code to load the config file from main.  I put
+this code into a function called load_config.  I made this routine
+be called from a signal "HUP".  This means we can restart
+junkbusters from the command line or from the daemon script via
+"restart" without actually killing it and restarting it.  This is
+common behavior to un?x daemons (see inetd for example).  I fixed
+the junkbusters.init script to take advantage of this.  I intend
+to make a M$ menu complement to this as soon as I can.
+
+
+24: BTW, if you have not already noticed by my postings and/or
+code, I have added patches and made them all conditionally
+compiled.  Ie. #ifdef TOGGLE, #ifdef WEBDAV, #ifdef PCRS, etc...
+I think that all extensions to IJB should be submitted in this
+way.  Not only can you compile IJB to be as "tight" as you want,
+it also gives the user a "smorgasbord" of options to
+choose from.  This is quite common in the free software world (you
+need look no farther than emacs to see this) and provides maximum
+flexibility.
+
+
+25: As promised, I obsoleted the "ijbw32.ini" file.  I was a bit
+confused by the "close-behaviour=1" entry.  It seems to me that it
+duplicated the "close-button-minimizes=1" entry.  And (by looking
+at the code) it was unused.  Anyway, I eliminated the "ijbw32.ini"
+file and assimilated the settings into the config file.  Bye Bye
+"ijbw32.ini", hello "config" (aka. don't unnecessarily duplicate
+files and/or data types).
+
+
+26: Eliminated re_filter.c.  This only defined
+(un)load_re_filterfile and re_process_buffer.  I moved
+(un)load_re_filterfile to loaders.c and re_process_buffer to
+filters.c. I also modified the Makefiles to reflect this.  In the
+doing, I modified the loader and unloader to use the "files"
+variable and moved joblist to "re_filterfile_spec" struct.  I
+added "plist" to the client_state so that all Perl regexp code
+could find the latest parsing of the re_filterfile ini.
+
+This is in keeping with the IJB data structures philosophies.
+
+
+27: Eliminated acl.c.  This (as pcre) only defined
+(un)load_aclfile and block_acl.  I moved (un)load_aclfile to
+loaders.c and block_acl to filters.c.  I also modified the
+Makefiles to reflect this.
+
+
+28: Since I created "dot h" files for all the "dot c" files, I
+eliminated all the "extern ...variable;" and all the "extern
+...function;" statements that I could find in the "dot c" files.
+Instead, I included the proper "dot h" files to do this for us.
+
+
+29: Corrected the "install" Makefile target for un?x.  I will do
+the same for WIN32 targets.
+
+
+30: Note on the "TOGGLE" patch: since I made IJB fully restartable
+via a NOHUP signal; I thought the TOGGLE patch should apply to
+both un?x and WIN32.  Thus, I eliminated the WIN32 dependencies in
+that patch and added "toggle" to the config file.  Now everything
+works fine for either platform.  Still to come is a restart menu
+command in WIN32 (See: note 23).
+
+
+31: Just a possible programmer note, we REALLY need a generic
+linked list module.  Since text lists, client states, filter
+files, etc... implement list creation and destruction over and
+over; I suggest a generic list that can handle *any* type of list
+(ala template classes in C++).  If this module included an
+iterator (of sorts), we could eliminate the myriad of "for ( top=x;
+NULL != x->next; x=x->next )" type statements that are all over
+IJB.
+
+After all, this was taught in the basic "Intro to Data Types"
+class (for all you CS majors).
+
+
+32: Renamed all of the .INI files to be .TXT files.  I did this
+because the .INI files were NOT *really* ini files; which
+potentially be confusing.  I used the .TXT extension to make sure
+that EditFile still worked.
+
+
+33: Removed the "initialed comments", such as "/* swa */".  This
+leads to less readable code (because it becomes fragmented) and
+retains the "multiple personality" syndrome.  Comments such as
+this can always be figured out from the versioning system.  Also,
+these comments really should be pooled in one place : the README
+files.
+
+
+34: Perhaps we should break with the current versioning tactic of 
+a "tail version" and start fresh.  Perhaps a new major version
+release is in order?  Version = 3.0.0?
+
+
+35: Added a "Accept-Encoding: gzip" cruncher.  If a stream is
+compressed via gzip (Netscape specific I think), then it cannot
+be modified with Perl regexps.  So I added this as an option in
+the Makefiles.
+
+
+36: As promised in one of my postings, I have make a
+configure-esk script to generate the Makefiles.  I would still
+like to have a full blown configure.in compatible system, but this 
+will do in the meantime.  Note: this configure script covers
+linux, cygwin, and mingw32.  At this point I do not have VC++ to
+test any of my changes.  But the configure script should be
+flexible enough to handle this platform.
+
+
+--
+
+Please give any feedback to the ijb egroups and, if you feel you
+need quicker contact, CC me at IwantToKeepAnon@yahoo.com
+
+Let me say once more, this has a *lot* of changes and may (aka
+WILL) break a lot of existing patches.  But I hope the "idea" will
+catch on.  Perhaps this could be made the baseline code base and
+other patches added and standardized later.
+
+*****************************************************************************
+* Date:        7 May 2001                                                   *
+* Version:     ??                                                           *
+* Description: Changes for MS Visual C++                                    *
+* Author:      Jon Foster <jon@jon-foster.co.uk>                            *
+*****************************************************************************
+(Based on Stromlund's version 0.20)
+
+I have made several changes to make this compile under VC++ 97, and add new
+features.
+
+Code changes:
+
+1) If you disable IJB (using the TOGGLE patch) it now turns PCRS off.
+2) "Missing function prototype" warnings have been corrected by adding
+   appropriate #include statements
+3) The _DIST_URL define removed and hardcoded.  There are hardcoded URLs all 
+   over the place that need fixing - one more doesn't matter.  We do really 
+   need to come up with a long-term solution though.  (Suggestion: Host a 
+   redirector on the SourceForge web space.  e.g 
+   "http://ijbswa.sourceforge.net/redirect.php?ver=2.0.2-10&target=faq",
+   "http://ijbswa.sourceforge.net/redirect.php?ver=2.0.2-10&target=download",
+   etc.  This allows us to move the pages around easily, and the SourceForge
+   space can be maintained by anyone who's interested, it's not tied to a 
+   particular individual.  This is similar to the approach taken by 
+   Microsoft and Netscape in their browsers.)
+4) New file ijbconfig.h is #included everywhere.  This provides me with a
+   place to define VERSION, PCRS, etc.  You can still define VERSION_xxx
+   on the command line, but the other defines are in the header file.
+   There were just too many #defines - so many that the VC++ 97 IDE 
+   broke when I tried to define them on the command line.  We probably 
+   should fix the configure script so that it modifies this file.
+5) Deleted empty file afxres.h - we needed to use the VC++ system header 
+   file of that name.  However, it's easier to just delete it and put 
+   the relevent #defines in w32res.h.
+6) New #define: NO_PROGRAM_NAME_DISPLAY uses "IJB" as the program name in 
+   the log file instead of "H:\Documents and Settings\Administrator\My 
+   Documents\Prog\VC\ijb2\Release\junkbuter.exe" or similar.  The reason 
+   for this should be obvious!
+7) New #define: STATISTICS enables the statistics feature
+8) Statistics is thread-safe, I think.  However, loading up the
+   statistics page now counts as a blocked request.
+9) New, shorter message if a setting in the config file is recognised 
+   but unsupported by the current build.  It doesn't have "WARNING:" in
+   front of it either.  We may want to actually take this message out 
+   and have it just silently ignore these entries.
+10) New feature: #define SPLIT_PROXY_ARGS and the show-proxy-settings 
+    page will split each file out to a seperate page.  This is 
+    because the files are quite big, and having to do 1 extra click to 
+    get to them is no problem.  This #define also disables the 
+    suppress_blocklists feature (because I believe the original intent 
+    of suppress_blocklists was similar?).  It also saves memory by 
+    reading the config files to generate the HTML on the fly, rather 
+    than storing prepared HTML constantly in memory.
+11) Marked global constants with "const" attribute.  This has a 
+    knock-on effect on pointers in function prototypes, so these have
+    also been marked const where needed.
+12) Rewrote encode.c to have tables pre-initialized, so it can be 
+    marked constant.  Also split into 3 distinct functions so that
+    the tables (which are realy an implementation detail) are not
+    visible outside that file.
+13) Changes to how files are reloaded when you reload the config 
+    file.  Previous method didn't free memory (or if you uncommented 
+    the free() calls, it was not thread-safe.)  It is now handled 
+    automatically - files are reloaded whenever the filename to 
+    read changes, or the file's timestamp changes.  The code in
+    loaders.c which handles this test has been moved to a single
+    utility function.
+14) killpopup changes:
+     * Only compiled if you #define KILLPOPUPS
+     * Call to filter_popups() moved from read_socket() to chat().
+     * Writing 1 past end of buffer bug fixed.
+     * It was scanning the whole buffer even if only partially filled.
+     * Moved load/unload to loaders.c and changed file handling to 
+       follow standard.
+15) Auto-detect whether we want an image or HTML implemented for 
+    Microsoft IE.  :-)
+    There doesn't seem to be a way to tell with the latest build 
+    of Mozilla. :-(
+16) Image file code conditionally compiled.
+17) Provided option (SPLIT_PROXY_ARGS) to split the show-proxy-args
+    page into a main page, and then a page for each config file.  
+    This option will also save memory by loading the files when 
+    required for display, rather than saving them in memory when
+    they are initially loaded.
+18) Force page loading ("noijb.") patch applied.  #define FORCE_LOAD
+
+
+Packaging changes:
+
+1) PCRE 3.4 (less it's test and demo programs) is now included in the 
+   pcre directory.  It will be statically linked with Junkbuster.  (On 
+   win32, DLLs cause a lot of hassle - with a library this small it isn't 
+   worth it.  I don't know if it would be better to dynamically link under
+   UNIX?)
+2) junkbustr.dsp and junkbustr.dsw VC++97 project and workspace files are
+   included.
+3) win32build/junkbustr.exe Win32 binary is included.  It should not require
+   any DLLs.  It was compiled with all features supported.
+4) All README.xyz files put together in this file.
+5) Unused files (acl.c, pthread.c, ...) deleted.
+6) My block & cookie files used (based on the Waldherr ones).
+
+Known bug: The Adobe Acrobat 4 plug-in fails when I try to view PDF files in
+MSIE.  Workaround: disable "web browser integration" in the Adobe Acrobat 
+settings.
+
+*****************************************************************************
+* Date:        14 May 2001 (early morning)                                  *
+* Version:     Reported as 2.9.0                                            *
+* Description: Various updates                                              *
+* Author:      Jon Foster <jon@jon-foster.co.uk>                            *
+*****************************************************************************
+
+1)  Now use PCRE, not GNU REGEX.  I have not yet had chance to check the
+    syntax of the block/image/cookie file to ensure that they match what
+    is expected - however they seem to work.
+2)  Replaced "configure" script with one generated by "autoconf".  Also 
+    use a header "config.h" (was ijbconfig.h in my previous release) for 
+    the #defines.  "config.h" is now generated with "autoheader" from 
+    "acconfig.h" and "configure.in".  (Note that to install you do not
+    need autoconf or autoheader - just run "./configure".)
+    To see command-line options, run "./configure --help".
+    This is my first ever autoconf script, so it has some rough edges
+    (how PCRE is handled is the roughest).
+3)  Error logging code replaced with new module errlog.c, based on the
+    one from JunkBusterMT (but with the threading code removed).
+4)  Most of Rodney's 0.21 and 0.21A patches applied. (Marked *).  I did not
+    apply all of these, since I had already independently done conditional
+    popup file, conditional image file, and integration of popup code.
+5*) ACL, Jar and trust files conditionally compiled.
+6*) New source file headers.
+7*) Various cosmetic changes.  (But I have not consistently ordered the 
+    config files - I think that's worthwhile, but it's 1am and I want to
+    get this released!)
+8*) RCS tags on .h files.
+9)  RCS tags are const char[] rather than const char *.  (Saves 4 bytes
+    per tag ;-)
+10) VC++ project files renamed to vc_junkbuster.*.
+11) show-proxy-args now shows status of all conditionals, not just REGEX
+12) Various functions moved around.  Most notably all the system-specific
+    sockets code which was spread between jcc.c, bind.c, and connect.c,
+    has been moved to "jbsockets.c".  The non-system-specific code from
+    connect.c and socks4.c has been movet to "gateway.c".  Also, the
+    config file loader and the global variables it writes to have been
+    moved to "loadcfg.c".  (Maybe this should go into loaders.c?)
+    And candidate for the "worst filename ever" award is "miscutil.c",
+    which contains, well, miscellaneous utility functions like zalloc.
+    (Suggestions for a better name for this file are welcome!)
+13) Loaders now use a common function to read a line and skip comments,
+    and this function also stores the proxy_args.
+14) Added ./junkbuster --help     (Not for Win32 GUI)
+15) Added ./junkbuster --version  (Not for Win32 GUI)
+16) Win32 resources are now all marked as "U.S. English", rather than
+    being a mix of "U.S. English", "U.K. English" and "Irish English".
+17) Version number changes to 2.9.0
+
+Known bugs:
+- See (1) above about blockfiles.
+- Sending SIGHUP (under Red Hat Linux 7.1) causes a crash.  v0.21A hangs
+  after a SIGHUP.  This needs investigating, but pthreads support will 
+  almost certainly help here, so it may not be worth investigating
+  immediately.
+- Compiling with shared system pcre and pcreposix libraries is supported
+  via a switch to configure, but completely untested.
+
+Please note that there are now 2^14 == 16384 combinations of conditional 
+defines, and 4 major compilers (VC, Linux, mingw32, cygwin) for a total 
+of 65536 different builds.  We cannot possibly test all of them!  My 
+standard build is "everything on", and I've tested that on each compiler,
+along with a few variants.  You may uncover new bugs (probably compiler 
+errors) if you use an exotic combination of switches.
+
+*****************************************************************************
+* Date:        14 May 2001                                                  *
+* Version:     2.9.1                                                        *
+* Description: Various updates                                              *
+* Author:      Andreas S. Oesterhelt <oes@oesterhelt.org>                   *
+*****************************************************************************
+(From his e-mail:)
+
+ - in parsers.c, fixed two #ifdef FORCE to #ifdef FORCE_LOAD
+   (BTW: I think FORCE is precise enough, since loading remote
+   data is the whole purpose of a proxy..)
+ - Set the FORCE_PREFIX (back) to 'IJB-FORCE-LOAD-'. While 'noijb.'
+   is more elegant and looks like a hostname in the URL, it doesn't
+   make clear to the inexperienced user that the proxy is bypassed. It
+   also has a higher name collision risk.
+ - Filled in the function header templates for my functions in
+   parsers.c (again). They obviously got lost in our current
+   patch war ;-)
+ - Cut the credit for the Â§-referrer-option from the config file,
+   that Stefan had placed there.
+ - Improved the re_filterfile 
+
+*****************************************************************************
+* Date:        14 May 2001                                                  *
+* Version:     2.9.2                                                        *
+* Description: FORCE patch (again!)                                         *
+* Author:      Andreas S. Oesterhelt <oes@oesterhelt.org>                   *
+*****************************************************************************
+(These notes written by Jon)
+
+- Andreas applied the latest version of the FORCE patch.
+
+*****************************************************************************
+* Date:        14 May 2001 (late afternoon)                                 *
+* Version:     2.9.3                                                        *
+* Description: Various updates                                              *
+* Author:      Jon Foster <jon@jon-foster.co.uk>                            *
+*****************************************************************************
+
+1) Incorporated updates from current CVS tree, including:
+   - Amiga support (completely untested by me - I don't have an Amiga)
+   - "tinygif 3" support (redirects blocked images to a specified URL, so
+     the browser doesn't have to load and cache many copies of the same
+     image).
+   - one case where there were both local and global "referrer" variables
+     (yuck!) clarified by renaming the local one to "refer".
+   - Fixed some places where close() was used instead of close_socket().
+   Thanks to Jörg Strohmayer (joergs at users.sourceforge.net) for these.
+2) Temporary hack to get FORCE_LOAD to work with IE.  I just lowercased the
+   FORCE_LOAD_PREFIX.  Needs fixing properly.
+3) Most URLs hardcoded into JunkBuster were changed to go through a script
+   e.g. http://ijbswa.sourceforge.net/redirect.php?v=2.9.3&to=faq
+   The only other URLs left are the GNU GPL:
+     http://www.fsf.org/copyleft/gpl.html
+   and the home page:
+     http://ijbswa.sourceforge.net/
+   ... and various URLs which will be intercepted by JunkBuster anyway.
+   TODO: Still need to do something with the URLs in JunkBuster Corp's 
+   copyright/trademark notice on the bottom of the show-proxy-args page.
+4) PCRE or GNU Regex is now a #define option.
+
+*****************************************************************************
+* End of file                                                               *
+*****************************************************************************
+
similarity index 100%
rename from doc/obsolete/fb.gif
rename to doc/fb.gif
index 7c252b5..c980e61 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
-<!-- $Id: gpl.html,v 1.2 2001/05/17 22:56:17 jongfoster Exp $\r
+<!-- $Id$\r
 \r
      See copyright details at end of file\r
 \r
@@ -25,7 +25,7 @@ b.dot        { color: #FF0000 }
 \r
   <body bgcolor="#f8f8f0" link="#000078" alink="#ff0022" vlink=\r
   "#787878">\r
-    <p class="sans"><a href="http://www.privoxy.org/">\r
+    <p class="sans"><a href="http://ijbswa.sourceforge.net/">\r
     Website</a> <b class="dot">&middot;</b> <a href="ijbman.html">\r
     Manual</a> <b class="dot">&middot;</b> <a href="ijbfaq.html">\r
     FAQ</a> <b class="dot">&middot;</b> <b>GPL</b></p>\r
@@ -42,7 +42,7 @@ b.dot        { color: #FF0000 }
     mailing list</a> (which includes an archive of mail), the\r
     SourceForge.net <a href=\r
     "http://sourceforge.net/projects/ijbswa/">project page</a>, or\r
-    see the project's <a href="http://www.privoxy.org/">home\r
+    see the project's <a href="http://ijbswa.sourceforge.net/">home\r
     page</a>. Please also bear in mind that versions 2.9.x of\r
     JunkBuster are development releases, and are not production\r
     quality.</b></p>\r
@@ -536,7 +536,7 @@ b.dot        { color: #FF0000 }
     "250" height="15" src="top.gif" alt=\r
     "--- Back to Top of Page ---"></a></p>\r
 \r
-    <p class="sans"><a href="http://www.privoxy.org/">\r
+    <p class="sans"><a href="http://ijbswa.sourceforge.net/">\r
     Website</a> <b class="dot">&middot;</b> <a href="ijbman.html">\r
     Manual</a> <b class="dot">&middot;</b> <a href="ijbfaq.html">\r
     FAQ</a> <b class="dot">&middot;</b> <b>GPL</b></p>\r
similarity index 97%
rename from doc/obsolete/ijbfaq.html
rename to doc/ijbfaq.html
index 3d52247..f9168a6 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
-<!-- $Id: ijbfaq.html,v 1.2 2001/05/17 22:56:17 jongfoster Exp $\r
+<!-- $Id$\r
 \r
      See copyright details at end of file\r
 \r
similarity index 97%
rename from doc/obsolete/ijbman.html
rename to doc/ijbman.html
index 8329e57..d810c68 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
-<!-- $Id: ijbman.html,v 1.2 2001/05/17 22:56:17 jongfoster Exp $\r
+<!-- $Id$\r
 \r
      See copyright details at end of file\r
 \r
diff --git a/doc/pcrs.3 b/doc/pcrs.3
deleted file mode 100644 (file)
index 2a96d5a..0000000
+++ /dev/null
@@ -1,479 +0,0 @@
-.\" Copyright (c) 2001 Andreas S. Oesterhelt <oes@oesterhelt.org>
-.\"
-.\" This is free documentation; you can redistribute it and/or
-.\" modify it under the terms of the GNU General Public License as
-.\" published by the Free Software Foundation; either version 2 of
-.\" the License, or (at your option) any later version.
-.\"
-.\" The GNU General Public License's references to "object code"
-.\" and "executables" are to be interpreted as the output of any
-.\" document formatting or typesetting system, including
-.\" intermediate and printed output.
-.\"
-.\" This manual is distributed in the hope that it will be useful,
-.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.\" GNU General Public License for more details.
-.\"
-.\" You should have received a copy of the GNU General Public
-.\" License along with this manual; if not, write to the Free
-.\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-.\" MA 02111, USA.
-.\"
-.TH PCRS 3 "4 March 2002" "pcrs-0.0.1"
-.SH NAME
-pcrs - Perl-compatible regular substitution.
-.SH SYNOPSIS
-.br
-.B "#include <pcrs.h>"
-.PP
-.br
-.BI "pcrs_job *pcrs_compile(const char *" pattern "," 
-.ti +5n
-.BI "const char *" substitute ", const char *" options ,
-.ti +5n
-.BI "int *" errptr );
-.PP
-.br
-.BI "pcrs_job *pcrs_compile_command(const char *" command ,
-.ti +5n
-.BI "int *" errptr );
-.PP
-.br
-.BI "int pcrs_execute(pcrs_job *" job ", char *" subject ,
-.ti +5n
-.BI "int " subject_length ", char **" result ,
-.ti +5n
-.BI "int *" result_length );
-.PP
-.br
-.BI "int pcrs_execute_list (pcrs_job *" joblist ", char *" subject ,
-.ti +5n
-.BI "int " subject_length ", char **" result ,
-.ti +5n
-.BI "int *" result_length );
-.PP
-.br
-.BI "pcrs_job *pcrs_free_job(pcrs_job *" job );
-.PP
-.br
-.BI "void pcrs_free_joblist(pcrs_job *" joblist );
-.PP
-.br
-.BI "char *pcrs_strerror(int " err );
-.PP
-.br
-
-.SH DESCRIPTION
-
-The
-.SM PCRS
-library is a supplement to the 
-.SB PCRE(3)
-library that implements
-.RB "regular expression based substitution, like provided by " Perl(1) "'s 's'"
-operator. It uses the same syntax and semantics as Perl 5, with just a few
-differences (see below).
-
-In a first step, the information on a substitution, i.e. the pattern, the
-substitute and the options are compiled from Perl syntax to an internal form
-.RB "called " pcrs_job " by using either the " pcrs_compile() " or " 
-.BR pcrs_compile_command() " functions."
-
-Once the job is compiled, it can be used on subjects, which are arbitrary 
-memory areas containing string or binary data, by calling
-.BR pcrs_execute() ". Jobs can be chained to joblists and whole"
-.RB "joblists can be applied to a subject using " pcrs_execute_list() .
-
-There are also convenience functions for freeing the jobs and for errno-to-string
-.RB "conversion, namely " pcrs_free_job() ", " pcrs_free_joblist() " and "
-.BR pcrs_strerror() .
-
-.SH COMPILING JOBS
-
-.RB "The function " pcrs_compile() " is called to compile a " pcrs_job
-.RI "from a " pattern ", " substitute " and " options " string."
-.RB "The resulting " "pcrs_job" " structure is dynamically allocated and it"
-.RB "is the caller's responsibility to call " "pcrs_free_job()" "  when it's no longer needed."
-
-.BR "pcrs_compile_command()" " is a convenience wrapper function that parses a Perl"
-.IR "command" " of the form"
-.BI "s/" "pattern" "/" "substitute" "/[" "options" "]"
-.RB "into its components and then calls " "pcrs_compile()" ". As in Perl, you"
-.RB "are not bound to the '" "/" "' character: Whatever"
-.RB "follows the '" "s" "' will be used as the delimiter. Patterns or substitutes"
-that contain the delimiter need to quote it:
-\fBs/th\\/is/th\\/at/\fR
-.RB "will replace " "th/is" " by " "th/at" " and can be written more simply as" 
-.BR "s|th/is|th/at|" "."
-
-.IR "pattern" ", " "substitute" ", " "options" " and " "command" " must be"
-.RI "zero-terminated C strings. " "substitute" " and " "options" " may be"
-.BR "NULL" ", in which case they are treated like the empty string."
-
-.SS "Return value and diagnostics"
-On success, both functions return a pointer to the compiled job.
-.RB "On failure, " "NULL"
-.RI "is returned. In that case, the pcrs error code is written to *" "err" "."
-
-.SS Patterns
-.RI "For the syntax of the " "pattern" ", see the "
-.BR "PCRE(3)" " manual page."
-
-.SS Substitutes
-.RI "The " "substitute" " uses"
-.RB "Perl syntax as documented in the " "perlre(1)" " manual page, with"
-some exceptions: 
-
-Most notably and evidently, since
-.SM PCRS
-is not Perl, variable interpolation or Perl command substitution won't work.
-Special variables that do get interpolated, are:
-.TP
-.B "$1, $2, ..., $n"
-Like in Perl, these variables refer to what the nth capturing subpattern
-in the pattern matched.
-.TP
-.B "$& and $0"
-.RB "refer to the whole match. Note that " "$0" " is deprecated in recent"
-Perl versions and now refers to the program name.
-.TP
-.B "$+"
-refers to what the last capturing subpattern matched.
-.TP
-.BR "$` and $'" " (backtick and tick)"
-.RI "refer to the areas of the " "subject" " before and after the match, respectively."
-.RB "Note that, like in Perl, the " "unmodified" " subject is used, even"
-if a global substitution previously matched.
-
-.PP
-Perl4-style references to subpattern matches of the form 
-\fB\\1, \\2, ...\fR
-.RB "which only exist in Perl5 for backwards compatibility, are " "not" 
-supported.
-
-Also, since the substitute is a double-quoted string in Perl, you
-might expect all Perl syntax for special characters to apply. In fact,
-only the following are supported:
-
-.TP
-\fB\\n\fR
-newline (0x0a)
-.TP
-\fB\\r\fR
-carriage return (0x0d)
-.TP
-\fB\\t\fR
-horizontal tab (0x09)
-.TP
-\fB\\f\fR
-form feed (0x0c)
-.TP
-\fB\\b\fR
-backspace (0x08)
-.TP
-\fB\\a\fR
-alarm, bell (0x07)
-.TP
-\fB\\e\fR
-escape (0x1b)
-.TP
-\fB\\0\fR
-binary zero (0x00)
-
-.SS "Options"
-.RB "The options " "gmisx" " are supported. " "e" " is not, since it would"
-.RB "require a Perl interpreter and neither is " o ", because the pattern
-is explicitly compiled, anyway. Additionally,
-.SM PCRS
-.RB "honors the options " "U" " and " "T" "."
-Where
-.SM PCRE
-.RB "options are mentioned below, refer to " PCRE(3) " for the subtle differences"
-to Perl behaviour.
-
-.TP
-.B g
-.RB "Replace " all " instances of"
-.IR pattern " in " subject ,
-not just the first one.
-
-.TP
-.B i
-.RI "Match the " pattern " without respect to case. This translates to"
-.SM PCRE_CASELESS.
-
-.TP
-.B m
-.RI "Treat the " subject " as consisting of multiple lines, i.e."
-.RB ' ^ "' matches immediately after, and '" $ "' immediately before each newline."
-Translates to
-.SM PCRE_MULTILINE.
-
-.TP
-.B s
-.RI "Treat the " subject " as consisting of one single line, i.e."
-.RB "let the scope of the '" . "' metacharacter include newlines."
-Translates to
-.SM PCRE_DOTALL.
-
-.TP
-.B x
-.RI "Allow extended regular expression syntax in the " pattern ","
-.RB "enabling whitespace and comments in complex patterns."
-Translates to
-.SM PCRE_EXTENDED.
-
-.TP
-.B U
-.RB "Switch the default behaviour of the '" * "' and '" + "' quantifiers"
-.RB "to ungreedy. Note that appending a '" ? "' switches back to greedy(!)."
-.RB "The explicit in-pattern switches " (?U) " and " (?-U) " remain unaffected."
-Translates to
-.SM PCRE_UNGREEDY.
-
-.TP
-.B T
-.RI "Consider the " substitute " trivial, i.e. do not interpret any references"
-or special character escape sequences in the substitute. Handy for large
-user-supplied substitutes, which would otherwise have to be examined and properly
-quoted.
-
-.PP
-Unsupported options are silently ignored.
-
-.SH EXECUTING JOBS
-
-.RI "Calling " pcrs_execute() " produces a modified copy of the " subject ", in which"
-.RB "the first (or all, if the '" g "' option was given when compiling the job)"
-.RI "occurance(s) of the job's " pattern " in the " subject " is replaced by the job's"
-.IR substitute .
-
-.RI "The first " subject_length " bytes following " subject " are processed, so"
-.RI  "a " subject_length " that exceeds the actual " subject " is dangerous."
-Note that if you want to get your zero-terminated C strings back including their
-.RI "termination, you must let " subject_length " include the binary zero, i.e."
-set it to
-.BI strlen( subject ") + 1."
-
-.RI "The " subject " itself is left untouched, and the " *result " is dynamically"
-.RB "allocated, so it is the caller's responsibility to " free() " it when it's"
-no longer needed.
-
-.RI "The result's length is written to " *result_length "."
-
-.RB "If the job matched, the " PCRS_SUCCESS " flag in"
-.IB job ->flags
-is set.
-
-.SS Return value and diagnostics
-
-.RB "On success, " pcrs_execute() " returns the number of substitutions that"
-were made, which is limited to 0 or 1 for non-global searches.
-.RI "On failure, a negative error code is returned and " result " is set"
-.RB "to " NULL .
-
-.SH FREEING JOBS
-.RB "It is not sufficient to call " free() " on a " pcrs_job ", because it "
-contains pointers to other dynamically allocated structures.
-.RB "Use " pcrs_free_job() " instead. It is safe to pass " NULL " pointers "
-.RB "(or pointers to invalid " pcrs_job "s that contain " NULL " pointers"
-.RB "to dependant structures) to " pcrs_free_job() "."
-
-.SS Return value
-.RB "The value of the job's " next " pointer."
-
-
-.SH CHAINING JOBS
-
-.SM PCRS
-.RB "supports to some extent the chaining of multiple " pcrs_job " structures by"
-.RB "means of their " next " member."
-
-Chaining the jobs is up to you, but once you have built a linked list of jobs,
-.RI "you can execute a whole " joblist " on a given subject by"
-.RB "a single call to " pcrs_execute_list() ", which will sequentially traverse"
-.RB "the linked list until it reaches a " NULL " pointer, and call " pcrs_execute() 
-.RI "for each job it encounters, feeding the " result  " and " result_length " of each"
-.RI "call into the next as the " subject " and " subject_length ". As in the single"
-.RI "job case, the original " subject " remains untouched, but all interim " result "s"
-.RB "are of course " free() "d. The return value is the accumulated number of matches"
-.RI "for all jobs in the " joblist "."
-.RI "Note that while this is handy, it reduces the diagnostic value of " err ", since "
-you won't know which job failed.
-
-.RI "In analogy, you can free all jobs in a given " joblist " by calling"
-.BR pcrs_free_joblist() .
-
-.SH QUOTING
-The quote character is (surprise!) '\fB\\\fR'. It quotes the delimiter in a
-.IR command ", the"
-.RB ' $ "' in  a"
-.IR substitute ", and, of course, itself. Note that the"
-.RB ' $ "' doesn't need to be quoted if it isn't followed by " [0-9+'`&] "."
-
-.RI "For quoting in the " pattern ", please refer to"
-.BR PCRE(3) .
-
-.SH DIAGNOSTICS
-
-.RB "When " compiling " a job either via the " pcrs_compile() " or " pcrs_compile_command()
-.RB "functions, you know that something went wrong when you are returned a " NULL " pointer."
-.RI "In that case, or in the event of non-fatal warnings, the integer pointed to by " err
-contains a nonzero error code, which is either a passed-through
-.SM PCRE
-error code or one generated by
-.SM PCRS.
-Under normal circumstances, it can take the following values:
-.TP
-.B PCRE_ERROR_NOMEMORY
-While compiling the pattern,
-.SM PCRE
-ran out of memory.
-.TP  
-.B  PCRS_ERR_NOMEM
-While compiling the job,
-.SM PCRS
-ran out of memory.
-.TP  
-.B  PCRS_ERR_CMDSYNTAX
-.BR pcrs_compile_command() " didn't find four tokens while parsing the"
-.IR command .
-.TP  
-.B  PCRS_ERR_STUDY
-A
-.SM PCRE
-.RB "error occured while studying the compiled pattern. Since " pcre_study()
-only provides textual diagnostic information, the details are lost.
-.TP  
-.B  PCRS_WARN_BADREF
-.RI "The " substitute " contains a reference to a capturing subpattern that"
-.RI "has a higher index than the number of capturing subpatterns in the " pattern
-or that exceeds the current hard limit of 33 (See LIMITATIONS below). As in Perl,
-this is non-fatal and results in substitutions with the empty string.
-
-.PP
-.RB "When " executing " jobs via " pcrs_execute() " or " pcrs_execute_list() ","
-.RI "a negative return code indicates an error. In that case, *" result
-.RB "is " NULL ". Possible error codes are:"
-.TP
-.B PCRE_ERROR_NOMEMORY
-While matching the pattern,
-.SM PCRE
-ran out of memory. This can only happen if there are more than 33 backrefrences
-.RI "in the " pattern "(!)"
-.BR and " memory is too tight to extend storage for more."
-.TP  
-.B  PCRS_ERR_NOMEM
-While executing the job,
-.SM PCRS
-ran out of memory.
-.TP  
-.B  PCRS_ERR_BADJOB
-.RB "The " pcrs_job "*  passed to " pcrs_execute " was NULL, or the"
-.RB "job is bogus (it contains " NULL " pointers to the compiled
-pattern, extra, or substitute).
-
-.PP
-If you see any other
-.SM PCRE
-error code passed through, you've either messed with the compiled job
-or found a bug in
-.SM PCRS.
-Please send me an email.
-
-.RB "Ah, and don't look for " PCRE_ERROR_NOMATCH ", since this"
-is not an error in the context of
-.SM PCRS.
-.RI "Should there be no match, an exact copy of the " subject " is"
-.RI "found at *" result " and the return code is 0 (matches)."
-
-All error codes can be translated into human readable text by means
-.RB "of the " pcrs_strerror() " function."
-
-
-.SH EXAMPLE
-A trivial command-line test program for
-.SM PCRS
-might look like:
-
-.nf
-#include <pcrs.h>
-#include <stdio.h>
-
-int main(int Argc, char **Argv)
-{
-   pcrs_job *job;
-   char *result;
-   size_t newsize;
-   int err;
-
-   if (Argc != 3)
-   {
-      fprintf(stderr, "Usage: %s s/pattern/substitute/[options]  subject\\n", Argv[0]);
-      return 1;
-   }
-
-   if (NULL == (job = pcrs_compile_command(Argv[1], &err)))
-   {
-      fprintf(stderr, "%s: compile error:  %s (%d).\\n", Argv[0], pcrs_strerror(err), err);
-   }
-
-   if (0 > (err = pcrs_execute(job, Argv[2], strlen(Argv[2]) + 1, &result, &newsize)))
-   {
-      fprintf(stderr, "%s: Exec error:  %s (%d).\\n", Argv[0], pcrs_strerror(err), err);
-   }
-   else
-   {
-      printf("Result: *%s*\\n", result);
-      free(result);
-   }
-
-   pcrs_free_job(job);
-   return(err < 0);
-
-}
-
-.fi
-
-
-.SH LIMITATIONS
-The number of matches that a global job can have is only limited by the
-available memory. An initial storage for 40 matches is reserved, which
-is dynamically resized by the factor 1.6 whenever it is exhausted.
-
-The number of capturing subpatterns is currently limited to 33, which
-is a Bad Thing[tm]. It should be dynamically expanded until it reaches the
-.SM PCRE
-limit of 99.
-
-All of the above values can be adjusted in the "Capacity" section
-.RB "of " pcrs.h "."
-
-The Perl-style escape sequences for special characters \\\fInnn\fR,
-\\x\fInn\fR, and \\c\fIX\fR are currently unsupported.
-
-.SH BUGS
-This library has only been tested in the context of one application
-and should be considered high risk.
-
-.SH HISTORY
-.SM PCRS
-was originally written for the Internet Junkbuster project
-(http://sourceforge.net/projects/ijbswa/).
-
-.SH SEE ALSO
-.B PCRE(3), perl(1), perlre(1)
-
-.SH AUTHOR
-
-.SM PCRS
-is Copyright 2000, 2001 by Andreas Oesterhelt <andreas@oesterhelt.org> and is
-licensed under the terms of the GNU Lesser General Public License (LGPL),
-version 2.1, which should be included in this distribution, with the exception
-that the permission to replace that license with the GNU General Public
-License (GPL) given in section 3 is restricted to version 2 of the GPL.
-
-If it is missing from this distribution, the LGPL can be obtained from
-http://www.gnu.org/licenses/lgpl.html or by mail: Write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
diff --git a/doc/source/.gitignore b/doc/source/.gitignore
deleted file mode 100644 (file)
index 29fa232..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-developer-manual
-faq
-ldpOK.dsl
-user-manual
diff --git a/doc/source/developer-manual.sgml b/doc/source/developer-manual.sgml
deleted file mode 100644 (file)
index f851625..0000000
+++ /dev/null
@@ -1,1570 +0,0 @@
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
-<!--
- File        :  $Source: /cvsroot/ijbswa/current/doc/source/developer-manual.sgml,v $
-
- Purpose     :  developer manual
-                This file belongs into
-                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-                
- $Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $
-
- Written by and Copyright (C) 2001 the SourceForge
- Privoxy team. http://www.privoxy.org/
-
- Based on the Internet Junkbuster originally written
- by and Copyright (C) 1997 Anonymous Coders and 
- Junkbusters Corporation.  http://www.junkbusters.com
--->
-
-<article id="index">
-  <artheader>
-    <title>Privoxy Developer Manual</title>
-
-    <pubdate>$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $</pubdate>
-
-    <authorgroup>
-      <author>
-        <affiliation>
-          <orgname>By: Privoxy Developers</orgname>
-        </affiliation>
-      </author>
-    </authorgroup>
-
-    <abstract>
-      <para>
- The developer manual gives the users information on how to help the developer
- team. It provides guidance on coding, testing, documentation and other
- issues. 
- </para>
-
-<para>
- <application>Privoxy</application> is a web proxy with advanced filtering
- capabilities for protecting privacy, filtering web page content, managing
- cookies, controlling access, and removing ads, banners, pop-ups and other
- obnoxious Internet junk. <application>Privoxy</application> has a very
- flexible configuration and can be customized to suit individual needs and
- tastes. <application>Privoxy</application> has application for both
- stand-alone systems and multi-user networks.
-</para>
-
-<para>
- <application>Privoxy</application> is based on the code of the 
- <application>Internet Junkbuster</application>.
- <application>Junkbuster</application> was originally written by JunkBusters
- Corporation, and was released as free open-source software under the GNU GPL.
- Stefan Waldherr made many improvements, and started the SourceForge project
- to continue development. Other developers have since joined Stefan.
-</para>
-
-<para>
- You can find the latest version of the user manual at <ulink
- url="http://www.privoxy.org/developer-manual/">http://www.privoxy.org/developer-manual/</ulink>.
- Please see the Contact section in the user-manual if you want to contact the
- developers.
-</para>
-
-<!--        <para> -->
-<!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
-<!--   </para> -->
-
-    </abstract>
-  </artheader>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="introduction"><title>Introduction</title>
-    <para>To be filled.
-</para>
-  </sect1>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="quickstart"><title>Quickstart to Privoxy Development</title>
-    <para>
-You'll need an account on Sourceforge to support our development. Mail you ID
-to the list and wait until a project manager has added you.
-
-For the time beeing (read, this section is under construction), please note the
-following guidelines for changing stuff in the code. If it is
-       <orderedlist numeration="arabic">
-                       <listitem><para>
-               A bugfix / clean-up / cosmetic thing: shoot
-                       </para></listitem>
-               <listitem><para>
-               A new feature that can be turned off: shoot
-                       </para></listitem>
-               <listitem><para>
-               A clear improvement w/o side effects on other parts of the code: shoot
-                </para></listitem>
-               <listitem><para>
-               A matter of taste: ask the list
-               </para></listitem>
-               <listitem><para>
-               A major redesign of some part of the code: ask the list
-                </para></listitem>
-        </orderedlist> 
-</para>                
-  </sect1>     
-       
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="documentation"><title>Documentation Guidelines</title>
-    <para>
-        All docs are in SGML format and located in the <computeroutput>doc/source</computeroutput> directory.
-        </para>
-        <para>
-        How do you update the webserver (i.e. the pages on sourceforge)?
-        <orderedlist numeration="arabic">
-                <listitem><para>
-        Run <computeroutput>make dok</computeroutput> (which uses the documents in <computeroutput>doc/source</computeroutput> to update all
-        text files in <computeroutput>doc/text</computeroutput> and to update
-all web documents in <computeroutput>doc/webserver</computeroutput>.
-                </para></listitem>
-                <listitem><para>
-        Run <computeroutput>make webserver</computeroutput> which copies all files from
-<computeroutput>doc/webserver</computeroutput> to the sourceforge webserver
-via scp.
-                </para></listitem>
-        </orderedlist>
-  </para>
- </sect1>
-
-<!--     <listitem><para>be consistent with the redirect script (i.e. the <application>Privoxy</application> program -->
-<!--       points via the redirect URL at sf to valid end-points in the document)</para></listitem> -->
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="coding"><title>Coding Guidelines</title>
-
-    <sect2 id="s1"><title>Introduction</title>
-
-    <para>This set of standards is designed to make our lives easier.  It is
-    developed with the simple goal of helping us keep the "new and improved
-    <application>Privoxy</application>" consistent and reliable. Thus making
-    maintenance easier and increasing chances of success of the
-    project.</para>
-
-    <para>And that of course comes back to us as individuals. If we can
-    increase our development and product efficiencies then we can solve more
-    of the request for changes/improvements and in general feel good about
-    ourselves. ;-></para>
-
-  </sect2>
-
-    <sect2 id="s2"><title>Using Comments</title>
-
-    <sect3 id="s3"><title>Comment, Comment, Comment</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Comment as much as possible without commenting the obvious.
-    For example do not comment "aVariable is equal to bVariable".
-    Instead explain why aVariable should be equal to the bVariable.
-    Just because a person can read code does not mean they will
-    understand why or what is being done. A reader may spend a lot
-    more time figuring out what is going on when a simple comment
-    or explanation would have prevented the extra research. Please
-    help your brother IJB'ers out!</para>
-
-    <para>The comments will also help justify the intent of the code.
-    If the comment describes something different than what the code
-    is doing then maybe a programming error is occurring.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/* if page size greater than 1k ... */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-/* if page size is small, send it in blocks */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-This demonstrates 2 cases of "what not to do".  The first is a
-"syntax comment".  The second is a comment that does not fit what
-is actually being done.
-</programlisting>
-  </sect3>
-
-    
-
-    <sect3 id="s4"><title>Use blocks for comments</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Comments can help or they can clutter. They help when they
-    are differentiated from the code they describe. One line
-    comments do not offer effective separation between the comment
-    and the code. Block identifiers do, by surrounding the code
-    with a clear, definable pattern.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/*********************************************************************
- * This will stand out clearly in your code!
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-/* unfortunately, this may not */
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-if ( thisVariable == thatVariable ) /* this may not either */
-{
-   DoSomethingVeryImportant();
-}</programlisting>
-
-    <para><emphasis>Exception:</emphasis></para>
-
-    <para>If you are trying to add a small logic comment and do not
-    wish to "disrubt" the flow of the code, feel free to use a 1
-    line comment which is NOT on the same line as the code.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s5"><title>Keep Comments on their own line</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>It goes back to the question of readability. If the comment
-    is on the same line as the code it will be harder to read than
-    the comment that is on its own line.</para>
-
-    <para>There are three exceptions to this rule, which should be
-    violated freely and often: during the definition of variables,
-    at the end of closing braces, when used to comment
-    parameters.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/*********************************************************************
- * This will stand out clearly in your code,
- * But the second example won't.
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-if ( thisVariable == thatVariable ) /*can you see me?*/
-{
-   DoSomethingVeryImportant(); /*not easily*/
-}
-
-
-/*********************************************************************
- * But, the encouraged exceptions:
- *********************************************************************/
-int urls_read     = 0;     /* # of urls read + rejected */
-int urls_rejected = 0;     /* # of urls rejected */
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-}
-
-
-short DoSomethingVeryImportant(
-   short firstparam,   /* represents something */
-   short nextparam     /* represents something else */ )
-{
-   ...code here...
-
-}   /* -END- DoSomethingVeryImportant */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s6"><title>Comment each logical step</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Logical steps should be commented to help others follow the
-    intent of the written code and comments will make the code more
-    readable.</para>
-
-    <para>If you have 25 lines of code without a comment, you should
-    probably go back into it to see where you forgot to put
-    one.</para>
-
-    <para>Most "for", "while", "do", etc... loops _probably_ need a
-    comment. After all, these are usually major logic
-    containers.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s7"><title>Comment All Functions Thoroughly</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>A reader of the code should be able to look at the comments
-    just prior to the beginning of a function and discern the
-    reason for its existence and the consequences of using it. The
-    reader should not have to read through the code to determine if
-    a given function is safe for a desired use. The proper
-    information thoroughly presented at the introduction of a
-    function not only saves time for subsequent maintenance or
-    debugging, it more importantly aids in code reuse by allowing a
-    user to determine the safety and applicability of any function
-    for the problem at hand. As a result of such benefits, all
-    functions should contain the information presented in the
-    addendum section of this document.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s8"><title>Comment at the end of braces if the
-    content is more than one screen length</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Each closing brace should be followed on the same line by a
-    comment that describes the origination of the brace if the
-    original brace is off of the screen, or otherwise far away from
-    the closing brace. This will simplify the debugging,
-    maintenance, and readability of the code.</para>
-
-    <para>As a suggestion , use the following flags to make the
-    comment and its brace more readable:</para>
-
-    <para>use following a closing brace: } /* -END- if() or while ()
-    or etc... */</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if x is 1 */
-
-or:
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if ( 1 == X ) */
-</programlisting>
-  </sect3>
-    
-  </sect2>
-
-    <sect2 id="s9"><title>Naming Conventions</title>
-
-    
-
-    <sect3 id="s10"><title>Variable Names</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use all lowercase, and seperate words via an underscore
-    ('_'). Do not start an identifier with an underscore. (ANSI C
-    reserves these for use by the compiler and system headers.) Do
-    not use identifiers which are reserved in ANSI C++. (E.g.
-    template, class, true, false, ...). This is in case we ever
-    decide to port Privoxy to C++.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int ms_iis5_hack = 0;</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>
-<programlisting>
-int msiis5hack = 0; int msIis5Hack = 0;
-</programlisting>
-</para>
-
-    
-
-  </sect3>    
-
-    <sect3 id="s11"><title>Function Names</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use all lowercase, and seperate words via an underscore
-    ('_'). Do not start an identifier with an underscore. (ANSI C
-    reserves these for use by the compiler and system headers.) Do
-    not use identifiers which are reserved in ANSI C++. (E.g.
-    template, class, true, false, ...). This is in case we ever
-    decide to port Privoxy to C++.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int load_some_file( struct client_state *csp )</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>
-<programlisting>
-int loadsomefile( struct client_state *csp )
-int loadSomeFile( struct client_state *csp )
-</programlisting>
-</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s12"><title>Header file prototypes</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use a descriptive parameter name in the function prototype
-    in header files. Use the same parameter name in the header file
-    that you use in the c file.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-(.h) extern int load_aclfile( struct client_state *csp );
-(.c) int load_aclfile( struct client_state *csp )</programlisting>
-
-    <para><emphasis>Instead of:</emphasis>
-<programlisting>
-(.h) extern int load_aclfile( struct client_state * ); or 
-(.h) extern int load_aclfile(); 
-(.c) int load_aclfile( struct client_state *csp )
-</programlisting>
-</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s13"><title>Enumerations, and #defines</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use all capital letters, with underscores between words. Do
-    not start an identifier with an underscore. (ANSI C reserves
-    these for use by the compiler and system headers.)</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-(enumeration) : enum Boolean { FALSE, TRUE };
-(#define) : #define DEFAULT_SIZE 100;</programlisting>
-
-    <para><emphasis>Note:</emphasis> We have a standard naming scheme for #defines
-    that toggle a feature in the preprocessor: FEATURE_>, where
-    > is a short (preferably 1 or 2 word) description.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#define FEATURE_FORCE 1
-
-#ifdef FEATURE_FORCE
-#define FORCE_PREFIX blah
-#endif /* def FEATURE_FORCE */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s14"><title>Constants</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Spell common words out entirely (do not remove vowels).</para>
-
-    <para>Use only widely-known domain acronyms and abbreviations.
-    Capitalize all letters of an acronym.</para>
-
-    <para>Use underscore (_) to separate adjacent acronyms and
-    abbreviations. Never terminate a name with an underscore.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#define USE_IMAGE_LIST 1</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>
-<programlisting>
-#define USE_IMG_LST 1 or 
-#define _USE_IMAGE_LIST 1 or
-#define USE_IMAGE_LIST_ 1 or 
-#define use_image_list 1 or
-#define UseImageList 1
-</programlisting>
-</para>
-
-    
-  </sect3>
-
-  </sect2>
-    
-
-    <sect2 id="s15"><title>Using Space</title>
-
-    
-
-    <sect3 id="s16"><title>Put braces on a line by themselves.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>The brace needs to be on a line all by itself, not at the
-    end of the statement. Curly braces should line up with the
-    construct that they're associated with. This practice makes it
-    easier to identify the opening and closing braces for a
-    block.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-if ( this == that )
-{
-   ...
-}</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>if ( this == that ) { ... }</para>
-
-    <para>or</para>
-
-    <para>if ( this == that ) { ... }</para>
-
-    <para><emphasis>Note:</emphasis> In the special case that the if-statement is
-    inside a loop, and it is trivial, i.e. it tests for a
-    condidtion that is obvious from the purpose of the block,
-    one-liners as above may optically preserve the loop structure
-    and make it easier to read.</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection.</para>
-
-    <para><emphasis>Example exception:</emphasis></para>
-<programlisting>
-while ( more lines are read )
-{
-   /* Please document what is/is not a comment line here */
-   if ( it's a comment ) continue;
-
-   do_something( line );
-}
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s17"><title>ALL control statements should have a
-    block</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Using braces to make a block will make your code more
-    readable and less prone to error. All control statements should
-    have a block defined.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-if ( this == that )
-{
-   DoSomething();
-   DoSomethingElse();
-}</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>if ( this == that ) DoSomething(); DoSomethingElse();</para>
-
-    <para>or</para>
-
-    <para>if ( this == that ) DoSomething();</para>
-
-    <para><emphasis>Note:</emphasis> The first example in "Instead of" will execute
-    in a manner other than that which the developer desired (per
-    indentation). Using code braces would have prevented this
-    "feature". The "explanation" and "exception" from the point
-    above also applies.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s18"><title>Do not belabor/blow-up boolean
-    expressions</title>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-structure->flag = ( condition );</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>if ( condition ) { structure->flag = 1; } else {
-    structure->flag = 0; }</para>
-
-    <para><emphasis>Note:</emphasis> The former is readable and consice. The later
-    is wordy and inefficient. Please assume that any developer new
-    to the project has at least a "good" knowledge of C/C++. (Hope
-    I do not offend by that last comment ... 8-)</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s19"><title>Use white space freely because it is
-    free</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Make it readable. The notable exception to using white space
-    freely is listed in the next guideline.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int firstValue   = 0;
-int someValue    = 0;
-int anotherValue = 0;
-int thisVariable = 0;
-
-if ( thisVariable == thatVariable )
-
-firstValue = oldValue + ( ( someValue - anotherValue ) - whatever )
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s20"><title>Don't use white space around structure
-    operators</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>- structure pointer operator ( "->" ) - member operator (
-    "." ) - functions and parentheses</para>
-
-    <para>It is a general coding practice to put pointers, references,
-    and function parentheses next to names. With spaces, the
-    connection between the object and variable/function name is not
-    as clear.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-aStruct->aMember;
-aStruct.aMember;
-FunctionName();</programlisting>
-
-    <para><emphasis>Instead of:</emphasis> aStruct -> aMember; aStruct . aMember;
-    FunctionName ();</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s21"><title>Make the last brace of a function stand
-    out</title>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int function1( ... )
-{
-   ...code...
-   return( retCode );
-
-}   /* -END- function1 */
-
-
-int function2( ... )
-{
-}   /* -END- function2 */
-</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>int function1( ... ) { ...code... return( retCode ); } int
-    function2( ... ) { }</para>
-
-    <para><emphasis>Note:</emphasis> Use 1 blank line before the closing brace and 2
-    lines afterwards. This makes the end of function standout to
-    the most casual viewer. Although function comments help
-    seperate functions, this is still a good coding practice. In
-    fact, I follow these rules when using blocks in "for", "while",
-    "do" loops, and long if {} statements too. After all whitespace
-    is free!</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection on the number of blank
-    lines. Enforced is the end of function comments.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s22"><title>Use 3 character indentions</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If some use 8 character TABs and some use 3 character TABs,
-    the code can look *very* ragged. So use 3 character indentions
-    only. If you like to use TABs, pass your code through a filter
-    such as "expand -t3" before checking in your code.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-static const char * const url_code_map[256] =
-{
-   NULL, ...
-};
-
-
-int function1( ... )
-{
-   if ( 1 )
-   {
-      return( ALWAYS_TRUE );
-   }
-   else
-   {
-      return( HOW_DID_YOU_GET_HERE );
-   }
-
-   return( NEVER_GETS_HERE );
-
-}
-</programlisting>
-  </sect3>
-
-  </sect2>
-    
-
-    <sect2 id="s23"><title>Initializing</title>
-
-    
-
-    <sect3 id="s24"><title>Initialize all variables</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Do not assume that the variables declared will not be used
-    until after they have been assigned a value somewhere else in
-    the code. Remove the chance of accidentally using an unassigned
-    variable.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-short anShort = 0;
-float aFloat  = 0;
-struct *ptr = NULL;</programlisting>
-
-    <para><emphasis>Note:</emphasis> It is much easier to debug a SIGSEGV if the
-    message says you are trying to access memory address 00000000
-    and not 129FA012; or arrayPtr[20] causes a SIGSEV vs.
-    arrayPtr[0].</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection if and only if the
-    variable is assigned a value "shortly after" declaration.</para>
-
-  </sect3>
-  </sect2>
-    
-
-    <sect2 id="s25"><title>Functions</title>
-
-    
-
-    <sect3 id="s26"><title>Name functions that return a boolean as a
-    question.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Value should be phrased as a question that would logically
-    be answered as a true or false statement</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-ShouldWeBlockThis();
-ContainsAnImage();
-IsWebPageBlank();
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s27"><title>Always specify a return type for a
-    function.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>The default return for a function is an int. To avoid
-    ambiguity, create a return for a function when the return has a
-    purpose, and create a void return type if the function does not
-    need to return anything.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s28"><title>Minimize function calls when iterating by
-    using variables</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>It is easy to write the following code, and a clear argument
-    can be made that the code is easy to understand:</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-for ( size_t cnt = 0; cnt &lt; blockListLength(); cnt ++ )
-{
-   ....
-}</programlisting>
-
-    <para><emphasis>Note:</emphasis> Unfortunately, this makes a function call for
-    each and every iteration. This increases the overhead in the
-    program, because the compiler has to look up the function each
-    time, call it, and return a value. Depending on what occurs in
-    the blockListLength() call, it might even be creating and
-    destroying structures with each iteration, even though in each
-    case it is comparing "cnt" to the same value, over and over.
-    Remember too - even a call to blockListLength() is a function
-    call, with the same overhead.</para>
-
-    <para>Instead of using a function call during the iterations,
-    assign the value to a variable, and evaluate using the
-    variable.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-size_t len = blockListLength();
-
-for ( size_t cnt = 0; cnt &lt; len; cnt ++ )
-{
-   ....
-}</programlisting>
-
-    <para><emphasis>Exceptions:</emphasis> if the value of blockListLength() *may*
-    change or could *potentially* change, then you must code the
-    function call in the for/while loop.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s29"><title>Pass and Return by Const Reference</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>This allows a developer to define a const pointer and call
-    your function. If your function does not have the const
-    keyword, we may not be able to use your function. Consider
-    strcmp, if it were defined as: extern int strcmp( char *s1,
-    char *s2 );</para>
-
-    <para>I could then not use it to compare argv's in main: int main(
-    int argc, const char *argv[] ) { strcmp( argv[0], "privoxy"
-    ); }</para>
-
-    <para>Both these pointers are *const*! If the c runtime library
-    maintainers do it, we should too.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s30"><title>Pass and Return by Value</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Most structures cannot fit onto a normal stack entry (i.e.
-    they are not 4 bytes or less). Aka, a function declaration
-    like: int load_aclfile( struct client_state csp )</para>
-
-    <para>would not work. So, to be consistent, we should declare all
-    prototypes with "pass by value": int load_aclfile( struct
-    client_state *csp )</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s31"><title>Names of include files</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Your include statements should contain the file name without
-    a path. The path should be listed in the Makefile, using -I as
-    processor directive to search the indicated paths. An exception
-    to this would be for some proprietary software that utilizes a
-    partial path to distinguish their header files from system or
-    other header files.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#include &lt;iostream.h&gt;     /* This is not a local include */
-#include "config.h"       /* This IS a local include */
-</programlisting>
-
-    <para><emphasis>Exception:</emphasis></para>
-
-    <para>
-<programlisting>
-/* This is not a local include, but requires a path element. */ 
-#include &lt;sys/fileName.h&gt;
-</programlisting>
-</para>
-
-    <para><emphasis>Note:</emphasis> Please! do not add "-I." to the Makefile
-    without a _very_ good reason. This duplicates the #include
-    "file.h" behaviour.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s32"><title>Provide multiple inclusion
-    protection</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Prevents compiler and linker errors resulting from
-    redefinition of items.</para>
-
-    <para>Wrap each header file with the following syntax to prevent
-    multiple inclusions of the file. Of course, replace PROJECT_H
-    with your file name, with "." Changed to "_", and make it
-    uppercase.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#ifndef PROJECT_H_INCLUDED
-#define PROJECT_H_INCLUDED
- ...
-#endif /* ndef PROJECT_H_INCLUDED */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s33"><title>Use `extern "C"` when appropriate</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If our headers are included from C++, they must declare our
-    functions as `extern "C"`. This has no cost in C, but increases
-    the potential re-usability of our code.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* def __cplusplus */
-
-... function definitions here ...
-
-#ifdef __cplusplus
-}
-#endif /* def __cplusplus */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s34"><title>Where Possible, Use Forward Struct
-    Declaration Instead of Includes</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Useful in headers that include pointers to other struct's.
-    Modifications to excess header files may cause needless
-    compiles.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/*********************************************************************
- * We're avoiding an include statement here!
- *********************************************************************/
-struct file_list;
-extern file_list *xyz;</programlisting>
-
-    <para><emphasis>Note:</emphasis> If you declare "file_list xyz;" (without the
-    pointer), then including the proper header file is necessary.
-    If you only want to prototype a pointer, however, the header
-    file is unneccessary.</para>
-
-    <para><emphasis>Status:</emphasis> Use with discrection.</para>
-
-    
-  </sect3>
-  </sect2>
-
-    <sect2 id="s35"><title>General Coding Practices</title>
-
-    
-
-    <sect3 id="s36"><title>Turn on warnings</title>
-
-    <para><emphasis>Explanation</emphasis></para>
-
-    <para>Compiler warnings are meant to help you find bugs. You
-    should turn on as many as possible. With GCC, the switch is
-    "-Wall". Try and fix as many warnings as possible.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s37"><title>Provide a default case for all switch
-    statements</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>What you think is guaranteed is never really guaranteed. The
-    value that you don't think you need to check is the one that
-    someday will be passed. So, to protect yourself from the
-    unknown, always have a default step in a switch statement.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-switch( hash_string( cmd ) )
-{
-   case hash_actions_file :
-      ... code ...
-      break;
-
-   case hash_confdir :
-      ... code ...
-      break;
-
-   default :
-      log_error( ... );
-      ... anomly code goes here ...
-      continue; / break; / exit( 1 ); / etc ...
-
-} /* end switch( hash_string( cmd ) ) */</programlisting>
-
-    <para><emphasis>Note:</emphasis> If you already have a default condition, you
-    are obviously exempt from this point. Of note, most of the
-    WIN32 code calls `DefWindowProc' after the switch statement.
-    This API call *should* be included in a default statement.</para>
-
-    <para><emphasis>Another Note:</emphasis> This is not so much a readability issue
-    as a robust programming issue. The "anomly code goes here" may
-    be no more than a print to the STDERR stream (as in
-    load_config). Or it may really be an ABEND condition.</para>
-
-    <para><emphasis>Status:</emphasis> Programmer discretion is advised.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s38"><title>Try to avoid falling through cases in a
-    switch statement.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>In general, you will want to have a 'break' statement within
-    each 'case' of a switch statement. This allows for the code to
-    be more readable and understandable, and furthermore can
-    prevent unwanted surprises if someone else later gets creative
-    and moves the code around.</para>
-
-    <para>The language allows you to plan the fall through from one
-    case statement to another simply by omitting the break
-    statement within the case statement. This feature does have
-    benefits, but should only be used in rare cases. In general,
-    use a break statement for each case statement.</para>
-
-    <para>If you choose to allow fall through, you should comment both
-    the fact of the fall through and reason why you felt it was
-    necessary.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s39"><title>Use 'long' or 'short' Instead of
-    'int'</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>On 32-bit platforms, int usually has the range of long. On
-    16-bit platforms, int has the range of short.</para>
-
-    <para><emphasis>Status:</emphasis> open-to-debate. In the case of most FSF
-    projects (including X/GNU-Emacs), there are typedefs to int4,
-    int8, int16, (or equivalence ... I forget the exact typedefs
-    now). Should we add these to IJB now that we have a "configure"
-    script?</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s40"><title>Don't mix size_t and other types</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>The type of size_t varies across platforms. Do not make
-    assumptions about whether it is signed or unsigned, or about
-    how long it is. Do not compare a size_t against another
-    variable of a different type (or even against a constant)
-    without casting one of the values. Try to avoid using size_t if
-    you can.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s41"><title>Declare each variable and struct on its
-    own line.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>It can be tempting to declare a series of variables all on
-    one line. Don't.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-long a = 0;
-long b = 0;
-long c = 0;</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>long a, b, c;</para>
-
-    <para><emphasis>Explanation:</emphasis> - there is more room for comments on the
-    individual variables - easier to add new variables without
-    messing up the original ones - when searching on a variable to
-    find its type, there is less clutter to "visually"
-    eliminate</para>
-
-    <para><emphasis>Exceptions:</emphasis> when you want to declare a bunch of loop
-    variables or other trivial variables; feel free to declare them
-    on 1 line. You should, although, provide a good comment on
-    their functions.</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s42"><title>Use malloc/zalloc sparingly</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Create a local stuct (on the stack) if the variable will
-    live and die within the context of one function call.</para>
-
-    <para>Only "malloc" a struct (on the heap) if the variable's life
-    will extend beyond the context of one function call.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-If a function creates a struct and stores a pointer to it in a
-list, then it should definately be allocated via `malloc'.
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s43"><title>The Programmer Who Uses 'malloc' is
-    Responsible for Ensuring 'free'</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If you have to "malloc" an instance, you are responsible for
-    insuring that the instance is `free'd, even if the deallocation
-    event falls within some other programmer's code. You are also
-    responsible for ensuring that deletion is timely (i.e. not too
-    soon, not too late). This is known as "low-coupling" and is a
-    "good thing (tm)". You may need to offer a
-    free/unload/destuctor type function to accomodate this.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int load_re_filterfile( struct client_state *csp ) { ... }
-static void unload_re_filterfile( void *f ) { ... }</programlisting>
-
-    <para><emphasis>Exceptions:</emphasis></para>
-
-    <para>The developer cannot be expected to provide `free'ing
-    functions for C run-time library functions ... such as
-    `strdup'.</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection. The "main" use of this
-    standard is for allocating and freeing data structures (complex
-    or nested).</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s44"><title>Add loaders to the `file_list' structure
-    and in order</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>I have ordered all of the "blocker" file code to be in alpha
-    order. It is easier to add/read new blockers when you expect a
-    certain order.</para>
-
-    <para><emphasis>Note:</emphasis> It may appear that the alpha order is broken in
-    places by POPUP tests coming before PCRS tests. But since
-    POPUPs can also be referred to as KILLPOPUPs, it is clear that
-    it should come first.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s45"><title>"Uncertain" new code and/or changes to
-    exitinst code, use FIXME</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If you have enough confidence in new code or confidence in
-    your changes, but are not *quite* sure of the reprocussions,
-    add this:</para>
-
-    <para>/* FIXME: this code has a logic error on platform XYZ, *
-    attempthing to fix */ #ifdef PLATFORM ...changed code here...
-    #endif</para>
-
-    <para>or:</para>
-
-    <para>/* FIXME: I think the original author really meant this...
-    */ ...changed code here...</para>
-
-    <para>or:</para>
-
-    <para>/* FIXME: new code that *may* break something else... */
-    ...new code here...</para>
-
-    <para><emphasis>Note:</emphasis> If you make it clear that this may or may not
-    be a "good thing (tm)", it will be easier to identify and
-    include in the project (or conversly exclude from the
-    project).</para>
-
-    
-  </sect3>
-
-  </sect2>
-
-    <sect2 id="s46"><title>Addendum: Template for files and function
-    comment blocks:</title>
-
-    <para><emphasis>Example for file comments:</emphasis></para>
-<programlisting>
-const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $";
-/*********************************************************************
- *
- * File        :  $S<!-- Break CVS Substitution -->ource$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $L<!-- Break CVS Substitution -->og$
- *
- *********************************************************************/
-
-
-#include "config.h"
-
-   ...necessary include files for us to do our work...
-
-const char FILENAME_h_rcs[] = FILENAME_H_VERSION;
-</programlisting>
-
-    <para><emphasis>Note:</emphasis> This declares the rcs variables that should be
-    added to the "show-proxy-args" page. If this is a brand new
-    creation by you, you are free to change the "Copyright" section
-    to represent the rights you wish to maintain.</para>
-
-    <para><emphasis>Note:</emphasis> The formfeed character that is present right
-    after the comment flower box is handy for (X|GNU)Emacs users to
-    skip the verbige and get to the heart of the code (via
-    `forward-page' and `backward-page'). Please include it if you
-    can.</para>
-
-    <para><emphasis>Example for file header comments:</emphasis></para>
-<programlisting>
-#ifndef _FILENAME_H
-#define _FILENAME_H
-#define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $"
-/*********************************************************************
- *
- * File        :  $S<!-- Break CVS Substitution -->ource$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $L<!-- Break CVS Substitution -->og$
- *
- *********************************************************************/
-
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-   ... function headers here ...
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char FILENAME_rcs[];
-extern const char FILENAME_h_rcs[];
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef _FILENAME_H */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
-</programlisting>
-
-    <para><emphasis>Example for function comments:</emphasis></para>
-<programlisting>
-/*********************************************************************
- *
- * Function    :  FUNCTION_NAME
- *
- * Description :  (Fill me in with a good description!)
- *
- * parameters  :
- *          1  :  param1 = pointer to an important thing
- *          2  :  x      = pointer to something else
- *
- * Returns     :  0 => Ok, everything else is an error.
- *
- *********************************************************************/
-int FUNCTION_NAME( void *param1, const char *x )
-{
-   ...
-   return( 0 );
-
-}
-</programlisting>
-
-    <para><emphasis>Note:</emphasis> If we all follow this practice, we should be
-    able to parse our code to create a "self-documenting" web
-    page.</para>
-
-  </sect2>
-
-  </sect1>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="cvs"><title>Version Control Guidelines</title>
-    <para>To be filled. note on cvs comments. don't comment what you did, comment
-why you did it.
-</para>
-  </sect1>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="testing"><title>Testing Guidelines</title>
-    <para>To be filled.
-</para>
-
-    <!--   ~~~~~       New section      ~~~~~     -->
-    <sect2 id="testing-plan"><title>Testplan for releases</title>
-      <para>
-Explain release numbers. major, minor. developer releases. etc.
-
-<orderedlist numeration="arabic">
-          <listitem><para>
-Remove any existing rpm with rpm -e
-</para></listitem>
-          <listitem><para>
-Remove any file that was left over. This includes (but is not limited to)
-      <itemizedlist>
-                <listitem><para>/var/log/privoxy</para></listitem>
-                <listitem><para>/etc/privoxy</para></listitem>
-                <listitem><para>/usr/sbin/privoxy</para></listitem>
-                <listitem><para>/etc/init.d/privoxy</para></listitem>
-                <listitem><para>/usr/doc/privoxy*</para></listitem>
-              </itemizedlist>
-</para></listitem>
-          <listitem><para>
-Install the rpm. Any error messages?
-</para></listitem>
-          <listitem><para>start,stop,status <application>Privoxy</application> with the specific script
-      (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does
-      autostart work?</para></listitem>
-          <listitem><para>Start browsing. Does <application>Privoxy</application> work? Logfile written?</para></listitem>
-          <listitem><para>Remove the rpm. Any error messages? All files removed?</para></listitem>
-        </orderedlist>
-</para>
-    </sect2>
-
-    <!--   ~~~~~       New section      ~~~~~     -->
-    <sect2 id="testing-report"><title>Test reports</title>
-      <para>
-Please submit test reports only with the <ulink url="http://sourceforge.net/tracker/?func=add&amp;group_id=11118&amp;atid=395005">test form</ulink>
-at sourceforge. Three simple steps:
-        <itemizedlist>
-          
-          <listitem><para>Select category: the distribution you test on.</para></listitem>
-          <listitem><para>Select group: the version of <application>Privoxy</application> that we are about to release.</para></listitem>
-          <listitem><para>Fill the Summary and Detailed Description with something
-              intelligent (keep it short and precise).</para>
-          </listitem>
-        </itemizedlist>
-        Do not mail to the mailinglist (we cannot keep track on issues there).
-      </para>
-    </sect2>
-    
-  </sect1>
-  
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="contact"><title>Contact the developers</title>
-    <para>Please see the user manual for information on how to contact the developers.
-    </para>
-  </sect1>
-  
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="copyright"><title>Copyright and History</title>
-    <para>Please see the user manual for information on Copyright and History.
-    </para>
-  </sect1>
-  
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="seealso"><title>See also</title>
-    <para>Please see the user manual for information on references.
-    </para>
-  </sect1>
-
-  <!--
-
-  This program is free software; you can redistribute it 
-  and/or modify it under the terms of the GNU General
-  Public License as published by the Free Software
-  Foundation; either version 2 of the License, or (at
-  your option) any later version.
-
-  This program is distributed in the hope that it will
-  be useful, but WITHOUT ANY WARRANTY; without even the
-  implied warranty of MERCHANTABILITY or FITNESS FOR A
-  PARTICULAR PURPOSE.  See the GNU General Public
-  License for more details.
-
-  The GNU General Public License should be included with
-  this file.  If not, you can view it at
-  http://www.gnu.org/copyleft/gpl.html
-  or write to the Free Software Foundation, Inc., 59
-  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-  $Log: developer-manual.sgml,v $
-  Revision 1.12  2002/03/27 01:02:51  hal9
-  Touch up on name change...
-
-  Revision 1.11  2002/03/26 22:29:55  swa
-  we have a new homepage!
-
-  Revision 1.10  2002/03/24 12:33:01  swa
-  more additions.
-
-  Revision 1.9  2002/03/24 11:01:05  swa
-  name change
-
-  Revision 1.8  2002/03/23 15:13:11  swa
-  renamed every reference to the old name with foobar.
-  fixed "application foobar application" tag, fixed
-  "the foobar" with "foobar". left junkbustser in cvs
-  comments and remarks to history untouched.
-
-  Revision 1.7  2002/03/11 13:13:27  swa
-  correct feedback channels
-
-  Revision 1.6  2002/02/24 14:25:06  jongfoster
-  Formatting changes.  Now changing the doctype to DocBook XML 4.1
-  will work - no other changes are needed.
-
-  Revision 1.5  2001/10/31 18:16:51  swa
-  documentation added: howto generate docs in text and html
-  format, howto move stuff to the webserver.
-
-  Revision 1.4  2001/09/23 10:13:48  swa
-  upload process established. run make webserver and
-  the documentation is moved to the webserver. documents
-  are now linked correctly.
-
-  Revision 1.3  2001/09/13 15:27:40  swa
-  cosmetics
-
-  Revision 1.2  2001/09/13 15:20:17  swa
-  merged standards into developer manual
-
-  Revision 1.1  2001/09/12 15:36:41  swa
-  source files for junkbuster documentation
-
-  Revision 1.3  2001/09/10 17:43:59  swa
-  first proposal of a structure.
-
-  Revision 1.2  2001/06/13 14:28:31  swa
-  docs should have an author.
-
-  Revision 1.1  2001/06/13 14:20:37  swa
-  first import of project's documentation for the webserver.
-
-  -->
-
-</article>
diff --git a/doc/source/faq.sgml b/doc/source/faq.sgml
deleted file mode 100644 (file)
index bbbf493..0000000
+++ /dev/null
@@ -1,1431 +0,0 @@
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
-<!--
- File        :  $Source: /cvsroot/ijbswa/current/doc/source/faq.sgml,v $
-
- Purpose     :  FAQ
-                This file belongs into
-                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-                
- $Id: faq.sgml,v 1.31 2002/03/26 22:29:55 swa Exp $
-
- Written by and Copyright (C) 2001 the SourceForge
- Privoxy team. http://www.privoxy.org/
-
- Based on the Internet Junkbuster originally written
- by and Copyright (C) 1997 Anonymous Coders and 
- Junkbusters Corporation.  http://www.junkbusters.com
--->
-
-<article id="index">
-<artheader>
-<title>Privoxy Frequently Asked Questions</title>
-
-<pubdate>$Id: faq.sgml,v 1.31 2002/03/26 22:29:55 swa Exp $</pubdate>
-
-<authorgroup>
- <author>
-  <affiliation>
-   <orgname>By: Privoxy Developers</orgname>
-   </affiliation>
- </author>
-</authorgroup>
-
-<abstract>
- <para>
- This FAQ gives users and developers alike answers to frequently asked
- questions about <application>Privoxy</application>. 
- </para>
- <para>
- <application>Privoxy</application> is a web proxy with advanced filtering
- capabilities for protecting privacy, filtering web page content, managing
- cookies, controlling access, and removing ads, banners, pop-ups and other
- obnoxious Internet junk. <application>Privoxy</application> has a very
- flexible configuration and can be customized to suit individual needs and
- tastes. <application>Privoxy</application> has application for both
- stand-alone systems and multi-user networks.
-</para>
-<para>
- <application>Privoxy</application> is based on the code of the 
- <application>Internet Junkbuster</application>.
- <application>Junkbuster</application> was originally written by JunkBusters
- Corporation, and was released as free open-source software under the GNU GPL.
- Stefan Waldherr made many improvements, and started the SourceForge project
- to continue development.
-</para>
-
-
- <para>
-You can find the latest version of the document at <ulink url="http://www.privoxy.org/faq/">http://www.privoxy.org/faq/</ulink>.
-Please see the Contact section in the 
-<ulink url="http://www.privoxy.org/user-manual/contact.html">user-manual</ulink> if you want to contact the developers.
- </para>
-
-<!--   <para> -->
-<!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
-<!--   </para> -->
-</abstract>
-</artheader>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<!--
-<sect1 id="introduction"><title>Introduction</title>
-<para>
-   Fillme.
-</para>
-</sect1>
--->
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect1 id="questions"><title>Frequently Asked Questions</title>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="general"><title>General Information</title>
-
-<sect3 id="newjb"><title>What is this new version of <application>Privoxy</application>?</title>
- <para>
-  The original <application>Internet Junkbuster</application> (tm) is a 
-  copyrighted product of <ulink url="http://www.junkbusters.com">Junkbusters
-  Corporation</ulink>. Development of this effort stopped some time ago as of
-  version 2.0.2. Stefan Waldherr started the ijbswa project on <ulink
-  url="http://ijbswa.sourceforge.net">Sourceforge</ulink> to rekindle
-  development. Other developers subsequently joined with Stefan, and have
-  since added many new features, refinements and enhancements. 
- </para>
- <para>
-  The new <application>Privoxy</application> started with the same
-  <application>Junkbuster</application> code base, but has changed
-  significantly at this point. 
- </para>
-
-</sect3>
-
-
-<sect3>
-<title id="whyprivoxy">Why <quote>Privoxy</quote>? Why a name change at all?</title>
-<para>
- <application>Privoxy</application> is for <quote>Privacy Enhancing Proxy</quote>.
- There are possible legal complications from the continued use of the 
- <application>Junkbuster</application> name, which is a trademark of 
- <ulink url="http://junkbusters.com">Junkbusters Corporation</ulink>.
- (There are no objections from Junkbusters Corporation to the 
- <application>Privoxy</application> project itself though, and they 
- in fact still share our ideals and goals.)
-</para>
-
-<para>
- The developers also believed that there so many changes from the original 
- code, that it was time to make a clean break from the past and make 
- a name in their own right, especially now with the pending release of 
- version 3.0.
-
-</para>
-</sect3>
-
-
-<sect3 id="differs"><title>How does it differ from the old <application>Junkbuster?</application></title>
- <para>
-   All the old features remain. The new <application>Privoxy</application> 
-   still blocks ads and banners, still manages cookies, and still helps protect
-   your privacy. But, these are all enhanced, and many new features have been 
-   added, all in the same vein.
- </para>
- <para>
-  The configuration has changed significantly as well. This is something that
-  users will notice right off the bat. The <quote>blocklist</quote> file does
-  not exist any more. This is replaced by <quote>actions</quote> files, such
-  as <filename>default.actions</filename>. This is where most of the per site
-  configuration is now.
-
- </para>
-</sect3>
-
-<sect3 id="features"><title>What are some of the new features?</title>
-<!--
- This section is in both user-manual and faq. Please keep in sync!!!
--->
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>
-   Integrated browser based configuration and control utility (<ulink
-   url="http://p.p">http://p.p</ulink>). Browser-based tracing of rule
-   and filter effects.
-  </para>
- </listitem> 
-<!--
- <listitem>
-  <para>
-   Modularized configuration that will allow for system wide settings, and
-   individual user settings. (not implemented yet, probably a 3.1 feature)
-  </para>
- </listitem> 
--->
- <listitem>
-  <para>
-    Blocking of annoying pop-up browser windows.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Support for Perl Compatible Regular Expressions in the configuration files, and 
-   generally a more sophisticated and flexible configuration syntax over
-   previous versions. 
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   GIF de-animation. 
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Web page content filtering (removes banners based on size,
-   invisible <quote>web-bugs</quote>, JavaScript, pop-ups, status bar abuse,
-   etc.)
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Bypass many click-tracking scripts (avoids script redirection).
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Multi-threaded (POSIX and native threads).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Auto-detection and re-reading of config file changes.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   User-customizable HTML templates (e.g. 404 error page).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Improved cookie management features (e.g. session based cookies).
-  </para>
-</listitem> 
-
- <listitem>
-  <para>
-   Builds from source on most UNIX-like systems. Packages available for: Linux
-   (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac OSX, OS/2, HP-UX 11 and AmigaOS.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   In addition, the configuration is much more powerful and versatile over-all.
-  </para>
-</listitem> 
-
- </itemizedlist>
-</para>
-
-</sect3>
-
-<sect3 id="proxymoron"><title>What is a <quote>proxy</quote>? How does
-<application>Privoxy</application> work? </title>
- <para>
-  When you connect to a web site with <application>Privoxy</application>, 
-  you are really connecting to your locally running version of 
-  <application>Privoxy</application>. <application>Privoxy</application>
-  intercepts your requests for the web page, and relays that to the 
-  <quote>real</quote> web site. The web site sends the HTTP data stream 
-  back to <application>Privoxy</application>, where
-  <application>Privoxy</application> can work its magic before it 
-  relays this data back to your web browser.
- </para>
-
- <para>
-  Since <application>Privoxy</application> sits between you and the 
-  WWW, it is in a position to intercept and completely manage all web traffic and 
-  HTTP content before it gets to your browser.
-  <application>Privoxy</application> uses various programming methods to do
-  this, all of which is under your control via the various configuration
-  files and options.
- </para>
-
- <para>
-  There are many kinds of proxies. <application>Privoxy</application> best 
-  fits the <quote>filtering proxy</quote> category.
- </para>
-
-</sect3>
-
-<sect3 id="browsers2"><title>My browser does the same things as
-<application>Privoxy</application>. Why should I use
-<application>Privoxy</application> at all?</title>
- <para>
-  Modern browsers do indeed have <emphasis>some</emphasis> of the same
-  functionality as <application>Privoxy</application>. Maybe this is
-  adequate for you. But <application>Privoxy</application> is much more
-  versatile and powerful, and can do a number of things that browsers just can't.
- </para>
- <para>
-  In addition, a proxy is good choice if you use multiple browsers, or 
-  have a LAN with multiple computers. This way all the configuration 
-  is in one place, and you don't have to maintain a similar configuration 
-  for possibly many browsers.
-
- </para>
-</sect3>
-
-
-
-<sect3 id="license"><title>Is there is a license or fee? What about a 
-warranty? Registration?</title>
- <para>
-  <application>Privoxy</application> is licensed under the 
-  GNU General Public License (GPL). It is free to use, copy, 
-  modify or distribute as you wish under the terms of this license.
-  See <ulink
-  url="http://www.gnu.org/copyleft/gpl.html">http://www.gnu.org/copyleft/gpl.html</ulink>
-  for specifics.
-  </para>
- <para>
-  There is no warranty of any kind, expressed, implied or otherwise. That is
-  something that would cost real money ;-) There is no registration either.
-  <application>Privoxy</application> really is <emphasis>free</emphasis>
-  in every respect!
-
- </para>
-</sect3>
-
-<sect3 id="jointeam"><title>I would like to help you, what do I do?</title>
-
-<sect4 id="jointeam-money"><title>Money Money Money</title>
-<para>
- We, of course, welcome donations and use the money for domain registering,
- regular world-wide get-togethers (hahaha). Anyway, we'll soon describe the
- process how to donate money to the team.
-</para>
-</sect4>
-
-<sect4 id="jointeam-work"><title>You want to work with us?</title>
-<para>
-   Well, helping the team is always a good idea. We welcome new developers,
-   RPM gurus or documentation makers. Simply get an account on sourceforge.net
-   and mail your id to the developer mailing list. Then read the
-   section Quickstart in the developers manual.
-</para>
-<para>
-Once we have added you to the team, you'll have write access to the CVS
-repository, and together we'll find a suitable task for you.
-</para>
-</sect4>
-
-</sect3>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="installation"><title>Installation</title>
-
-<sect3 id="whichbrowsers">
-<title>Which browsers are supported by <application>Privoxy</application>?</title>
-<para>
- Any browser that can be configured to use a <quote>proxy</quote>, which 
- is probably almost all browsers. Direct browser support is not necessary
- since <application>Privoxy</application> runs as a separate application and
- just exchanges standard HTML data with your browser.
-</para>
-</sect3>
-
-<sect3 id="whichos">
-<title>Which operating systems are supported?</title>
-<para>
- Right now Win32, Mac OSX, OS/2, AmigaOS, Linux, and many 
- flavors of Unix.
-</para>
-
-<para>
- Source code is available, so porting to other operating systems, 
- is always a possibility.
-
-</para>
-</sect3>
-
-<sect3 id="newinstall"><title>Can I install  
- <application>Privoxy</application> over <application>Junkbuster</application>?</title>
- <para>
-   We recommend you uninstall <application>Junkbuster</application>
-   first to minimize conflicts and confusion. You may want to 
-   save your old configuration files for future reference. The configuration
-   is substantially changed.
- </para>
- <para>
-  See the <ulink
-  url="http://www.privoxy.org/user-manual/">user-manual</ulink> for
-  platform specific installation instructions. [FIXME: This is meant for after
-  the name change for 3.0!]
- </para>
-</sect3>
-
-<sect3>
-<title id="firststep">I just installed <application>Privoxy</application>. Is there anything 
-special I have to do now?</title>
-
-<para>
- All browsers must be told to use <application>Privoxy</application> 
- as a proxy by specifying the correct proxy address and port number 
- in the appropriate configuration area for the browser. See below.
-
-</para>
-
-</sect3>
-
-
-<sect3 id="localhost"><title>What is the proxy address of <application>Privoxy</application>?</title>
- <para>
-  If you set up the <application>Privoxy</application> to run on
-  the computer you browse from (rather than your ISP's server or some
-  networked computer on a LAN), the proxy will be on <quote>localhost</quote>
-  (which is the special name used by every computer on the Internet to refer
-  to itself) and the port will be 8118 (unless you have <application>Privoxy</application> to run on a different port with the
-  <emphasis>listen-address</emphasis> config option). 
- </para>
- <para>
-  When configuring your browser's proxy settings you typically enter
-  the word <quote>localhost</quote> in the boxes next to <quote>HTTP</quote>
-  and <quote>Secure</quote> (HTTPS) and then the number <quote>8118</quote>
-  for <quote>port</quote>.  This tells your browser to send all web 
-  requests to <application>Privoxy</application> instead of directly to the 
-  Internet.
- </para>
- <para>
-  <application>Privoxy</application> can also be used to proxy for 
-  a Local Area Network. In this case, your would enter either the IP 
-  address of the LAN host where <application>Privoxy</application> 
-  is running, or the equivalent hostname. Port assignment would be 
-  same as above.
- </para>
- <para>
-  <application>Privoxy</application> does not currently handle
-  protocols such as FTP, SMTP, IM, IRC, ICQ, or other Internet
-  protocols. 
- </para>
-</sect3>
-
-<sect3>
-<title id="nothing">I just installed <application>Privoxy</application>, and nothing is happening.
-All the ads are there. What's wrong?</title>
-
-<para>
- Did you configure your browser to use <application>Privoxy</application> 
- as a proxy? It does not sound like it. See above. You might also try flushing
- the browser's caches to force a full re-reading of pages. You can verify 
- that <application>Privoxy</application> is running, and your browser 
- is correctly configured by entering the special URL: 
- <ulink url="http://p.p/">http://p.p/</ulink>. This should give you 
- a banner that says <quote>This is Privoxy</quote> and 
- access to <application>Privoxy's</application> internal configuration. 
- If you see this, then you are good to go. If not, the browser or 
- <application>Privoxy</application> are not set up correctly.
-
-</para>
-
-</sect3>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="configuration"><title>Configuration</title>
-
-<sect3 id="newconfig"><title>Can I use my old config files?</title>
- <para>
-   There are major changes to <application>Junkbuster</application> 
-   configuration from version 2.0.x to 2.9.x and later. The older files will
-   not work at all. If this is the case, you will need to re-enter your old
-   data into the new configuration structure. This is probably also a good 
-   recommendation even if upgrading from 2.9.x to 3.x since there were 
-   many minor changes along the way.
- </para>
-</sect3>
-
-<sect3>
-<title id="actionsfile">What is an <quote>actions</quote> file?</title>
-
-<para>
- <quote>actions</quote> files are where various actions that
- <application>Privoxy</application> might take, are configured. 
- Typically, you would define a set of default actions that apply 
- to all URLs, then add exceptions to these defaults.
-</para>
-<para>
- Actions can be defined on a per site basis, or for groups of sites. Actions
- can also be grouped together and then applied to one or more sites. There
- are many possible actions that might apply to any given site. As an example,
- if we are blocking cookies as one of our default
- <application>actions</application>, but need to accept cookies from a given
- site, we would define this in our <quote>actions</quote> file.
-
-</para>
-
-<para>
- <application>Privoxy</application> comes with several default
- <application>actions</application> files, with varying degrees 
- of filtering and blocking, as starting points for your own 
- configuration (see below).
-</para>
-
-</sect3>
-
-<sect3 id="actionss">
-<title>The <quote>actions</quote>concept confuses me. Please list 
-some of these <quote>actions</quote>.</title>
-<para>
- These are all explained in the 
- <ulink url="../user-manual/configuration.html#ACTIONSFILE">user-manual</ulink>.
- Please refer to that.
-</para>
-</sect3>
-
-
-<sect3>
-<title id="actconfig">How are actions files configured? What is the easiest
-way to do this?</title> 
-
-<para>
- The easiest way to do this, is to access <application>Privoxy</application>
- with your web browser at <ulink url="http://p.p/">http://p.p/</ulink>, 
- and then select 
- "<ulink url="http://www.privoxy.org/config/edit-actions">Edit the actions list</ulink>"
- from the selection list. You can also do this by editing the appropriate 
- file with a text editor.
-</para>
-
-<para>
- Please see the 
- <ulink
- url="../user-manual/configuration.html#ACTIONSFILE">user-manual</ulink> for a
- detailed explanation of these and other configuration files, and their
- various options and syntax.
-</para>
-</sect3>
-
-
-<!--
-FIXME: Commenting these out until we have some data there. HB 03/17/02.
-
-<sect3 id="yahoo"><title>How can I make my Yahoo account work?</title>
- <para>
-   Fillme.
- </para>
-</sect3>
-
-<sect3 id="hotmail"> <title>How can I make my Hotmail account work?</title>
-  <para>
-   Fillme.
-  </para>
-</sect3>
-
-<sect3 id="gmx"> <title>How can I make my GMX account work?</title>
- <para>
-   Fillme.
- </para>
-</sect3>
--->
-
-<sect3 id="configfiles"> <title>What are the differences between
-intermediate.action, basic.action, etc.?</title>
- <para>
-Configuring <application>Privoxy</application> is not easy. To help you get
-started, we provide you with three different default configurations. The
-following table shows you, which features are enabled in each configuration.
- </para>
- <para>
-<table frame=all><title>Default Configurations</title>
-<tgroup cols=5 align=left colsep=1 rowsep=1>
-<colspec colname=c1>
-<colspec colname=c2>
-<colspec colname=c3>
-<colspec colname=c4>
-<colspec colname=c5>
-<thead>
-<row>
-  <entry>Feature</entry>
-  <entry>default.action</entry>
-  <entry>basic.action</entry>
-  <entry>intermediate.action</entry>
-  <entry>advanced.action</entry>
-</row>
-</thead>
-
-<!--  <tfoot> -->
-<!--  <row> -->
-<!--    <entry>f1</entry> -->
-<!--    <entry>f2</entry> -->
-<!--    <entry>f3</entry> -->
-<!--    <entry>f4</entry> -->
-<!--    <entry>f5</entry> -->
-<!--  </row> -->
-<!--  </tfoot> -->
-
-<tbody>
-<!-- new row -->
-<row>
-  <entry>ad-filtering</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>blank image</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>de-animate GIFs</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>referer forging</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>jon's +no-cookies-keep (i.e. session cookies only)</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>no-popup windows</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>fast redirects</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>hide-referrer</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>hide-useragent</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>content-modification</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>feature-x</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry></entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>feature-y</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry></entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>feature-z</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry></entry>
-</row>
-<!-- finish -->
-</tbody>
-</tgroup>
-</table>
-</para>
-</sect3>
-
-<sect3 id="browseconfig"> <title>Why can I change the configuration with a
-browser? Does that not raise security issues?</title>
- <para>
-What I don't understand, is how I can browser edit the config file as a
-regular user, while the whole /etc/privoxy hierarchy belongs to the user
-"privoxy", with only 644 perms.
- </para>
- <para>
-When you use the browser-based editor, <application>Privoxy</application>
-itself is writing to the config files.  Because
-<application>Privoxy</application> is running as the user "privoxy", it can
-update the config files.
- </para>
- <para>
-If you don't like this, setting "enable-edit-actions 0" in the config file
-will disable the browser-based editor.  If you're that paranoid, you should
-also consider setting "enable-remote-toggle 0" to prevent browser-based
-enabling/disabling of <application>Privoxy</application>.
- </para>
- <para>
-Note that normally only local users can connect to <application>Privoxy</application>, so this is not
-(normally) a security problem.
- </para>
-</sect3>
-
-
-<sect3>
-<title id="filterfile">What is a <quote>default.filter</quote>?</title>
-<para>
- The <quote>default.filter</quote> file is used to <quote>filter</quote> any
- web page content. By <quote>filtering</quote> we mean it can modify, remove, 
- or change <emphasis>anything</emphasis> on the page, including HTML tags, and
- JavaScript. Regular expressions are used to accomplish this, and operate 
- on a line by line basis. This is potentially a very powerful feature, but
- requires some expertise. 
-</para>
-
-<para>
- If you are familiar with regular expressions, and HTML, you can look at 
- the provided <filename>default.filter</filename> with a text editor and see
- some of things it can be used for.
-</para>
-
-<para>
- Presently, there is no GUI editor option for this part of the configuration, 
- but you can disable/enable various sections of the included default 
- file with the <quote>Actions List Editor</quote> from your browser.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="lanconfig">How can I set up <application>Privoxy</application> to act as a proxy for my 
- LAN?</title>
-<para>
- By default, <application>Privoxy</application> only responds to requests 
- from localhost. To have it act as a server for a network, this needs to be 
- changed in the main config file where the <application>Privoxy</application>
- configuration is located. In that file is a <quote>listen-address</quote> 
- option. It may be commented out with a <quote>#</quote> symbol. Make sure 
- it is uncommented, and assign it the address of the LAN gateway interface, 
- and port number to use:
-</para>
-
-<para>
- <screen>
-  listen-address  192.168.1.1:8118
- </screen>
-</para>
-
-<para>
- Save the file, and restart <application>Privoxy</application>. Configure 
- all browsers on the network then to use this address and port number.
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="noseeum">Instead of ads, now I get a checkerboard pattern. I don't want to see anything.</title>
-<para>
- This is a configuration option for images that
- <application>Privoxy</application> is stopping. You have the choice <!-- of
- the --> <!-- <application>Privoxy</application> logo, --> a checkerboard
- pattern, a transparent 1x1 GIF image (aka <quote>blank</quote>), or a custom
- URL or your choice.
-</para>
-
-<para>
- If you want to see nothing, then change the <quote>+image-blocker</quote> 
- action to <quote>+image-blocker{blank}</quote>. This can be done from the 
- <quote>Edit Actions List</quote> selection at <ulink
- url="http://p.p/">http://p.p/</ulink>. Or by hand editing the appropriate 
- actions file. This will only effect what is defined as <quote>images</quote>
- though. 
-
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="whyseeum">Why would anybody want to see a checkerboard pattern?</title>
-<para>
- This can be helpful for troubleshooting problems. It might also be good 
- for anyone new to <application>Privoxy</application> so that they can 
- see if their favorite pages are displaying correctly, and
- <application>Privoxy</application> is not inadvertently removing something 
- important.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="blockedisugly">I see large red banners on some pages that say 
-<quote>Blocked</quote>. How do I get rid of this?</title>
-<para>
- These are URLs that match something in one of 
- <application>Privoxy's</application> block actions (+block). It is meant
- to be a warning so that you know something has been blocked and an easy way
- for you to see why. These are handled differently than what has been defined
- as <quote>images</quote> (e.g. ad banners). If you want them to be treated
- as if they were images, so that they can be made invisible, then move the
- offending URL from the <quote>+block</quote> section to the
- <quote>+imageblock</quote> section of your actions file. Alternately, you
- could modify the <quote><filename>block</filename></quote> HTML template that
- is used by <application>Privoxy</application> to display this, and make it
- something more to your liking.
-</para>
-
-</sect3>
-
-<sect3 id="otherproxy">
-<title>How can I make <application>Privoxy</application> work with other 
-proxies like <application>Squid</application>?</title>
-<para>
- This can be done. See the <ulink
- url="../user-manual/configuration.html#FORWARDING">user manual</ulink>, 
- which describes how to do this.
-
-</para>
-
-</sect3>
-
-</sect2>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="misc"><title>Miscellaneous</title>
-
-<sect3>
-<title id="slowsme">How much does <application>Privoxy</application> slow my browsing down? This 
-has to add extra time to browsing.</title>
-<para>
- It should not slow you down any in real terms, and may actually help 
- speed things up since ads, banners and other junk are not being displayed.
- The actual processing time required by <application>Privoxy</application> 
- itself for each page, is relatively small in the overall scheme of things,
- and happens very quickly. This is typically more than offset by time saved
- not downloading and rendering ad images.
-</para>
-
-<para>
- <quote>Filtering</quote> via the <filename>filterfile</filename> 
- mechanism may cause a perceived slowdown, since the entire page is buffered
- before displaying. See below.
-</para>
-
-</sect3>
-
-
-
-<sect3 id="loadingtimes"><title>I noticed considerable
-delays in page requests compared to the old Junkbuster. What's wrong?</title>
-<para>
-Using the default filtering configuration, I noticed considerable delays in
-page requests compared to the old Junkbuster. Loading pages with large contents
-seemed to take forever, then suddenly delivering all the content at once.
- </para>
-<para>
-The whole content must be loaded in order to filter, and nothing is is
-sent to the browser during this time. The loading time does not really
-change in real numbers, but the feeling is different, because most
-browsers are able to start rendering incomplete content, giving the
-user a feeling of "it works". 
- </para>
-<para>
-To modify the content of a page (i.e. make frames resizeable again, etc.) and
-not just replace ads, <application>Privoxy</application> needs to download the
-entire page first, do its content magic and then send the page to the browser.
-</para>
-</sect3>
-
-
-<sect3 id="configurl"><title>What is the "http://p.p/"?</title>
-<para>
-Since <application>Privoxy</application> sits between your web browser and the Internet, it can be
-programmed to handle certain pages specially.
-</para>
-
-<para>
-With recent versions of <application>Privoxy</application> (version 2.9.x), you can get some
-information about <application>Privoxy</application> and change some settings by going to
-http://p.p/ or, equivalently, http://www.privoxy.org/config/
-(Note that p.p is far easier to type but may not work in some
-configurations).
-</para>
-
-<para>
-These pages are *not* forwarded to a server on the Internet - instead they are
-handled by a special web server which is built in to <application>Privoxy</application>.
-</para>
-
-<para>
-If you are not running <application>Privoxy</application>, then http://p.p/ will fail, and
-http://www.privoxy.org/config/ will return a web page telling you
-you're not running <application>Privoxy</application>.
-</para>
-
-<para>
-If you have version 2.0.2, then the equivalent is
-http://example.com/show-proxy-args (but you get far less information, and you
-should really consider upgrading to 2.9.x).
-</para>
-</sect3>
-
-<!--
-FIXME: commented out until we have data. HB 03/18/02.
-
-<sect3 id="badfiledesc"><title>I get the message 'Bad File Descriptor', why?</title>
-<para>
-   Fillme.
-</para>
-</sect3>
-
-<sect3 id="proxy-chaining"><title>How do I chain <application>Privoxy</application> with other proxies
-(e.g. squid)?</title>
-<para>
-   Fillme.
-</para>
-</sect3>
--->
-
-<sect3 id="blocklist"><title>Do you still maintain the blocklists?</title>
-<para>
-    No. The format of the blocklists has changed significantly in the versions
-    2.9.x. Once we have released the new version, there will again be
-    blocklists that you can update automatically.
-</para>
-</sect3>
-
-<sect3 id="newads"><title>How can I submit new ads?</title>
-<para>
-    As of now, please discontinue to submit new ad blocking infos. Once we
-    have released the new version, there will again be a form on the website,
-    which you can use to contribute new ads.
-</para>
-</sect3>
-
-<sect3 id="ip"><title>How can I hide my IP address?</title>
-<para>
- You cannot hide your IP address with <application>Privoxy</application> or any other software, since
-the server needs to know your IP address to send the answer to you.
-</para>
-<para>
-Fortunately there are many publicly usable anonymous proxies out there, which
-solve the problem by providing a further level of indirection between you and
-the web server, shared by many people and thus letting your requests "drown"
-in white noise of unrelated requests as far as user tracking is concerned.
-</para>
-<para>
-Most of them will, however, log your IP address and make it available to the
-authorities in case you abuse that anonymity for criminal purposes. In fact
-you can't even rule out that some of them only exist to *collect* information
-on (those suspicious) people with a more than average preference for privacy.
-</para>
-<para>
-You can find a list of anonymous public proxies at <ulink
-url="http://www.multiproxy.org/anon_list.htm">multiproxy.org</ulink> and many
-more through Google.
-</para>
-</sect3>
-
-<!--  <sect3 id="image"><title>What is the imagefile (simage.ini, etc.) for?</title> -->
-<!--  <para> -->
-<!--   Anytime <application>Privoxy</application> determines (with the help of the blocklist) that a URL -->
-<!--   contains an advertisement, it has to decide whether this advertisement is an -->
-<!--   image or not. <application>Privoxy</application> uses the imagefile for that purpose. -->
-<!--  </para> -->
-<!--  </sect3> -->
-
-<sect3>
-<title id="anonforsure">Can <application>Privoxy</application> guarantee I am anonymous?</title>
-<para>
- No. Your chances of remaining anonymous are greatly improved, but unless you
- are an expert on Internet security it would be safest to assume that
- everything you do on the Web can be traced back to you.
-</para>
-<para>
- <application>Privoxy</application> can remove various information about you,
- and allows <emphasis>you</emphasis> more freedom  to decide which sites 
- you can trust. But it's still possible that web sites can find out who you
- are. Here's one way this can happen.
-</para>
-<para>
- A few browsers disclose the user's email address in certain situations, such
- as when transferring a file by FTP. <application>Privoxy</application>
- does not filter FTP. If you need this feature, or are concerned about the
- mail handler of your browser disclosing your email address, you might
- consider products such as <application>NSClean</application>.
-</para>
-<para>
- Browsers available only as binaries could use non-standard headers to give
- out any information they can have access to: see the manufacturer's license
- agreement. It's impossible to anticipate and prevent every breach of privacy
- that might occur. The professionally paranoid prefer browsers available as
- source code, because anticipating their behavior is easier. Trust the source,
- Luke!
-</para>
-
-</sect3>
-
-<sect3>
-<title id="sitebreak">Might some things break because header information is
-being altered?</title>
-
-<para>
- Definitely. More and more sites use HTTP header content to decide what to
- display and how to display it. There is many ways that this can be handled, 
- so having hard and fast rules, is tricky.
-</para>
-
-<para>
- <quote>USER AGENT</quote> in particular is often used in this way to identify
- the browser, and adjust content accordingly. Changing this now is not
- recommended, since so many sites do look for this. You may get undesirable 
- results by changing this.
-</para>
-
-<para>
- For instance, different browsers use different encodings of Russian and Czech
- characters, certain web servers convert pages on-the-fly according to the
- User Agent header. Giving a <quote>User Agent</quote> with the wrong
- operating system or browser manufacturer causes some sites in these languages
- to be garbled; Surfers to Eastern European sites should change it to
- something closer. And then some page access counters work by looking at the
- <quote>REFERER</quote> header; they may fail or break if unavailable. The
- weather maps of Intellicast have been blocked by their server when no
- <quote>REFERER</quote> or cookie is provided, is another example. There are
- many, many other ways things can go wrong when trying to fool a web server.
-</para>
-
-<para>
- If you have problems with a site, you will have to adjust your configuration 
- accordingly. Cookies are probably the most likely adjustment that may 
- be required, but by no means the only one.
-
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="caching">Can <application>Privoxy</application> act as a <quote>caching</quote> proxy to 
-speed up web browsing?</title>
-<para>
- No, it does not have this ability at all. You want something like 
- <ulink url="http://www.squid-cache.org/">Squid</ulink> for this. And, yes, 
- before you ask, <application>Privoxy</application> can co-exist 
- with other kinds of proxies like <quote>Squid</quote>.
-</para>
-</sect3>
-
-<sect3>
-<title id="firewall">What about as a firewall? Can <application>Privoxy</application> protect me?</title>
-<para>
- Not in the way you mean, or in the way a true firewall can, or a proxy that
- has this specific capability. <application>Privoxy</application> can help
- protect your privacy, but not really protect you from intrusion attempts.
-</para>
-</sect3>
-
-
-<sect3>
-<title id="logo">The <application>Privoxy</application> logo that replaces ads is very blocky 
-and ugly looking. Can't a better font be used?</title>
-
-<para>
- This is not a font problem. The logo is an image that is created by 
- <application>Privoxy</application> on the fly. So as to not waste 
- memory, the image is rather small. The blockiness comes when the 
- image is scaled to fill a largish area. There is not much to be done 
- about this, other than to use one of the other
- <quote>imageblock</quote> directives: <emphasis>pattern</emphasis>, 
- <emphasis>blank</emphasis>, or a URL of your choosing.
-</para>
-<para>
-Given the above problem, we have decided to remove the logo option entirely 
-[as of v2.9.13].
-</para>
-</sect3>
-
-
-<sect3>
-<title id="wasted">I have large empty spaces now where ads used to be. 
-Why does <application>Privoxy</application> leave these large gaps?</title>
-<para>
- It would be easy enough to just eliminate this space altogether, rather than
- fill it with blank space. But, this would create problems with many pages
- that use the overall size of the ad to help organize the page layout and
- position the various components of the page where they were intended to be.
- It is best left this way.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="ssl">How can <application>Privoxy</application> filter Secure (HTTPS) URLs?</title>
-<para>
- This is a limitation since HTTPS transactions are encrypted SSL sessions
- between your browser and the secure site, and are meant to be reliably 
- <emphasis>secure</emphasis> and private. This means that all cookies and HTTP
- header information are also encrypted from the time they leave your browser,
- to the site, and vice versa. <application>Privoxy</application> does not
- try to unencrypt this information, so it just passes through as is.
- <application>Privoxy</application> can still catch images and ads that
- are embedded in the SSL stream though.
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="secure"><application>Privoxy</application> runs as a <quote>server</quote>. How 
-secure is it? Do I need to take any special precautions?</title>
-<para>
- There are no known exploits that might effect
- <application>Privoxy</application>. On Unix-like systems, 
- <application>Privoxy</application> can run as a non-privileged 
- user, which is how we recommend it be run. Also, by default 
- <application>Privoxy</application> only listens to requests 
- from <quote>localhost</quote>. It is not itself directly exposed to the
- Internet in this configuration. If you want to have
- <application>Privoxy</application> serve as a LAN proxy, this will have to
- be opened up to allow for LAN requests. In this case, we'd recommend
- you specify only the LAN gateway address, e.g. 192.168.1.1 in the main 
- <application>Privoxy</application> config file. All LAN hosts can then use 
- this as their proxy address in the browser proxy configuration. In this way, 
- <application>Privoxy</application> will not listen on any external ports.
- Of course, a firewall is always good too. Better safe than sorry.
-</para>
-
-</sect3>
-
-<sect3 id="turnoff">
-<title>How can I temporarily disable <application>Privoxy</application>?</title>
-<para>
- The easiest way is to access <application>Privoxy</application> with your 
- browser by using the special URL: <ulink url="http://p.p/">http://p.p/</ulink>
- and select "Toggle Privoxy on or off" from that page.
-
-</para>
-</sect3>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title id="trouble">Troubleshooting</title>
-
-<sect3>
-<title id="refused">I just upgraded and am getting <quote>connection refused</quote>
-with every web page?</title>
-<para>
- Either <application>Privoxy</application> is not running, or your 
- browser is configured for a different port than what
- <application>Privoxy</application> is using.
-</para>
-
-<para>
- The old <application>Privoxy</application> (and also
- <application>Junkbuster</application>) used port 8000 by 
- default. This has been changed to port 8118 now, due to a conflict 
- with NAS (Network Audio Service), which uses port 8000. If you haven't, 
- you need to change your browser to the new port number, or alternately 
- change <application>Privoxy's</application> <quote>listen-address</quote>
- setting in the <filename>config</filename> file used to start 
- <application>Privoxy</application>.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="flushit">I just added a new rule, but the steenkin ad is 
-still getting through. How?</title>
-<para>
- If the ad had been displayed before you added its URL, it will probably be
- held in the browser's cache for some time, so it will be displayed without
- the need for any request to the server, and <application>Privoxy</application>
- will not be in the picture. The best thing to do is try flushing the browser's
- caches. And then try again.
-</para>
-
-<para>
- If this doesn't help, you probably have an error in the rule you
- applied. Try pasting the full URL of the offending ad into <ulink
- url="http://www.privoxy.org/config/show-url-info">http://www.privoxy.org/config/show-url-info</ulink>
- and see if any actions match your new rule.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="badsite">One of my favorite sites does not work with <application>Privoxy</application>.
-What can I do?</title>
-
-<para>
- First verify that it is indeed a <application>Privoxy</application> problem, 
- by disabling <application>Privoxy</application> filtering and blocking. 
- Go to <ulink url="http://p.p/">http://p.p/</ulink> and click on 
- <quote>Toggle Privoxy On or Off</quote>, then disable it. Now try that 
- page again.
-</para>
-
-<para>
- If still a problem, go to <quote>Show which actions apply to a URL and
- why</quote> from <ulink url="http://p.p/">http://p.p/</ulink> and paste
- the full URL of the page in question into the prompt. See which actions are
- being applied to the URL. Now, armed with this information, go to <quote>Edit
- the actions list</quote>. Here you should see various sections that have
- various <application>Privoxy</application> features disabled for specific
- sites. Disabled <quote>actions</quote> will have a <quote>-</quote> (minus
- sign) in front of them. Add your problem page URL to one of these sections
- that looks like it is disabling the feature that is causing the
- problem. Re-try the page. There might be some trial and error involved. This
- is discussed in a little more detail in the <ulink
- url="../user-manual/appendix.html#ACTIONSANAT">user-manual
- appendix</ulink>.
-
-</para>
-
-<para>
- Alternately, if you are comfortable with a text editor, you can accomplish 
- the same thing by editing the appropriate <quote>actions</quote> file.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="time">What time is it?</title>
-<para>
- Time for you to go!
-</para>
-</sect3>
-
-</sect2>
-
-</sect1>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<!--
-FIXME: Commented out until we have something to put here. HB 03/18/02.
-<sect1 id="knownissues"><title>Known Issues</title>
-<para>
-   Fillme.
-</para>
-</sect1>
--->
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<!--
-
-This is referenced in the doc header already. HB 03/25/02
-
-<sect1 id="contact"><title>Contact the developers</title>
-<para>Please see the user manual for information on how to contact the developers.
-</para>
-</sect1>
--->
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="copyright"><title>Copyright and History</title>
-<para>Please see the user manual for information on Copyright and History.
-</para>
-</sect1>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="seealso"><title>See also</title>
-<para>Please see the user manual for information on references.
-</para>
-</sect1>
-
-<!-- hhmts end -->
- <!--
- Tue 09/11/01 06:38:14 PM EST: Test SGML doc by Hal Burgiss.
- Last modified: Mon Sep 10 19:22:09 CEST 2001
- This program is free software; you can redistribute it 
- and/or modify it under the terms of the GNU General
- Public License as published by the Free Software
- Foundation; either version 2 of the License, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will
- be useful, but WITHOUT ANY WARRANTY; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A
- PARTICULAR PURPOSE.  See the GNU General Public
- License for more details.
-
- The GNU General Public License should be included with
- this file.  If not, you can view it at
- http://www.gnu.org/copyleft/gpl.html
- or write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-$Log: faq.sgml,v $
-Revision 1.31  2002/03/26 22:29:55  swa
-we have a new homepage!
-
-Revision 1.30  2002/03/25 16:39:22  hal9
-A few new sections. Made all links relative to user-manual.
-
-Revision 1.29  2002/03/25 05:23:57  hal9
-Moved section, and touch ups.
-
-Revision 1.28  2002/03/25 04:27:33  hal9
-New section related to name change.
-
-Revision 1.25  2002/03/24 16:08:08  swa
-we are too lazy to make a block-built
-privoxy logo. hence removed the option.
-
-Revision 1.24  2002/03/24 15:46:20  swa
-name change related issue.
-
-Revision 1.23  2002/03/24 12:33:01  swa
-more additions.
-
-Revision 1.22  2002/03/24 11:51:00  swa
-name change. changed filenames.
-
-Revision 1.21  2002/03/24 11:01:06  swa
-name change
-
-Revision 1.20  2002/03/23 15:13:11  swa
-renamed every reference to the old name with foobar.
-fixed "application foobar application" tag, fixed
-"the foobar" with "foobar". left junkbustser in cvs
-comments and remarks to history untouched.
-
-Revision 1.19  2002/03/21 17:01:54  hal9
-Some touch ups.
-
-Revision 1.18  2002/03/18 16:40:31  hal9
-More additions.
-
-Revision 1.17  2002/03/18 03:53:53  hal9
-Some new additions.
-
-Revision 1.16  2002/03/17 21:32:56  hal9
-A few more additions.
-
-Revision 1.15  2002/03/17 07:25:59  hal9
-Correcting some of my typos, and some additions.
-
-Revision 1.14  2002/03/17 02:39:13  hal9
-A little more added ...
-
-Revision 1.13  2002/03/17 00:22:20  hal9
-Adding new stuff, and trying to incorporate stuff from old faq.
-
-Revision 1.12  2002/03/11 20:13:21  swa
-typo
-
-Revision 1.11  2002/03/11 18:42:27  swa
-new section
-
-Revision 1.10  2002/03/11 13:13:27  swa
-correct feedback channels
-
-Revision 1.9  2002/03/10 23:34:04  swa
-more info on not hiding ip address
-
-Revision 1.8  2002/03/09 15:55:48  swa
-added default config section
-
-Revision 1.7  2002/03/07 18:16:55  swa
-looks better
-
-Revision 1.6  2002/03/07 13:16:31  oes
-Committing changes by Stefan
-
-Revision 1.5  2002/03/02 15:50:04  swa
-2.9.11 version. more input for docs.
-
-Revision 1.4  2002/02/24 14:34:24  jongfoster
-Formatting changes.  Now changing the doctype to DocBook XML 4.1
-will work - no other changes are needed.
-
-Revision 1.3  2001/09/23 10:13:48  swa
-upload process established. run make webserver and
-the documentation is moved to the webserver. documents
-are now linked correctly.
-
-Revision 1.2  2001/09/13 15:20:17  swa
-merged standards into developer manual
-
-Revision 1.1  2001/09/12 15:36:41  swa
-source files for junkbuster documentation
-
-Revision 1.3  2001/09/10 17:43:59  swa
-first proposal of a structure.
-
-Revision 1.2  2001/06/13 14:28:31  swa
-docs should have an author.
-
-Revision 1.1  2001/06/13 14:20:37  swa
-first import of project's documentation for the webserver.
-
--->
-
-</article>
diff --git a/doc/source/ldp.dsl b/doc/source/ldp.dsl
deleted file mode 100644 (file)
index e4352a5..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [\r
-<!ENTITY % html "IGNORE">\r
-<![%html;[\r
-<!ENTITY % print "IGNORE">\r
-<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets/html/docbook.dsl" CDATA dsssl>\r
-]]>\r
-<!ENTITY % print "INCLUDE">\r
-<![%print;[\r
-<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets/print/docbook.dsl" CDATA dsssl>\r
-]]>\r
-]>\r
-\r
-<!--\r
-\r
-;; borrowed from the LDP stylesheet, with modifications, HB.\r
-;; Added support for css 03/20/02, and other mods.\r
-\r
--->\r
-\r
-<style-sheet>\r
-\r
-<style-specification id="print" use="docbook">\r
-<style-specification-body> \r
-\r
-;; ==============================\r
-;; customize the print stylesheet\r
-;; ==============================\r
-\r
-</style-specification-body>\r
-</style-specification>\r
-\r
-\r
-<!--\r
-;; ===================================================\r
-;; customize the html stylesheet; borrowed from Cygnus\r
-;; at http://sourceware.cygnus.com/ (cygnus-both.dsl)\r
-;; ===================================================\r
--->\r
-\r
-<style-specification id="html" use="docbook">\r
-<style-specification-body> \r
-\r
-;; this is necessary because right now jadetex does not understand\r
-;; symbolic entities, whereas things work well with numeric entities.\r
-(declare-characteristic preserve-sdata?\r
-  "UNREGISTERED::James Clark//Characteristic::preserve-sdata?"\r
-  #f)\r
-\r
-;; put the legal notice in a separate file\r
-(define %generate-legalnotice-link%\r
-  #t)\r
-\r
-;; use graphics in admonitions, and have their path be "stylesheet-images"\r
-;; NO: they do not yet look very good\r
-(define %admon-graphics-path%\r
-  "./stylesheet-images/")\r
-\r
-(define %admon-graphics%\r
-  #f)\r
-\r
-(define %funcsynopsis-decoration%\r
-  ;; make funcsynopsis look pretty\r
-  #t)\r
-\r
-(define %html-ext%\r
-  ".html")\r
-\r
-(define %generate-article-toc% \r
-  ;; Should a Table of Contents be produced for Articles?\r
-  ;; If true, a Table of Contents will be generated for each 'Article'.\r
-  #t)\r
-\r
-(define %root-filename%\r
-  ;; The filename of the root HTML document (e.g, "index").\r
-  "index")\r
-\r
-(define %generate-part-toc%\r
-  #t)\r
-\r
-(define %shade-verbatim%\r
-  #t)\r
-\r
-(define %use-id-as-filename%\r
-  ;; Use ID attributes as name for component HTML files?\r
-  #t)\r
-\r
-(define %graphic-default-extension% \r
-  "gif")\r
-\r
-(define %section-autolabel%\r
-  ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.)\r
-  #t)\r
-\r
-;; HB changed TOC depth to 3 levels.\r
-(define (toc-depth nd)\r
-  3)\r
-\r
-;; HB added 03/20/02, see dbparam.dsl ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
-\r
-(define %body-attr% \r
-  ;; REFENTRY body-attr\r
-  ;; PURP What attributes should be hung off of BODY?\r
-  ;; DESC\r
-  ;; A list of the the BODY attributes that should be generated.\r
-  ;; The format is a list of lists, each interior list contains the\r
-  ;; name and value of a BODY attribute.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  (list\r
-   (list "BGCOLOR" "#EEEEEE")\r
-   (list "TEXT" "#000000")\r
-   (list "LINK" "#0000FF")\r
-   (list "VLINK" "#840084")\r
-   (list "ALINK" "#0000FF")))\r
-\r
-(define %stylesheet%\r
-  ;; REFENTRY stylesheet\r
-  ;; PURP Name of the stylesheet to use\r
-  ;; DESC\r
-  ;; The name of the stylesheet to place in the HTML LINK TAG, or '#f' to\r
-  ;; suppress the stylesheet LINK.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  "../p_doc.css")\r
-\r
-(define %stylesheet-type%\r
-  ;; REFENTRY stylesheet-type\r
-  ;; PURP The type of the stylesheet to use\r
-  ;; DESC\r
-  ;; The type of the stylesheet to place in the HTML LINK TAG.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  "text/css")\r
-\r
-(define %css-liststyle-alist%\r
-  ;; REFENTRY css-liststyle-alist\r
-  ;; PURP Map DocBook OVERRIDE and MARK attributes to CSS\r
-  ;; DESC\r
-  ;; If '%css-decoration%' is turned on then the list-style-type property of\r
-  ;; list items will be set to reflect the list item style selected in the\r
-  ;; DocBook instance.  This associative list maps the style type names used\r
-  ;; in your instance to the appropriate CSS names.  If no mapping exists,\r
-  ;; the name from the instance will be used.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  '(("bullet" "disc")\r
-    ("box" "square")))\r
-\r
-(define %css-decoration%\r
-  ;; REFENTRY css-decoration\r
-  ;; PURP Enable CSS decoration of elements\r
-  ;; DESC\r
-  ;; If '%css-decoration%' is turned on then HTML elements produced by the\r
-  ;; stylesheet may be decorated with STYLE attributes.  For example, the\r
-  ;; LI tags produced for list items may include a fragment of CSS in the\r
-  ;; STYLE attribute which sets the CSS property "list-style-type".\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  #t)\r
-\r
-\r
-</style-specification-body>\r
-</style-specification>\r
-\r
-<external-specification id="docbook" document="docbook.dsl">\r
-\r
-</style-sheet>\r
diff --git a/doc/source/user-manual.sgml b/doc/source/user-manual.sgml
deleted file mode 100644 (file)
index 1e9723e..0000000
+++ /dev/null
@@ -1,4197 +0,0 @@
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
-<!--
- File        :  $Source: /cvsroot/ijbswa/current/doc/source/user-manual.sgml,v $
-
- Purpose     :  user manual
-                This file belongs into
-                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-                
- $Id: user-manual.sgml,v 1.59 2002/03/27 00:54:33 hal9 Exp $
-
- Written by and Copyright (C) 2001 the SourceForge
- Privoxy team. http://www.privoxy.org/
-
- Based on the Internet Junkbuster originally written
- by and Copyright (C) 1997 Anonymous Coders and 
- Junkbusters Corporation.  http://www.junkbusters.com
--->
-
-<!--
-Sat 03/02/02 04:53:47 PM
-
-This should be ready for BETA release.
-
-Hal Burgiss <hal@foobox.net>
--->
-
-<article id="index">
-<artheader>
-<title>Privoxy User Manual</title>
-
-<pubdate>$Id: user-manual.sgml,v 1.59 2002/03/27 00:54:33 hal9 Exp $</pubdate>
-
-<authorgroup>
- <author>
-  <affiliation>
-   <orgname>By: Privoxy Developers</orgname>
-   </affiliation>
- </author>
-</authorgroup>
-
-<abstract>
- <para>
-  The user manual gives users information on how to install, configure and use
-  <application>Privoxy</application>. <application>Privoxy</application> is a
-  web proxy with advanced filtering capabilities for protecting privacy,
-  filtering web page content, managing cookies, controlling access, and
-  removing ads, banners, pop-ups and other obnoxious Internet
-  Junk. <application>Privoxy</application> has a very flexible configuration
-  and can be customized to suit individual needs and
-  tastes. <application>Privoxy</application> has application for both
-  stand-alone systems and multi-user networks.
- </para>
- <para>
-You can find the latest version of the user manual at  <ulink url="http://www.privoxy.org/user-manual/">http://www.privoxy.org/user-manual/</ulink>.
- </para>
-
-<!--   <para> -->
-<!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
-<!--   </para> -->
-</abstract>
-
-</artheader>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect1 id="introduction"><title>Introduction</title>
-<para>
- <application>Privoxy</application> is a web proxy with advanced filtering
- capabilities for protecting privacy, filtering web page content, managing
- cookies, controlling access, and removing ads, banners, pop-ups and other
- obnoxious Internet junk. <application>Privoxy</application> has a very
- flexible configuration and can be customized to suit individual needs and
- tastes. <application>Privoxy</application> has application for both
- stand-alone systems and multi-user networks.
-</para>
-
-<para>
- <application>Privoxy</application> is based on the code of the 
- <application>Internet Junkbuster</application>.
- <application>Junkbuster</application> was originally written by JunkBusters
- Corporation, and was released as free open-source software under the GNU GPL.
- Stefan Waldherr made many improvements, and started the SourceForge project
- to continue development.
-</para>
-
-<para>
- <application>Privoxy</application> continues the
- <application>Junkbuster</application> tradition, but adds many 
- refinements and enhancements.
-</para>
-
-<para>
- This documentation is included with the current BETA version of
- <application>Privoxy</application> and is mostly complete at this
- point. The most up to date reference for the time being is still the comments
- in the source files and in the individual configuration files. Development
- of version 3.0 is currently nearing completion, and includes many significant
- changes and enhancements over earlier versions. The target release date for
- stable v3.0 is <quote>soon</quote> ;-)
-</para>
-
-<para>
- Since this is a BETA version, not all new features are well tested. This
- documentation may be slightly out of sync as a result (especially with 
- CVS sources). And there <emphasis>may be</emphasis> bugs, though hopefully
- not many! 
-</para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2>
-<title>New Features</title>
-<para>
- In addition to <application>Internet Junkbuster's</application> traditional
- feature of ad and banner blocking and cookie management,
- <application>Privoxy</application> provides new features, some of them
- currently under development:
-</para>
-
-<!--
- The section is in both user-manual and faq. Please keep in sync.
--->
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>
-   Integrated browser based configuration and control utility (<ulink
-   url="http://p.p">http://p.p</ulink>). Browser-based tracing of rule
-   and filter effects.
-  </para>
- </listitem> 
-<!--
- <listitem>
-  <para>
-   Modularized configuration that will allow for system wide settings, and
-   individual user settings. (not implemented yet, probably a 3.1 feature)
-  </para>
- </listitem> 
--->
- <listitem>
-  <para>
-    Blocking of annoying pop-up browser windows.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Support for Perl Compatible Regular Expressions in the configuration files, and 
-   generally a more sophisticated and flexible configuration syntax over
-   previous versions. 
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   GIF de-animation. 
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Web page content filtering (removes banners based on size,
-   invisible <quote>web-bugs</quote>, JavaScript, pop-ups, status bar abuse,
-   etc.)
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Bypass many click-tracking scripts (avoids script redirection).
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Multi-threaded (POSIX and native threads).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Auto-detection and re-reading of config file changes.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   User-customizable HTML templates (e.g. 404 error page).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Improved cookie management features (e.g. session based cookies).
-  </para>
-</listitem> 
-
- <listitem>
-  <para>
-   Builds from source on most UNIX-like systems. Packages available for: Linux
-   (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac OSX, OS/2, HP-UX 11 and AmigaOS.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   In addition, the configuration is much more powerful and versatile over-all.
-  </para>
-</listitem> 
-
- </itemizedlist>
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="installation"><title>Installation</title>
-<para>
- <application>Privoxy</application> is available as raw source code, or
- pre-compiled binaries. See the <ulink
- url="http://sourceforge.net/projects/ijbswa/">Privoxy Home Page</ulink>
- for binaries and current release info. <application>Privoxy</application>
- is also available via <ulink
- url="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/current/">CVS</ulink>.
- This is the recommended approach at this time. But please be aware that CVS 
- is constantly changing, and it may break in mysterious ways.
-</para>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-source"><title>Source</title>
-<para>
- For gzipped tar archives, unpack the source:
-</para>
-
-<para>
- <screen>
- tar xzvf privoxy-2.9.13-beta-src* [.tgz or .tar.gz]
- cd privoxy-2.9.13-beta
- </screen>
-</para>
-
-<para>
- For retrieving the current CVS sources, you'll need the CVS 
- package installed first. To download CVS source:
-</para>
-
-<para>
- <screen>
-  cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
-  cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co current
-  cd current
- </screen>
-</para>
-
-<para>
- This will create a directory named <filename>current/</filename>, which will 
- contain the source tree.
-</para>
-
-<para>
- Then, in either case, to build from tarball/CVS source:
-</para>
-
-<para>
- <screen>
- ./configure      (--help to see options)
- make             (the make from gnu, gmake for *BSD) 
- su 
- make -n install  (to see where all the files will go)
- make install     (to really install)
- </screen>
-</para>
-
-<para>
- For Redhat and SuSE Linux RPM packages, see below.
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-rh"><title>Red Hat</title>
-<para>
- To build Redhat RPM packages, install source as above. Then:
-</para>
-
-<para>
- <screen>
- autoheader
- autoconf
- ./configure
- make redhat-dist
- </screen>
-</para>
-
-<para>
- This will create both binary and src RPMs in the usual places. Example:
-</para>
-
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-</para>
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/redhat/SRPMS/privoxy-2.9.11-1.src.rpm
-</para>
-
-<para>
- To install, of course:
-</para>
-
-<para>
- <screen>
- rpm -Uvv /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
- </screen>
-</para>
-
-<para>
- This will place the <application>Privoxy</application> configuration 
- files in <filename>/etc/privoxy/</filename>, and log files in 
- <filename>/var/log/privoxy/</filename>.
-</para>
-
-</sect2>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-suse"><title>SuSE</title>
-<para>
- To build SuSE RPM packages, install source as above. Then:
-</para>
-
-<para>
- <screen>
- autoheader
- autoconf
- ./configure
- make suse-dist
- </screen>
-</para>
-
-<para>
- This will create both binary and src RPMs in the usual places. Example:
-</para>
-
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-</para>
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/packages/SRPMS/privoxy-2.9.11-1.src.rpm
-</para>
-
-<para>
- To install, of course:
-</para>
-
-<para>
- <screen>
- rpm -Uvv /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
- </screen>
-</para>
-
-<para>
- This will place the <application>Privoxy</application> configuration 
- files in <filename>/etc/privoxy/</filename>, and log files in 
- <filename>/var/log/privoxy/</filename>.
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-os2"><title>OS/2</title>
-
-<!--
-Thanx David Schmidt!
--->
-
-<para>
- <application>Privoxy</application> is packaged in a WarpIN self-
- installing archive.  The self-installing program will be named depending
- on the release version, something like:
- <filename>ijbos2_setup_1.2.3.exe</filename>.  In order to install it, simply
- run this executable or double-click on its icon and follow the WarpIN
- installation panels.  A shadow of the <application>Privoxy</application>
- executable will be placed in your startup folder so it will start 
- automatically whenever OS/2 starts.
-</para>
-
-<para>
- The directory you choose to install <application>Privoxy</application>
- into will contain all of the configuration files.
-</para>
-
-<para>
- If you would like to build binary images on OS/2 yourself, you will need
- a few Unix-like tools: autoconf, autoheader and sh.  These tools will be
- used to create the required config.h file, which is not part of the 
- source distribution because it differs based on platform.  You will also
- need a compiler.
- The distribution has been created using IBM VisualAge compilers, but you
- can use any compiler you like.  GCC/EMX has the disadvantage of needing 
- to be single-threaded due to a limitation of EMX's implementation of the
- select() socket call.
-</para>
-
-<para>
- In addition to needing the source code distribution as outlined earlier,
- you will want to extract the <filename>os2seutp</filename> directory from CVS:
- <screen>
- cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login          
- cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co os2setup
- </screen>
- This will create a directory named os2setup/, which will contain the
- <filename>Makefile.vac</filename> makefile and <filename>os2build.cmd</filename>
- which is used to completely create the binary distribution.  The sequence
- of events for building the executable for yourself goes something like this:
- <screen>
- cd current
- autoheader
- autoconf
- sh configure
- cd ..\os2setup
- nmake -f Makefile.vac
- </screen>
- You will see this sequence laid out in <filename>os2build.cmd</filename>.
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-win"><title>Windows</title>
-<para>Click-click. (I need help on this. Not a clue here. Also for 
-configuration section below. HB.)
-</para>
-</sect2>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-other"><title>Other</title>
-<para>
- Some quick notes on other Operating Systems.
-</para>
-
-<para>
- For FreeBSD (and other *BSDs?), the build will require <command>gmake</command> 
- instead of the included <command>make</command>. <command>gmake</command> is
- available from <ulink url="http://www.gnu.org">http://www.gnu.org</ulink>.
- The rest should be the same as above for Linux/Unix.
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="configuration"><title><application>Privoxy</application> Configuration</title>
- <para>
-  All <application>Privoxy</application> configuration is kept 
-  in text files. These files can be edited with a text editor.
-  Many important aspects of <application>Privoxy</application> can 
-  also be controlled easily with a web browser.
-
- </para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Controlling <application>Privoxy</application> with Your Web Browser</title>
-<para>
- <application>Privoxy</application> can be reached by the special 
- URL <ulink url="http://p.p/">http://p.p/</ulink> (or alternately
- <ulink url="http://www.privoxy.org/config/">http://www.privoxy.org/config/</ulink>), 
- which is an internal page. You will see the following section:
-
-</para>
-
-<para>
- <screen>
-
-Please choose from the following options:
-
-    * Show information about the current configuration
-    * Show the source code version numbers
-    * Show the client's request headers.
-    * Show which actions apply to a URL and why
-    * Toggle Privoxy on or off
-    * Edit the actions list
-
- </screen>
-</para>
-
-<para>
- This should be self-explanatory. Note the last item is an editor for the
- <quote>actions list</quote>, which is where much of the ad, banner, cookie,
- and URL blocking magic is configured as well as other advanced features of
- <application>Privoxy</application>. This is an easy way to adjust various
- aspects of <application>Privoxy</application> configuration. The actions
- file, and other configuration files, are explained in detail below. 
- <application>Privoxy</application> will automatically detect any changes 
- to these files.
-</para>
-
-<para>
- <quote>Toggle Privoxy On or Off</quote> is handy for sites that might 
- have problems with your current actions and filters, or just to test if 
- a site misbehaves, whether it is <application>Privoxy</application> 
- causing the problem or not. <application>Privoxy</application> continues 
- to run as a proxy in this case, but all filtering is disabled.
-
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Configuration Files Overview</title>
-<para>
- For Unix, *BSD and Linux, all configuration files are located in
- <filename>/etc/privoxy/</filename> by default. For MS Windows, OS/2, and
- AmigaOS these are all in the same directory as the 
- <application>Privoxy</application> executable. The name and number of
- configuration files has changed from previous versions, and is subject to
- change as development progresses.
-</para>
-
-<para>
- The installed defaults provide a reasonable starting point, though possibly
- aggressive by some standards. For the time being, there are only three
- default configuration files (this will change in time):
-</para>
-
-<para>
- <itemizedlist>
-
-  <listitem>
-   <para>
-     The main configuration file is named <filename>config</filename>
-     on Linux, Unix, BSD, OS/2, and AmigaOS and <filename>config.txt</filename>
-     on Windows.
-   </para>
-  </listitem> 
-
-  <listitem>
-   <para>
-    The <filename>default.action</filename> file is used  to define various 
-    <quote>actions</quote> relating to images, banners, pop-ups, access
-    restrictions, banners and cookies. There is a CGI based editor for this
-    file that can be accessed via <ulink
-    url="http://p.p">http://p.p</ulink>. (Other actions 
-    files are included as well with differing levels of filtering 
-    and blocking, e.g. <filename>ijb-basic.action</filename>.)
-   </para>
-  </listitem> 
-
-  <listitem>
-   <para>
-    The <filename>default.filter</filename> file can be used to re-write the raw
-    page content, including viewable text as well as embedded HTML and JavaScript,
-    and whatever else lurks on any given web page.
-   </para>
-  </listitem> 
-
- </itemizedlist>
-</para>
-
-<para>
- <filename>default.action</filename> and <filename>default.filter</filename> 
- can use Perl style regular expressions for maximum flexibility. All files use
- the <quote><literal>#</literal></quote> character to denote a comment. Such
- lines are not processed by <application>Privoxy</application>. After
- making any changes, there is no need to restart
- <application>Privoxy</application> in order for the changes to take
- effect. <application>Privoxy</application> should detect such changes 
- automatically.
-</para>
-
-<para>
- While under development, the configuration content is subject to change. 
- The below documentation may not be accurate by the time you read this. 
- Also, what constitutes a <quote>default</quote> setting, may change, so 
- please check all your configuration files on important issues.
-</para>
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>The Main Configuration File</title>
-<para>
- Again, the main configuration file is named <filename>config</filename> on
- Linux/Unix/BSD and OS/2, and <filename>config.txt</filename> on Windows.
- Configuration lines consist of an initial keyword followed by a list of
- values, all separated by whitespace (any number of spaces or tabs). For
- example:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>blockfile blocklist.ini</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Indicates that the blockfile is named <quote>blocklist.ini</quote>. (A 
- default installation does not use this.)
-</para>
-
-<para>
- A <quote><literal>#</literal></quote> indicates a comment.  Any part of a
- line following a <quote><literal>#</literal></quote> is ignored, except if
- the <quote><literal>#</literal></quote> is preceded by a
- <quote><literal>\</literal></quote>.
-</para>
-
-<para>
- Thus, by placing a <quote><literal>#</literal></quote> at the start of an
- existing configuration line, you can make it a comment and it will be treated
- as if it weren't there. This is called <quote>commenting out</quote> an
- option and can be useful to turn off features: If you comment out the
- <quote>logfile</quote> line, <application>Privoxy</application> will not
- log to a file at all. Watch for the <quote>default:</quote> section in each
- explanation to see what happens if the option is left unset (or commented
- out). 
-</para>
-
-<para>
- Long lines can be continued on the next line by using a
- <quote><literal>\</literal></quote> as the very last character.
-</para>
-
-<para>
- There are various aspects of <application>Privoxy</application> behavior 
- that can be tuned.
-</para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Defining Other Configuration Files</title>
-
-<para>
- <application>Privoxy</application> can use a number of other files to tell it
- what ads to block, what cookies to accept, etc.  This section of the
- configuration file tells <application>Privoxy</application> where to find
- all those other files. 
-</para>
-
-<para>
- On <application>Windows</application> and <application>AmigaOS</application>,
- <application>Privoxy</application> looks for these files in the same
- directory as the executable.  On Unix and  OS/2,
- <application>Privoxy</application> looks for these files in the current
- working directory. In either case, an absolute path name can be used to
- avoid problems.
-</para>
-
-<para>
- When development goes modular and multi-user, the blocker, filter, and
- per-user config will be stored in subdirectories of <quote>confdir</quote>.
- For now, only <filename>confdir/templates</filename> is used for storing HTML
- templates for CGI results. 
-</para>
-
-<para>
- The location of the configuration files:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>confdir  /etc/privoxy</emphasis>       # No trailing /, please.
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The directory where all logging (i.e. <filename>logfile</filename> and 
- <filename>jarfile</filename>) takes place. No trailing
- <quote><literal>/</literal></quote>, please: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>logdir  /var/log/privoxy</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note that all file specifications below are relative to 
- the above two directories!
-</para>
-
-<para>
- The <quote>default.action</quote> file contains patterns to specify the
- actions to apply to requests for each site. Default: Cookies to and from all
- destinations are kept only during the current browser session (i.e. they are
- not saved to disk). Pop-ups are disabled for all sites. All sites are
- filtered through selected sections of <quote>default.filter</quote>. No sites
- are blocked. <application>Privoxy</application> displays a checkboard type
- pattern for filtered ads and other images. The syntax of this file is
- explained in detail <link linkend="actionsfile">below</link>. Other
- <quote>actions</quote> files are included, and you are free to use any of
- them. They have varying degrees of aggressiveness.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>actionsfile  default.action</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The <quote>default.filter</quote> file contains content modification rules 
- that use <quote>regular expressions</quote>. These rules permit powerful
- changes on the content of Web pages, e.g., you could disable your favorite
- JavaScript annoyances, re-write the actual displayed text, or just have some
- fun replacing <quote>Microsoft</quote> with <quote>MicroSuck</quote> wherever
- it appears on a Web page. Default: whatever the developers are playing with
- :-/
-</para>
-
-<para>
- Filtering requires buffering the page content, which may appear to slow down
- page rendering since nothing is displayed until all content has passed 
- the filters. (It does not really take longer, but seems that way since 
- the page is not incrementally displayed.) This effect will be more noticeable
- on slower connections.
-
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>filterfile  default.filter</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The logfile is where all logging and error messages are written. The logfile
- can be useful for tracking down a problem with
- <application>Privoxy</application> (e.g., it's not blocking an ad you
- think it should block) but in most cases you probably will never look at it.
-</para>
-
-<para>
- Your logfile will grow indefinitely, and you will probably want to
- periodically remove it.  On Unix systems, you can do this with a cron job
- (see <quote>man cron</quote>). For Redhat, a <command>logrotate</command> 
- script has been included.
-</para>
-
-<para>
- On SuSE Linux systems, you can place a line like <quote>/var/log/privoxy.*
- +1024k 644 nobody.nogroup</quote> in <filename>/etc/logfiles</filename>, with
- the effect that cron.daily will automatically archive, gzip, and empty the
- log, when it exceeds 1M size.
-</para>
-
-<para>
- Default: Log to the a file named <filename>logfile</filename>. 
- Comment out to disable logging.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>logfile  logfile</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The <quote>jarfile</quote> defines where
- <application>Privoxy</application> stores the cookies it intercepts.  Note
- that if you use a <quote>jarfile</quote>, it may grow quite large. Default:
- Don't store intercepted cookies.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#jarfile  jarfile</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you specify a <quote>trustfile</quote>,
- <application>Privoxy</application> will only allow access to sites that
- are named in the trustfile. You can also mark sites as trusted referrers,
- with the effect that access to untrusted sites will be granted, if a link
- from a trusted referrer was used. The link target will then be added to the
- <quote>trustfile</quote>. This is a very restrictive feature that typical
- users most probably want to leave disabled. Default: Disabled, don't use the
- trust mechanism.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#trustfile  trust</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-<para>
- If you use the trust mechanism, it is a good idea to write up some on-line
- documentation about your blocking policy and to specify the URL(s) here. They
- will appear on the page that your users receive when they try to access
- untrusted content. Use multiple times for multiple URLs. Default: Don't
- display links on the <quote>untrusted</quote> info page.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>trust-info-url http://www.your-site.com/why_we_block.html</emphasis>
-  <emphasis>trust-info-url http://www.your-site.com/what_we_allow.html</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Other Configuration Options</title>
-
-<para>
- This part of the configuration file contains options that control how
- <application>Privoxy</application> operates.
-</para>
-
-<para>
- <quote>Admin-address</quote> should be set to the email address of the proxy
- administrator. It is used in many of the proxy-generated pages. Default:
- fill@me.in.please.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#admin-address  fill@me.in.please</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <quote>Proxy-info-url</quote> can be set to a URL that contains more info
- about this <application>Privoxy</application> installation, it's
- configuration and policies. It is used in many of the proxy-generated pages
- and its use is highly recommended in multi-user installations, since your
- users will want to know why certain content is blocked or modified. Default:
- Don't show a link to on-line documentation.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>proxy-info-url  http://www.your-site.com/proxy.html</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <quote>Listen-address</quote> specifies the address and port where
- <application>Privoxy</application> will listen for connections from your
- Web browser.  The default is to listen on the localhost port 8118, and
- this is suitable for most users.  (In your web browser, under proxy
- configuration, list the proxy server as <quote>localhost</quote> and the
- port as <quote>8118</quote>).
-</para>
-
-<para>
- If you already have another service running on port 8118, or if you want to
- serve requests from other machines (e.g. on your local network) as well, you
- will need to override the default. The syntax is 
- <quote>listen-address [&lt;ip-address&gt;]:&lt;port&gt;</quote>. If you leave
- out the IP address, <application>Privoxy</application> will bind to all
- interfaces (addresses) on your machine and may become reachable from the
- Internet. In that case, consider using access control lists (acl's) (see
- <quote>aclfile</quote> above), or a firewall.
-</para>
-
-<para>
- For example, suppose you are running <application>Privoxy</application> on
- a machine which has the address 192.168.0.1 on your local private network
- (192.168.0.0) and has another outside connection with a different address.
- You want it to serve requests from inside only:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>listen-address  192.168.0.1:8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you want it to listen on all addresses (including the outside
- connection):
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>listen-address  :8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you do this, consider using ACLs (see <quote>aclfile</quote> above). Note:
- you will need to point your browser(s) to the address and port that you have
- configured here. Default: localhost:8118 (127.0.0.1:8118).
-</para>
-
-<para>
- The debug option sets the level of debugging information to log in the
- logfile (and to the console in the Windows version).  A debug level of 1 is
- informative because it will show you each request as it happens.  Higher
- levels of debug are probably only of interest to developers.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  debug         1 # GPC   = show each GET/POST/CONNECT request
-  debug         2 # CONN  = show each connection status
-  debug         4 # IO    = show I/O status
-  debug         8 # HDR   = show header parsing
-  debug        16 # LOG   = log all data into the logfile
-  debug        32 # FRC   = debug force feature
-  debug        64 # REF   = debug regular expression filter 
-  debug       128 #       = debug fast redirects
-  debug       256 #       = debug GIF de-animation
-  debug       512 # CLF   = Common Log Format
-  debug      1024 #       = debug kill pop-ups
-  debug      4096 # INFO  = Startup banner and warnings.
-  debug      8192 # ERROR = Non-fatal errors
-    </literallayout>
-  </msgtext>
- </literal>
-</para>
-
-<para>
- It is <emphasis>highly recommended</emphasis> that you enable ERROR
- reporting (debug 8192), at least until v3.0 is released.
-</para>
-
-<para>
- The reporting of FATAL errors (i.e. ones which crash 
- <application>Privoxy</application>) is always on and cannot be disabled.
-</para>
-
-<para>
- If you want to use CLF (Common Log Format), you should set <quote>debug
- 512</quote> ONLY, do not enable anything else.
-</para>
-
-<para>
- Multiple <quote>debug</quote> directives, are OK - they're logical-OR'd
- together. 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>debug    15     # same as setting the first 4 listed above</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Default:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>debug   1     # URLs</emphasis>
-  <emphasis>debug   4096  # Info</emphasis>
-  <emphasis>debug   8192  # Errors - *we highly recommended enabling this*</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <application>Privoxy</application> normally uses
- <quote>multi-threading</quote>, a software technique that permits it to
- handle many different requests simultaneously. In some cases you may wish to
- disable this -- particularly if you're trying to debug a problem.  The
- <quote>single-threaded</quote> option forces
- <application>Privoxy</application> to handle requests sequentially.
- Default: Multi-threaded mode.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#single-threaded</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <quote>toggle</quote> allows you to temporarily disable all
- <application>Privoxy's</application>  filtering. Just set <quote>toggle
- 0</quote>.
-</para>
-
-<para>
- The Windows version of <application>Privoxy</application> puts an icon in
- the system tray, which also allows you to change this option.  If you
- right-click on that icon (or select the <quote>Options</quote> menu), one
- choice is <quote>Enable</quote>. Clicking on enable toggles
- <application>Privoxy</application> on and off. This is useful if you want
- to temporarily disable <application>Privoxy</application>, e.g., to access
- a site that requires cookies which you would otherwise have blocked. This can also
- be toggled via a web browser at the <application>Privoxy</application>
- internal address of <ulink url="http://p.p">http://p.p</ulink> on 
- any platform.
-</para>
-
-<para>
- <quote>toggle 1</quote> means <application>Privoxy</application> runs
- normally, <quote>toggle 0</quote> means that
- <application>Privoxy</application> becomes a non-anonymizing non-blocking
- proxy. Default: 1 (on). 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>toggle    1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- For content filtering, i.e. the <quote>+filter</quote> and
- <quote>+deanimate-gif</quote> actions, it is necessary that 
- <application>Privoxy</application> buffers the entire document body.
- This can be potentially dangerous, since a server could just keep sending
- data indefinitely and wait for your RAM to exhaust. With nasty consequences.
-</para>
-
-<para>
- The <application>buffer-limit</application> option lets you set the maximum
- size in Kbytes that each buffer may use. When the documents buffer exceeds
- this size, it is flushed to the client unfiltered and no further attempt to
- filter the rest of it is made. Remember that there may multiple threads
- running, which might require increasing the <quote>buffer-limit</quote>
- Kbytes <emphasis>each</emphasis>, unless you have enabled 
- <quote>single-threaded</quote> above.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>buffer-limit    4069</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- To enable the web-based <filename>default.action</filename> file editor set
- <application>enable-edit-actions</application> to 1, or 0 to disable.  Note
- that you must have compiled <application>Privoxy</application> with
- support for this feature, otherwise this option has no effect. This 
- internal page can be reached at <ulink
- url="http://p.p">http://p.p</ulink>.
- </para>
-
-<para>
- Security note: If this is enabled, anyone who can use the proxy
- can edit the actions file, and their changes will affect all users.
- For shared proxies, you probably want to disable this. Default: enabled.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>enable-edit-actions    1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Allow <application>Privoxy</application> to be toggled on and off
- remotely, using your web browser.  Set <quote>enable-remote-toggle</quote>to
- 1 to enable, and 0 to disable.  Note that you must have compiled 
- <application>Privoxy</application> with support for this feature,
- otherwise this option has no effect.
-</para>
-
-<para>
- Security note:  If this is enabled, anyone who can use the proxy can toggle
- it on or off (see <ulink url="http://p.p">http://p.p</ulink>), and
- their changes will affect all users. For shared proxies, you probably want to
- disable this. Default: enabled.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>enable-remote-toggle    1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Access Control List (ACL)</title>
-<para>
- Access controls are included at the request of some ISPs and systems
- administrators, and are not usually needed by individual users. Please note
- the warnings in the FAQ that this proxy is not intended to be a substitute
- for a firewall or to encourage anyone to defer addressing basic security
- weaknesses.
-</para>
-
-<para>
- If no access settings are specified, the proxy talks to anyone that
- connects. If any access settings file are specified, then the proxy
- talks only to IP addresses permitted somewhere in this file and not
- denied later in this file.
-</para>
-
-<para>
- Summary -- if using an ACL:
-</para>
-
- <simplelist>
-  <member>
-   Client must have permission to receive service.
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   LAST match in ACL wins.
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   Default behavior is to deny service.
-  </member>
- </simplelist>
-
-<para>
- The syntax for an entry in the Access Control List is:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  ACTION    SRC_ADDR[/SRC_MASKLEN]    [ DST_ADDR[/DST_MASKLEN] ]
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Where the individual fields are:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>ACTION</emphasis>      = <quote>permit-access</quote> or <quote>deny-access</quote>
-
- <emphasis>SRC_ADDR</emphasis>    = client hostname or dotted IP address
- <emphasis>SRC_MASKLEN</emphasis> = number of bits in the subnet mask for the source
-
- <emphasis>DST_ADDR</emphasis>    = server or forwarder hostname or dotted IP address
- <emphasis>DST_MASKLEN</emphasis> = number of bits in the subnet mask for the target
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-
-<para> 
- The field separator (FS) is whitespace (space or tab).
-</para>
-
-<para>
- IMPORTANT NOTE: If <application>Privoxy</application> is using a
- forwarder (see below) or a gateway for a particular destination URL, the
- <literal>DST_ADDR</literal> that is examined is the address of the forwarder
- or the gateway and <emphasis>NOT</emphasis> the address of the ultimate
- target. This is necessary because it may be impossible for the local
- <application>Privoxy</application> to determine the address of the
- ultimate target (that's often what gateways are used for).
-</para>
-
-<para>
- Here are a few examples to show how the ACL features work:
-</para>
-
-<para>
- <quote>localhost</quote> is OK -- no DST_ADDR implies that
- <emphasis>ALL</emphasis> destination addresses are OK:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access  localhost</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- A silly example to illustrate permitting any host on the class-C subnet with
- <application>Privoxy</application> to go anywhere:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    www.privoxy.com/24</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Except deny one particular IP address from using it at all:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>deny-access      ident.privoxy.com</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- You can also specify an explicit network address and subnet mask.
- Explicit addresses do not have to be resolved to be used.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    207.153.200.0/24</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- A subnet mask of 0 matches anything, so the next line permits everyone.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    0.0.0.0/0</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note, you <emphasis>cannot</emphasis> say:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    .org</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- to allow all *.org domains. Every IP address listed must resolve fully.
-</para>
-
-<para>
- An ISP may want to provide a <application>Privoxy</application> that is
- accessible by <quote>the world</quote> and yet restrict use of some of their
- private content to hosts on its internal network (i.e. its own subscribers).
- Say, for instance the ISP owns the Class-B IP address block 123.124.0.0 (a 16
- bit netmask). This is how they could do it:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>permit-access 0.0.0.0/0   0.0.0.0/0</emphasis>   # other clients can go anywhere 
-                                       # with the following exceptions:
- <emphasis>deny-access</emphasis>   0.0.0.0/0   123.124.0.0/16 # block all external requests for
-                                          # sites on the ISP's network
-
- <emphasis>permit 0.0.0.0/0   www.my_isp.com</emphasis>        # except for the ISP's main 
-                                          # web site
-
- <emphasis>permit 123.124.0.0/16 0.0.0.0/0</emphasis>          # the ISP's clients can go 
-                                          # anywhere
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note that if some hostnames are listed with multiple IP addresses, 
- the primary value returned by DNS (via gethostbyname()) is used. Default:
- Anyone can access the proxy.
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3 id="forwarding">
-<title>Forwarding</title>
-
-<para>
- This feature allows chaining of HTTP requests via multiple proxies.
- It can be used to better protect privacy and confidentiality when
- accessing specific domains by routing requests to those domains
- to a special purpose filtering proxy such as lpwa.com. Or to use 
- a caching proxy to speed up browsing.
-</para>
-
-<para>
- It can also be used in an environment with multiple networks to route
- requests via multiple gateways allowing transparent access to multiple
- networks without having to modify browser configurations.
-</para>
-
-<para>
- Also specified here are SOCKS proxies. <application>Privoxy</application>
- SOCKS 4 and SOCKS 4A. The difference is that SOCKS 4A will resolve the target
- hostname using DNS on the SOCKS server, not our local DNS client.
-</para>
-
-<para>
- The syntax of each line is:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward target_domain[:port] http_proxy_host[:port]</emphasis>
- <emphasis>forward-socks4  target_domain[:port] socks_proxy_host[:port] http_proxy_host[:port]</emphasis>
- <emphasis>forward-socks4a target_domain[:port] socks_proxy_host[:port] http_proxy_host[:port]</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If http_proxy_host is <quote>.</quote>, then requests are not forwarded to a
- HTTP proxy but are made directly to the web servers.
-</para>
-
-<para>
- Lines are checked in sequence, and the last match wins.
-</para>
-
-<para>
- There is an implicit line equivalent to the following, which specifies that
- anything not finding a match on the list is to go out without forwarding
- or gateway protocol, like so:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward   .*   .       </emphasis># implicit
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- In the following common configuration, everything goes to Lucent's LPWA,
- except SSL on port 443 (which it doesn't handle):
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward   .*     lpwa.com:8000</emphasis>
- <emphasis>forward   :443   .</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
-<!--
- See the FAQ for instructions on how to automate the login procedure for LPWA.
---> 
- Some users have reported difficulties related to LPWA's use of
- <quote>.</quote> as the last element of the domain, and have said that this
- can be fixed with this:
-</para>
-   
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward   lpwa.  lpwa.com:8000</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-<para>
- (NOTE: the syntax for specifying target_domain has changed since the
- previous paragraph was written -- it will not work now.  More information
- is welcome.)
-</para>
-
-<para>
- In this fictitious example, everything goes via an ISP's caching proxy,
- except requests to that ISP:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward    .*         caching.myisp.net:8000</emphasis>
- <emphasis>forward    myisp.net  .</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- For the @home network, we're told the forwarding configuration is this:
-</para>
-
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward    .*    proxy:8080</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Also, we're told they insist on getting cookies and JavaScript, so you should 
- allow cookies from home.com. We consider JavaScript a potential security risk.
- Java need not be enabled.
-</para>
-
-<para>
- In this example direct connections are made to all <quote>internal</quote>
- domains, but everything else goes through Lucent's LPWA by way of the
- company's SOCKS gateway to the Internet.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward-socks4  .*  lpwa.com:8000  firewall.my_company.com:1080</emphasis>
- <emphasis>forward    my_company.com  .</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- This is how you could set up a site that always uses SOCKS but no forwarders:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward-socks4a   .*  .  firewall.my_company.com:1080</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- An advanced example for network administrators:
-</para>
-
-<para>
- If you have links to multiple ISPs that provide various special content to
- their subscribers, you can configure forwarding to pass requests to the
- specific host that's connected to that ISP so that everybody can see all
- of the content on all of the ISPs.
-</para>
-
-<para>
- This is a bit tricky, but here's an example:
-</para>
-
-
-<para>
- host-a has a PPP connection to isp-a.com. And host-b has a PPP connection to
- isp-b.com. host-a can run a <application>Privoxy</application> proxy with
- forwarding like this: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward    .*         .</emphasis>
- <emphasis>forward    isp-b.com  host-b:8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- host-b can run a <application>Privoxy</application> proxy with forwarding
- like this: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward    .*          .</emphasis>
- <emphasis>forward    isp-a.com   host-a:8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Now, <emphasis>anyone</emphasis> on the Internet (including users on host-a
- and host-b) can set their browser's proxy to <emphasis>either</emphasis>
- host-a or host-b and be able to browse the content on isp-a or isp-b.
-</para>
-
-<para>
- Here's another practical example, for University of Kent at
- Canterbury students with a network connection in their room, who
- need to use the University's Squid web cache.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward  *. ssbcache.ukc.ac.uk:3128</emphasis>  # Use the proxy, except for:
- <emphasis>forward  .ukc.ac.uk            .    </emphasis> # Anything on the same domain as us
- <emphasis>forward  *                     .    </emphasis> # Host with no domain specified
- <emphasis>forward  129.12.*.*            .    </emphasis> # A dotted IP on our /16 network.
- <emphasis>forward  127.*.*.*             .    </emphasis> # Loopback address
- <emphasis>forward  localhost.localdomain .    </emphasis> # Loopback address
- <emphasis>forward  www.ukc.mirror.ac.uk  .    </emphasis> # Specific host
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you intend to chain <application>Privoxy</application> and 
- <application>squid</application> locally, then chain as 
- <literal>browser -> squid -> privoxy</literal> is the recommended way. 
-</para>
-
-<para>
- Your squid configuration could then look like this:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  # Define Privoxy as parent cache 
- <!-- per feedback from user...
-  cache_peer 127.0.0.1 8118 parent 0 no-query 
- --> 
-  cache_peer 127.0.0.1 parent 8118 0 no-query
-  
-  # Define ACL for protocol FTP 
-  acl FTP proto FTP 
-
-  # Do not forward ACL FTP to privoxy
-  always_direct allow FTP 
-
-  # Do not forward ACL CONNECT (https) to privoxy
-  always_direct allow CONNECT 
-
-  # Forward the rest to privoxy
-  never_direct allow all 
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Windows GUI Options</title>
-<!--
-Removed references to Win32. HB 09/23/01
--->
-<para>
- <application>Privoxy</application> has a number of options specific to the
- Windows GUI interface:
-</para>
-
-<para>
- If <quote>activity-animation</quote> is set to 1, the
- <application>Privoxy</application> icon will animate when
- <quote>Privoxy</quote> is active. To turn off, set to 0.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>activity-animation   1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If <quote>log-messages</quote> is set to 1,
- <application>Privoxy</application> will log messages to the console
- window:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-messages       1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para> 
- If <quote>log-buffer-size</quote> is set to 1, the size of the log buffer,
- i.e. the amount of memory used for the log messages displayed in the
- console window, will be limited to <quote>log-max-lines</quote> (see below).
-</para>
-
-<para>
- Warning: Setting this to 0 will result in the buffer to grow infinitely and
- eat up all your memory!
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-buffer-size      1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <application>log-max-lines</application> is the maximum number of lines held
- in the log buffer. See above.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-max-lines      200</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If <quote>log-highlight-messages</quote> is set to 1,
- <application>Privoxy</application> will highlight portions of the log
- messages with a bold-faced font:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-highlight-messages   1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The font used in the console window:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-font-name        Comic Sans MS</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Font size used in the console window:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-font-size        8</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>  
- <quote>show-on-task-bar</quote> controls whether or not
- <application>Privoxy</application> will appear as a button on the Task bar
- when minimized:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>show-on-task-bar     0</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If <quote>close-button-minimizes</quote> is set to 1, the Windows close
- button will minimize <application>Privoxy</application> instead of closing
- the program (close with the exit option on the File menu).
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>close-button-minimizes  1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The <quote>hide-console</quote> option is specific to the MS-Win console
- version of <application>Privoxy</application>. If this option is used,
- <application>Privoxy</application> will disconnect from and hide  the
- command console.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  #hide-console
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="actionsfile">
-<title>The Actions File</title>
-
-<para>
- The <quote>default.action</quote> file (formerly
- <filename>actionsfile</filename> or <filename>ijb.action</filename>) is used to define what actions
- <application>Privoxy</application> takes, and thus determines how images,
- cookies and various other aspects of HTTP content and transactions are
- handled. Images can be anything you want, including ads, banners, or just
- some obnoxious URL that you would rather not see. Cookies can be accepted
- or rejected, or accepted only during the current browser session (i.e. 
- not written to disk). Changes to <filename>default.action</filename> should 
- be immediately visible to <application>Privoxy</application> without 
- the need to restart.
-</para>
-
-<para>
- The easiest way to edit <quote>actions</quote> file is with a browser by
- loading <ulink url="http://p.p/">http://p.p/</ulink>, and then select
- <quote>Edit Actions List</quote>. A text editor can also be used.
-</para>
-
-<para>
- To determine which actions apply to a request, the URL of the request is
- compared to all patterns in this file. Every time it matches, the list of
- applicable actions for the URL is incrementally updated. You can trace
- this process by visiting <ulink
- url="http://p.p/show-url-info">http://p.p/show-url-info</ulink>. 
-</para>
-
-
-<para>
- There are four types of lines in this file: comments (begin with a 
- <quote>#</quote> character), actions, aliases and patterns, all of which are
- explained below, as well as the configuration file syntax that 
- <application>Privoxy</application> understands.
-
-</para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect3>
-<title>URL Domain and Path Syntax</title>
-<para>
- Generally, a pattern has the form &lt;domain&gt;/&lt;path&gt;, where both the
- &lt;domain&gt; and &lt;path&gt; part are optional. If you only specify a
- domain part, the <quote>/</quote> can be left out:
-</para>
-
-<para>
- <emphasis>www.example.com</emphasis> - is a domain only pattern and will match any request to
- <quote>www.example.com</quote>.
-</para>
-
-<para>
- <emphasis>www.example.com/</emphasis> - means exactly the same.
-</para>
-
-<para>
- <emphasis>www.example.com/index.html</emphasis> - matches only the single
- document <quote>/index.html</quote> on <quote>www.example.com</quote>.
-</para>
-
-<para>
- <emphasis>/index.html</emphasis> - matches the document <quote>/index.html</quote>, regardless of
- the domain.
-</para>
-
-<para>
- <emphasis>index.html</emphasis> - matches nothing, since it would be
- interpreted as a domain name and there is no top-level domain called
- <quote>.html</quote>.
-</para>
-
-<para>
- The matching of the domain part offers some flexible options: if the
- domain starts or ends with a dot, it becomes unanchored at that end. 
- For example:
-</para>
-
-<para>
- <emphasis>.example.com</emphasis> - matches any domain that <emphasis>ENDS</emphasis> in 
- <quote>.example.com</quote>.
-</para>
-
-<para>
- <emphasis>www.</emphasis> - matches any domain that <emphasis>STARTS</emphasis> with
- <quote>www</quote>.
-</para>
-
-<para>
- Additionally, there are wild-cards that you can use in the domain names
- themselves. They work pretty similar to shell wild-cards: <quote>*</quote>
- stands for zero or more arbitrary characters, <quote>?</quote> stands for
- any single character. And you can define character classes in square
- brackets and they can be freely mixed:
-</para>
-
-<para>
- <emphasis>ad*.example.com</emphasis> - matches <quote>adserver.example.com</quote>, 
- <quote>ads.example.com</quote>, etc but not <quote>sfads.example.com</quote>.
-</para>
-
-<para>
- <emphasis>*ad*.example.com</emphasis> - matches all of the above, and then some.
-</para>
-
-<para>
- <emphasis>.?pix.com</emphasis> - matches <quote>www.ipix.com</quote>,
- <quote>pictures.epix.com</quote>, <quote>a.b.c.d.e.upix.com</quote>, etc. 
-</para>
-
-<para>
- <emphasis>www[1-9a-ez].example.com</emphasis> - matches <quote>www1.example.com</quote>, 
- <quote>www4.example.com</quote>, <quote>wwwd.example.com</quote>, 
- <quote>wwwz.example.com</quote>, etc., but <emphasis>not</emphasis> 
- <quote>wwww.example.com</quote>.
-</para>
-
-<para>
- If <application>Privoxy</application> was compiled with
- <quote>pcre</quote> support (default), Perl compatible regular expressions
- can be used. See the <filename>pcre/docs/</filename> directory or <quote>man
- perlre</quote> (also available on  <ulink
- url="http://www.perldoc.com/perl5.6/pod/perlre.html">http://www.perldoc.com/perl5.6/pod/perlre.html</ulink>)
- for details. A brief discussion of regular expressions is in the 
- <link linkend="regex">Appendix</link>. For instance:
-</para>
-
-<para>
- <emphasis>/.*/advert[0-9]+\.jpe?g</emphasis>  - would match a URL from any
- domain, with any path that includes <quote>advert</quote> followed
- immediately by one or more digits, then a <quote>.</quote> and ending in
- either <quote>jpeg</quote> or <quote>jpg</quote>. So we match
- <quote>example.com/ads/advert2.jpg</quote>, and
- <quote>www.example.com/ads/banners/advert39.jpeg</quote>, but not
- <quote>www.example.com/ads/banners/advert39.gif</quote> (no gifs in the
- example pattern).
-</para>
-
-<para>
- Please note that matching in the path is case
- <emphasis>INSENSITIVE</emphasis> by default, but you can switch to case
- sensitive at any point in the pattern by using the 
- <quote>(?-i)</quote> switch:
-</para>
-
-<para>
- <emphasis>www.example.com/(?-i)PaTtErN.*</emphasis> - will match only
- documents whose path starts with <quote>PaTtErN</quote> in
- <emphasis>exactly</emphasis> this capitalization.
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Actions</title>
-<para>
- Actions are enabled if preceded with a <quote>+</quote>, and disabled if 
- preceded with a <quote>-</quote>. Actions are invoked by enclosing the 
- action name in curly braces (e.g. {+some_action}), followed by a list of 
- URLs to which the action applies. There are three classes of actions:
-</para>
-
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>  
-   Boolean (e.g. <quote>+/-block</quote>):
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>{+name}</emphasis>        # enable this action
-  <emphasis>{-name}</emphasis>        # disable this action
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
-
- <listitem>
-  <para>  
-   parameterized (e.g. <quote>+/-hide-user-agent</quote>):
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>{+name{param}}</emphasis>  # enable action and set parameter to <quote>param</quote>
-  <emphasis>{-name}</emphasis>         # disable action
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Multi-value (e.g. <quote>{+/-add-header{Name: value}}</quote>, <quote>{+/-wafer{name=value}}</quote>):
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>{+name{param}}</emphasis>   # enable action and add parameter <quote>param</quote>
-  <emphasis>{-name{param}}</emphasis>   # remove the parameter <quote>param</quote>
-  <emphasis>{-name}</emphasis>          # disable this action totally
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- </itemizedlist>
-</para>
-
-<para>
- If nothing is specified in this file, no <quote>actions</quote> are taken.
- So in this case <application>Privoxy</application> would just be a
- normal, non-blocking, non-anonymizing proxy. You must specifically
- enable the privacy and blocking features you need (although the 
- provided default <filename>default.action</filename> file will 
- give a good starting point).
-</para>
-
-<para>
- Later defined actions always over-ride earlier ones.  For multi-valued
- actions, the actions are applied in the order they are specified.
-</para>
-
-<para>
- The list of valid <application>Privoxy</application> <quote>actions</quote> are:
-</para>
-
-<para>
- <itemizedlist>
- <listitem>
-  <para>  
-   Add the specified HTTP header, which is not checked for validity.
-   You may specify this many times to specify many different headers:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+add-header{Name: value}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Block this URL totally. In a default installation, a <quote>blocked</quote>
-   URL will result in bright red banner that says <quote>BLOCKED</quote>, 
-   with a reason why it is being blocked. 
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+block</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   De-animate all animated GIF images, i.e. reduce them to their last frame.
-   This will also shrink the images considerably (in bytes, not pixels!). If
-   the option <quote>first</quote> is given, the first frame of the animation
-   is used as the replacement. If <quote>last</quote> is given, the last frame
-   of the animation is used instead, which probably makes more sense for most
-   banner animations, but also has the risk of not showing the entire last
-   frame (if it is only a delta to an earlier frame).
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+deanimate-gifs{last}</emphasis>
-  <emphasis>+deanimate-gifs{first}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>
-   <quote>+downgrade</quote> will downgrade HTTP/1.1 client requests to
-   HTTP/1.0 and downgrade the responses as well. Use this action for servers
-   that use HTTP/1.1 protocol features that
-   <application>Privoxy</application> doesn't handle well yet. HTTP/1.1 
-   is only partially implemented. Default is not to downgrade requests.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+downgrade</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem> 
- <listitem>
-  <para>  
-   Many sites, like yahoo.com, don't just link to other sites. Instead, they
-   will link to some script on their own server, giving the destination as a
-   parameter, which will then redirect you to the final target. URLs resulting
-   from this scheme typically look like:
-   http://some.place/some_script?http://some.where-else.
-  </para>
-  <para>
-   Sometimes, there are even multiple consecutive redirects encoded in the
-   URL. These redirections via scripts make your web browsing more traceable,
-   since the server from which you follow such a link can see where you go to.
-   Apart from that, valuable bandwidth and time is wasted, while your browser
-   ask the server for one redirect after the other. Plus, it feeds the
-   advertisers.
-  </para>
-  <para>
-   The <quote>+fast-redirects</quote> option enables interception of these
-   requests by <application>Privoxy</application>, who will cut off all but
-   the last valid URL in the request and send a local redirect back to your
-   browser without contacting the remote site.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+fast-redirects</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-   Apply the filters in the <literal>section_header</literal> 
-   section of the <filename>default.filter</filename> file to the site(s).
-   <filename>default.filter</filename> sections are grouped according to like
-   functionality. 
-  </para> 
-   
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
- <emphasis>+filter{section_header}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
-
-  <para>   
-   Filter sections that are pre-defined in the supplied
-   <filename>default.filter</filename> include:
-  </para>
-
- <blockquote>
-  <simplelist>
-   <member>
-     <emphasis>html-annoyances</emphasis>:  Get rid of particularly annoying HTML abuse.
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>js-annoyances</emphasis>:    Get rid of particularly annoying JavaScript abuse
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>no-poups</emphasis>:         Kill all popups in JS and HTML
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>frameset-borders</emphasis>: Give frames a border
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>webbugs</emphasis>:          Squish WebBugs (1x1 invisible GIFs used for user tracking)
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>no-refresh</emphasis>:       Automatic refresh sucks on auto-dialup lines
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>fun</emphasis>:              Text replacements  for subversive browsing fun!
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>nimda</emphasis>:            Remove (virus) Nimda code.
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-     <emphasis>banners-by-size</emphasis>:  Kill banners by size
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>crude-parental</emphasis>:   Kill all web pages that contain the words "sex" or "warez"
-   </member>
-  </simplelist>
- </blockquote>
-
- </listitem>
-
- <listitem>
-  <para>  
-   Block any existing X-Forwarded-for header, and do not add a new one:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-forwarded</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-   If the browser sends a <quote>From:</quote> header containing your e-mail
-   address, this either completely removes the header (<quote>block</quote>), or
-   changes it to the specified e-mail address.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-from{block}</emphasis>
-  <emphasis>+hide-from{spam@sittingduck.xqq}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Don't send the <quote>Referer:</quote> (sic) header to the web site.  You
-   can block it, forge a URL to the same server as the request (which is
-   preferred because some sites will not send images otherwise) or set it to a
-   constant string of your choice.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-referer{block}</emphasis>
-  <emphasis>+hide-referer{forge}</emphasis>
-  <emphasis>+hide-referer{http://nowhere.com}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Alternative spelling of <quote>+hide-referer</quote>.  It has the same
-   parameters, and can be freely mixed with, <quote>+hide-referer</quote>.
-   (<quote>referrer</quote> is the correct English spelling, however the HTTP
-   specification has a bug - it requires it to be spelled <quote>referer</quote>.) 
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-referrer{...}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-   Change the <quote>User-Agent:</quote> header so web servers can't tell your
-   browser type.  Warning! This breaks many web sites.  Specify the
-   user-agent value you want. Example, pretend to be using Netscape on
-   Linux:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-user-agent{Mozilla (X11; I; Linux 2.0.32 i586)}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- <!-- 
-  <para>
-   Or to identify yourself explicitly as a  <application>Privoxy</application> user:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-user-agent{Privoxy/1.0}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
-   (Don't change the version number from 1.0 - after all, why tell them?)
-  <para>
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-user-agent{browser-type}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
--->
- </listitem>
-
- <listitem>
-  <para>  
-   Treat this URL as an image.  This only matters if it's also <quote>+block</quote>ed,
-   in which case a <quote>blocked</quote> image can be sent rather than a HTML page.
-   See <quote>+image-blocker{}</quote> below for the control over what is actually sent.
-   If you want <emphasis>invisible</emphasis> ads, they should be defined as 
-   <emphasis>images</emphasis> and <emphasis>blocked</emphasis>. And also, 
-   <quote>image-blocker</quote>  should be set to <quote>blank</quote>.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+image</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para> Decides what to do with URLs that end up tagged with <quote>{+block
-  +image}</quote>, e.g an advertizement. There are five options.
-  <quote>-image-blocker</quote> will send a HTML <quote>blocked</quote> page,
-  usually resulting in a <quote>broken image</quote> icon.
-<!--   <quote>+image-blocker{logo}</quote> will send a -->
-<!--   <application>Privoxy</application> logo -->
-<!--   image. -->
-<quote>+image-blocker{blank}</quote> will send a 1x1 transparent GIF
-image. And finally, <quote>+image-blocker{http://xyz.com}</quote> will send a
-HTTP temporary redirect to the specified image. This has the advantage of the
-icon being being cached by the browser, which will speed up the display.
-<quote>+image-blocker{pattern}</quote> will send a checkboard type pattern
-<!-- , -->
-<!-- which scales better than the logo (which can get blocky if the browser -->
-<!-- enlarges it too much). -->
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-<!--   <emphasis>+image-blocker{logo}</emphasis> -->
-  <emphasis>+image-blocker{blank}</emphasis>
-  <emphasis>+image-blocker{pattern}</emphasis>
-  <emphasis>+image-blocker{http://p.p/send-banner}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-   <para> 
-   By default (i.e. in the absence of a <quote>+limit-connect</quote>
-   action), <application>Privoxy</application> will only allow CONNECT
-   requests to port 443, which is the standard port for https as a 
-   precaution.
-  </para>
-  <para>
-   The CONNECT methods exists in HTTP to allow access to secure websites
-   (https:// URLs) through proxies. It works very simply: the proxy
-   connects to the server on the specified port, and then short-circuits
-   its connections to the client <emphasis>and</emphasis> to the remote proxy.
-   This can be a big security hole, since CONNECT-enabled proxies can
-   be abused as TCP relays very easily.
-  </para>
-  
-  <para> 
-   If you want to allow CONNECT for more ports than this, or want to forbid
-   CONNECT altogether, you can specify a comma separated list of ports and
-   port ranges (the latter using dashes, with the minimum defaulting to 0 and
-   max to 65K):
-  </para>
-
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+limit-connect{443}                 # This is the default and need no be specified.</emphasis>
-  <emphasis>+limit-connect{80,443}              # Ports 80 and 443 are OK.</emphasis>
-  <emphasis>+limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to 100</emphasis>
-  <emphasis>                                    #and above 500 are OK.</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
-
- </listitem> 
- <listitem>
-  <para>
-   <quote>+no-compression</quote> prevents the website from compressing the
-   data. Some websites do this, which can be a problem for
-   <application>Privoxy</application>, since <quote>+filter</quote>,
-   <quote>+no-popup</quote> and <quote>+gif-deanimate</quote> will not work on
-   compressed data. This will slow down connections to those websites,
-   though. Default is <quote>nocompression</quote> is turned on.
-  </para>
-
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+nocompression</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem> 
- <listitem>
-  <para>  
-   If the website sets cookies, <quote>no-cookies-keep</quote> will make sure
-   they are erased when you exit and restart your web browser. This makes
-   profiling cookies useless, but won't break sites which require cookies so
-   that you can log in for transactions. Default: on.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-cookies-keep</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Prevent the website from reading cookies:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-cookies-read</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Prevent the website from setting cookies:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-cookies-set</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Filter the website through a built-in filter to disable those obnoxious 
-   JavaScript pop-up windows via window.open(), etc. The two alternative
-   spellings are equivalent.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-popup</emphasis>
-  <emphasis>+no-popups</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   This action only applies if you are using a <filename>jarfile</filename>
-   for saving cookies. It sends a cookie to every site stating that you do not
-   accept any copyright on cookies sent to you, and asking them not to track
-   you.  Of course, this is a (relatively) unique header they could use to
-   track you.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+vanilla-wafer</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   This allows you to add an arbitrary cookie. It can be specified multiple
-   times in order to add as many cookies as you like.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+wafer{name=value}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- </itemizedlist>
-</para>
-
-<para>
- The meaning of any of the above is reversed by preceding the action with a 
- <quote>-</quote>, in place of the <quote>+</quote>.
-</para>
-
-<para>
- Some examples:
-</para>
-
-<para>
- Turn off cookies by default, then allow a few through for specified sites:
-</para>
-  
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Turn off all persistent cookies
- { +no-cookies-read }
- { +no-cookies-set }
- # Allow cookies for this browser session ONLY
- { +no-cookies-keep }
-
- # Exceptions to the above, sites that benefit from persistent cookies
- { -no-cookies-read }
- { -no-cookies-set }
- { -no-cookies-keep }
- .javasoft.com
- .sun.com
- .yahoo.com
- .msdn.microsoft.com
- .redhat.com
-
- # Alternative way of saying the same thing
- {-no-cookies-set -no-cookies-read -no-cookies-keep}
- .sourceforge.net
- .sf.net
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Now turn off <quote>fast redirects</quote>, and then we allow two exceptions:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Turn them off!
- {+fast-redirects}
- # Reverse it for these two sites, which don't work right without it.
- {-fast-redirects}
- www.ukc.ac.uk/cgi-bin/wac\.cgi\?
- login.yahoo.com
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Turn on page filtering according to rules in the defined sections 
- of <filename>refilterfile</filename>, and make one exception for 
- sourceforge:
- </para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Run everything through the filter file, using only the
- # specified sections:
- +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\
- +filter{webbugs} +filter{nimda} +filter{banners-by-size}
-              
- # Then disable filtering of code from sourceforge!
- {-filter}
- .cvs.sourceforge.net
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Now some URLs that we want <quote>blocked</quote>, ie we won't see them.
- Many of these use regular expressions that will expand to match multiple 
- URLs:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  # Blocklist:
-  {+block}
-  /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g))
-  /.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/])
-  /.*/(ng)?adclient\.cgi
-  /.*/(plain|live|rotate)[-_.]?ads?/
-  /.*/(sponsor)s?[0-9]?/
-  /.*/_?(plain|live)?ads?(-banners)?/
-  /.*/abanners/
-  /.*/ad(sdna_image|gifs?)/
-  /.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
-  /.*/adbanners/
-  /.*/adserver
-  /.*/adstream\.cgi
-  /.*/adv((er)?ts?|ertis(ing|ements?))?/
-  /.*/banner_?ads/
-  /.*/banners?/
-  /.*/banners?\.cgi/
-  /.*/cgi-bin/centralad/getimage
-  /.*/images/addver\.gif
-  /.*/images/marketing/.*\.(gif|jpe?g)
-  /.*/popupads/
-  /.*/siteads/
-  /.*/sponsor.*\.gif
-  /.*/sponsors?[0-9]?/
-  /.*/advert[0-9]+\.jpg
-  /Media/Images/Adds/
-  /ad_images/
-  /adimages/
-  /.*/ads/
-  /bannerfarm/
-  /grafikk/annonse/
-  /graphics/defaultAd/
-  /image\.ng/AdType
-  /image\.ng/transactionID
-  /images/.*/.*_anim\.gif # alvin brattli
-  /ip_img/.*\.(gif|jpe?g)
-  /rotateads/
-  /rotations/ 
-  /worldnet/ad\.cgi
-  /cgi-bin/nph-adclick.exe/
-  /.*/Image/BannerAdvertising/
-  /.*/ad-bin/
-  /.*/adlib/server\.cgi
-  /autoads/
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note that many of these actions have the potential to cause a page to
- misbehave, possibly even not to display at all. There are many ways 
- a site designer may choose to design his site, and what HTTP header 
- content he may depend on. There is no way to have hard and fast rules 
- for all sites. See the <link linkend="ACTIONSANAT">Appendix</link>
- for a brief example on troubleshooting actions.
-
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect3>
-<title>Aliases</title>
-<para>
- Custom <quote>actions</quote>, known to <application>Privoxy</application>
- as <quote>aliases</quote>, can be defined by combining other <quote>actions</quote>.
- These can in turn be invoked just like the built-in <quote>actions</quote>.
- Currently, an alias can contain any character except space, tab, <quote>=</quote>,
- <quote>{</quote> or <quote>}</quote>. But please use only <quote>a</quote>-
- <quote>z</quote>, <quote>0</quote>-<quote>9</quote>, <quote>+</quote>, and
- <quote>-</quote>. Alias names are not case sensitive, and 
- <emphasis>must be defined  before anything</emphasis> else in the
- <filename>default.action</filename>file ! And there can only be one set of
- <quote>aliases</quote> defined.
-</para>
-
-<para>
- Now let's define a few aliases:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Useful customer aliases we can use later. These must come first!
- {{alias}}
- +no-cookies = +no-cookies-set +no-cookies-read
- -no-cookies = -no-cookies-set -no-cookies-read
- fragile     = -block -no-cookies -filter -fast-redirects -hide-referer -no-popups
- shop        = -no-cookies -filter -fast-redirects
- +imageblock = +block +image
-
- #For people who don't like to type too much:  ;-)
- c0 = +no-cookies
- c1 = -no-cookies
- c2 = -no-cookies-set +no-cookies-read
- c3 = +no-cookies-set -no-cookies-read
- #... etc.  Customize to your heart's content.
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Some examples using our <quote>shop</quote> and <quote>fragile</quote>
- aliases from above:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # These sites are very complex and require
- # minimal interference.
- {fragile}
- .office.microsoft.com
- .windowsupdate.microsoft.com
- .nytimes.com
-
- # Shopping sites - still want to block ads.
- {shop}
- .quietpc.com
- .worldpay.com   # for quietpc.com
- .jungle.com
- .scan.co.uk
-
- # These shops require pop-ups
- {shop -no-popups}
- .dabs.com
- .overclockers.co.uk
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="filterfile">
-<title>The Filter File</title>
-<para>
- Any web page can be dynamically modified with the filter file. This
- modification can be removal, or re-writing, of any web page content,
- including tags and non-visible content. The default filter file is
- <filename>default.filter</filename>, located in the config directory. 
-</para>
-
-<para>
- The included example file is divided into sections. Each section begins 
- with the <literal>FILTER</literal> keyword, followed by the identifier 
- for that section, e.g. <quote>FILTER: webbugs</quote>. Each section performs
- a similar type of filtering, such as <quote>html-annoyances</quote>.
-
-</para>
-
-<para>
- This file uses regular expressions to alter or remove any string in the
- target page. The expressions can only operate on one line at a time. Some
- examples from the included default <filename>default.filter</filename>:
-</para>
-
-<para>
- Stop web pages from displaying annoying messages in the status bar by
- deleting such references:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- FILTER: html-annoyances
-
- # New browser windows should be resizeable and have a location and status
- # bar. Make it so.
- #
- s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig
- s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig
- s/scrolling="?(no|0|Auto)"?/scrolling=1/ig
- s/menubar="?(no|0)"?/menubar=1/ig 
-
- # The &lt;BLINK&gt; tag was a crime!
- #
- s*&lt;blink&gt;|&lt;/blink&gt;**ig
-
- # Is this evil? 
- #
- #s/framespacing="?(no|0)"?//ig
- #s/margin(height|width)=[0-9]*//gi
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Just for kicks, replace any occurrence of <quote>Microsoft</quote> with
- <quote>MicroSuck</quote>, and have a little fun with topical buzzwords: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- FILTER: fun
-
- s/microsoft(?!.com)/MicroSuck/ig
-
- # Buzzword Bingo:
- #
- s/industry-leading|cutting-edge|award-winning/&lt;font color=red&gt;&lt;b&gt;BINGO!&lt;/b&gt;&lt;/font&gt;/ig
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Kill those pesky little web-bugs:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
- FILTER: webbugs
-
- s/&lt;img\s+[^&gt;]*?(width|height)\s*=\s*['"]?1\D[^&gt;]*?(width|height)\s*=\s*['"]?1(\D[^&gt;]*?)?>/&lt;!-- Squished WebBug --&gt;/sig
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Templates</title>
-<para>
- When <application>Privoxy</application> displays one of its internal 
- pages, such as a 404 Not Found error page, it uses the appropriate template.
- On Linux, BSD, and Unix, these are located in
- <filename>/etc/privoxy/templates</filename> by default. These may be
- customized, if desired.
-
-</para>
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="quickstart"><title>Quickstart to Using <application>Privoxy</application></title>
-<para>
- Install package, then run and enjoy! <application>Privoxy</application> 
- is typically started by specifying the main configuration file to be 
- used on the command line. Example Unix startup command:
-</para>
-
-<para>
- <screen>
- # /usr/sbin/privoxy /etc/privoxy/config
- </screen>
-</para>
-
-<para>
- An init script is provided for SuSE and Redhat.
-</para>
-
-<para>
-For for SuSE: /etc/rc.d/privoxy start
-</para>
-
-<para>
-For RedHat: /etc/rc.d/init.d/privoxy start
-</para>
-
-
-<para>
- If no configuration file is specified on the command line,
- <application>Privoxy</application> will look for a file named
- <filename>config</filename> in the current directory. Except on Win32 where
- it will try <filename>config.txt</filename>. If no file is specified on the
- command line and no default configuration file can be found, 
- <application>Privoxy</application> will fail to start.
-</para>
-
-<para>
- Be sure your browser is set to use the proxy which is by default at
- localhost, port 8118. With <application>Netscape</application> (and
- <application>Mozilla</application>), this can be set under <literal>Edit
- -&gt; Preferences -&gt; Advanced -&gt; Proxies -&gt; HTTP Proxy</literal>.
- For <application>Internet Explorer</application>: <literal>Tools &gt;
- Internet Properties -&gt; Connections -&gt; LAN Setting</literal>. Then,
- check <quote>Use Proxy</quote> and fill in the appropriate info (Address:
- localhost, Port: 8118). Include if HTTPS proxy support too.
-</para>
-
-<para>
- The included default configuration files should give a reasonable starting
- point, though may be somewhat aggressive in blocking junk. You will probably
- want to keep an eye out for sites that require persistent cookies, and add these to
- <filename>default.action</filename> as needed. By default, most of these will
- be accepted only during the current browser session, until you add them to
- the configuration. If you want the browser to handle this instead, you will
- need to edit <filename>default.action</filename> and disable this feature. If you
- use more than one browser, it would make more sense to let
- <application>Privoxy</application> handle this. In which case, the
- browser(s) should be set to accept all cookies.
-</para>
-
-<para>
- If a particular site shows problems loading properly, try adding it 
- to the <literal>{fragile}</literal> section of
- <filename>default.action</filename>. This will turn off most actions for 
- this site.
-</para>
-
-<para>
- <application>Privoxy</application> is HTTP/1.1 compliant,  but not all 1.1
- features are as yet implemented. If browsers that support HTTP/1.1 (like
- <application>Mozilla</application> or recent versions of I.E.) experience
- problems, you might try to force HTTP/1.0 compatibility. For Mozilla, look
- under <literal>Edit -&gt; Preferences -&gt; Debug -&gt; Networking</literal>.
- Or set the <quote>+downgrade</quote> config option in
- <filename>default.action</filename>.
-</para>
-
-<para>
- After running <application>Privoxy</application> for a while, you can 
- start to fine tune the configuration to suit your personal, or site, 
- preferences and requirements. There are many, many aspects that can 
- be customized. <quote>Actions</quote> (as specified in <filename>default.action</filename>) 
- can be adjusted by pointing your browser to 
- <ulink url="http://p.p/">http://p.p/</ulink>, 
- and then follow the link to <quote>edit the actions list</quote>. 
- (This is an internal page and does not require Internet access.)
-</para>
-
-<para>
- In fact, various aspects of <application>Privoxy</application>
- configuration can be viewed from this page, including 
- current configuration parameters, source code version numbers, 
- the browser's request headers, and <quote>actions</quote> that apply 
- to a given URL. In addition to the <filename>default.action</filename> file 
- editor mentioned above, <application>Privoxy</application> can also 
- be turned <quote>on</quote> and <quote>off</quote> from this page.
-</para>
-
-<para>
- If you encounter problems, please verify it is a
- <application>Privoxy</application> bug, by disabling
- <application>Privoxy</application>, and then trying the same page. 
- Also, try another browser if possible to eliminate browser or site 
- problems. Before reporting it as a bug, see if there is not a configuration 
- option that is enabled that is causing the page not to load. You can 
- then add an exception for that page or site. If a bug, please report it to
- the developers (see below). 
-</para>
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Command Line Options</title>
-<para>
- <application>Privoxy</application> may be invoked with the following
- command-line options:
-</para>
-
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>
-    <emphasis>--version</emphasis>
-  </para>
-  <para>
-     Print version info and exit, Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-    <emphasis>--help</emphasis>
-  </para>
-  <para>
-   Print a short usage info and exit, Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   <emphasis>--no-daemon</emphasis>
-  </para>
-  <para>
-   Don't become a daemon, i.e. don't fork and become process group
-   leader, don't detach from controlling tty. Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   <emphasis>--pidfile FILE</emphasis>
-  
-  </para>
-  <para>
-   On startup, write the process ID to <emphasis>FILE</emphasis>. Delete the
-   <emphasis>FILE</emphasis> on exit. Failiure to create or delete the
-   <emphasis>FILE</emphasis> is non-fatal. If no <emphasis>FILE</emphasis>
-   option is given, no PID file will be used. Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   <emphasis>--user USER[.GROUP]</emphasis>
-  
-  </para>
-  <para>
-   After (optionally) writing the PID file, assume the user  ID  of
-   <emphasis>USER</emphasis>, and if included the GID of GROUP.  Exit if the
-   privileges are not sufficient to do so. Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-    <emphasis>configfile</emphasis>
-  </para>
-  <para>
-    If no <emphasis>configfile</emphasis> is included on the command line, 
-    <application>Privoxy</application> will look for a file named 
-    <quote>config</quote> in the current directory (except on Win32 
-    where it will look for <quote>config.txt</quote> instead). Specify 
-    full path to avoid confusion.
-  </para>
- </listitem> 
-
- </itemizedlist>
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect1 id="contact"><title>Contacting the Developers, Bug Reporting and Feature
-Requests</title>
-<para>
-We value your feedback. However, to provide you with the best support,
-please note:
-
- <itemizedlist>
-
-  <listitem><para>Use the <ulink url="http://sourceforge.net/tracker/?group_id=11118&#38;atid=211118">Sourceforge support forum</ulink> to get
-  help.</para></listitem>
-  <listitem><para>Submit bugs only thru our <ulink url="http://sourceforge.net/tracker/?group_id=11118&#38;atid=111118">Sourceforge bug
-      forum</ulink>. 
-Make sure that the bug has not already been submitted.  Please try to
-verify that it is a <application>Privoxy</application> bug, and not
-a browser or site bug first. If you are using your own custom configuration,
-please try the stock configs to see if the problem is a configuration
-related bug.  And if not using the latest development snapshot, please
-try the latest one. Or even better, CVS sources.</para>
-</listitem>
-
-  <listitem><para>Submit feature requests only thru our <ulink
-      url="http://sourceforge.net/tracker/?atid=361118&#38;group_id=11118&#38;func=browse">Sourceforge feature request forum</ulink>.</para></listitem>
-
-
- </itemizedlist>
-
-</para>
-
-<para>
-For any other issues, feel free to use the <ulink url="http://sourceforge.net/mail/?group_id=11118">mailing lists</ulink>.
-</para>
-
-<para>
- Anyone interested in actively participating in development and related 
- discussions can join the appropriate mailing list  
- <ulink url="http://sourceforge.net/mail/?group_id=11118">here</ulink>.
- Archives are available here too.
-</para>
-
-</sect1>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="copyright"><title>Copyright and History</title>
-
-<sect2>
-<title>License</title>
-<para>
- <application>Privoxy</application> is free software; you can
- redistribute it and/or modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-</para>
-
-<para>
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- details, which is available from <ulink
- url="http://www.gnu.org/copyleft/gpl.html">the Free Software Foundation,
- Inc</ulink>, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>History</title>
-<para>
- <application>Privoxy</application> is derived from
- <application>the Internet Junkbuster</application>, with many 
- improvments and enhancements over the original.
-</para>
-
-<para>
- <application>Junkbuster</application> was originally written by Anonymous
- Coders and <ulink
- url="http://www.junkbusters.com">Junkbuster's
- Corporation</ulink>, and was released as free open-source software under the
- GNU GPL. <ulink url="http://www.waldherr.org/junkbuster/">Stefan
- Waldherr</ulink> made many improvements, and started the <ulink
- url="http://sourceforge.net/projects/ijbswa/">SourceForge project
- Privoxy</ulink> to rekindle development. There are now several active
- developers contributing.  The last stable release of
- <application>Junkbuster</application> was v2.0.2, which has now
- grown whiskers ;-).
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="seealso"><title>See also</title>
-<para>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://sourceforge.net/projects/ijbswa">http://sourceforge.net/projects/ijbswa</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://www.privoxy.org/">http://www.privoxy.org/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://p.p/">http://p.p/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://www.junkbusters.com/ht/en/cookies.html">http://www.junkbusters.com/ht/en/cookies.html</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://www.waldherr.org/junkbuster/">http://www.waldherr.org/junkbuster/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://privacy.net/analyze/">http://privacy.net/analyze/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp;<ulink url="http://www.squid-cache.org/">http://www.squid-cache.org/</ulink>
-  </member>
- </simplelist>
-
-</para>
-</sect1>
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="appendix"><title>Appendix</title>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="regex">
-<title>Regular Expressions</title>
-<para>
- <application>Privoxy</application> can use <quote>regular expressions</quote> 
- in various config files. Assuming support for <quote>pcre</quote> (Perl
- Compatible Regular Expressions) is compiled in, which is the default. Such
- configuration directives do not require regular expressions, but they can be
- used to increase flexibility by matching a pattern with wild-cards against
- URLs.
-</para>
-
-<para>
- If you are reading this, you probably don't understand what <quote>regular
- expressions</quote> are, or what they can do. So this will be a very brief
- introduction only. A full explanation would require a book ;-)
-</para>
-
-<para>
- <quote>Regular expressions</quote> is a way of matching one character
- expression against another to see if it matches or not. One of the
- <quote>expressions</quote> is a literal string of readable characters
- (letter, numbers, etc), and the other is a complex string of literal
- characters combined with wild-cards, and other special characters, called
- meta-characters. The <quote>meta-characters</quote> have special meanings and
- are used to build the complex pattern to be matched against. Perl Compatible
- Regular Expressions is an enhanced form of the regular expression language
- with backward compatibility.
-</para>
-
-<para>
- To make a simple analogy, we do something similar when we use wild-card
- characters when listing files with the <command>dir</command> command in DOS. 
- <literal>*.*</literal> matches all filenames. The <quote>special</quote>
- character here is the asterisk which matches any and all characters. We can be
- more specific and use <literal>?</literal> to match just individual
- characters. So <quote>dir file?.text</quote> would match
- <quote>file1.txt</quote>, <quote>file2.txt</quote>, etc. We are pattern
- matching, using a similar technique to <quote>regular expressions</quote>!
-</para>
-
-<para>
- Regular expressions do essentially the same thing, but are much, much more
- powerful. There are many more <quote>special characters</quote> and ways of 
- building complex patterns however. Let's look at a few of the common ones,
- and then some examples:
-</para>
-
-<simplelist>
- <member>
-  <emphasis>.</emphasis> - Matches any single character, e.g. <quote>a</quote>,
-  <quote>A</quote>, <quote>4</quote>, <quote>:</quote>, or <quote>@</quote>.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>?</emphasis> - The preceding character or expression is matched ZERO or ONE
-  times. Either/or.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>+</emphasis> - The preceding character or expression is matched ONE or MORE
-  times.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>*</emphasis> - The preceding character or expression is matched ZERO or MORE
-  times.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>\</emphasis> - The <quote>escape</quote> character denotes that
-  the following character should be taken literally. This is used where one of the 
-  special characters (e.g. <quote>.</quote>) needs to be taken literally and
-  not as a special meta-character.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>[]</emphasis> - Characters enclosed in brackets will be matched if
-  any of the enclosed characters are encountered.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>()</emphasis> - parentheses are used to group a sub-expression,
-  or multiple sub-expressions.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>|</emphasis> - The <quote>bar</quote> character works like an
-  <quote>or</quote> conditional statement. A match is successful if the
-  sub-expression on either side of <quote>|</quote> matches.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>s/string1/string2/g</emphasis> - This is used to rewrite strings of text. 
-  <quote>string1</quote> is replaced by <quote>string2</quote> in this
-  example.
- </member>
-</simplelist>
-
-<para>
- These are just some of the ones you are likely to use when matching URLs with 
- <application>Privoxy</application>, and is a long way from a definitive
- list. This is enough to get us started with a few simple examples which may
- be more illuminating:
-</para>
-
-<para>
- <emphasis><literal>/.*/banners/.*</literal></emphasis> - A  simple example
- that uses the common combination of <quote>.</quote> and <quote>*</quote> to 
- denote any character, zero or more times. In other words, any string at all.
- So we start with a literal forward slash, then our regular expression pattern 
- (<quote>.*</quote>) another literal forward slash, the string
- <quote>banners</quote>, another forward slash, and lastly another
- <quote>.*</quote>. We are building 
- a directory path here. This will match any file with the path that has a
- directory named <quote>banners</quote> in it. The <quote>.*</quote> matches
- any characters, and this could conceivably be more forward slashes, so it
- might expand into a much longer looking path. For example, this could match:
- <quote>/eye/hate/spammers/banners/annoy_me_please.gif</quote>, or just
- <quote>/banners/annoying.html</quote>, or almost an infinite number of other
- possible combinations, just so it has <quote>banners</quote> in the path
- somewhere.
-</para>
-
-<para>
- A now something a little more complex:
-</para>
-
-<para>
- <emphasis><literal>/.*/adv((er)?ts?|ertis(ing|ements?))?/</literal></emphasis> - 
- We have several literal forward slashes again (<quote>/</quote>), so we are
- building another expression that is a file path statement. We have another 
- <quote>.*</quote>, so we are matching against any conceivable sub-path, just so
- it matches our expression. The only true literal that <emphasis>must
- match</emphasis> our pattern is <application>adv</application>, together with
- the forward slashes. What comes after the <quote>adv</quote> string is the
- interesting part. 
-</para>
-
-<para>
- Remember the <quote>?</quote> means the preceding expression (either a
- literal character or anything grouped with <quote>(...)</quote> in this case)
- can exist or not, since this means either zero or one match. So
- <quote>((er)?ts?|ertis(ing|ements?))</quote> is optional, as are the
- individual sub-expressions: <quote>(er)</quote>,
- <quote>(ing|ements?)</quote>, and the <quote>s</quote>. The <quote>|</quote>
- means <quote>or</quote>. We have two of those. For instance, 
- <quote>(ing|ements?)</quote>, can expand to match either <quote>ing</quote> 
- <emphasis>OR</emphasis> <quote>ements?</quote>. What is being done here, is an
- attempt at matching as many variations of <quote>advertisement</quote>, and 
- similar, as possible. So this would expand to match just <quote>adv</quote>,
- or <quote>advert</quote>, or <quote>adverts</quote>, or
- <quote>advertising</quote>, or <quote>advertisement</quote>, or
- <quote>advertisements</quote>. You get the idea. But it would not match 
- <quote>advertizements</quote> (with a <quote>z</quote>). We could fix that by
- changing our regular expression to: 
- <quote>/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/</quote>, which would then match
- either spelling.
-</para>
-
-<para>
- <emphasis><literal>/.*/advert[0-9]+\.(gif|jpe?g)</literal></emphasis> - Again 
- another path statement with forward slashes. Anything in the square brackets 
- <quote>[]</quote> can be matched. This is using <quote>0-9</quote> as a
- shorthand expression to mean any digit one through nine. It is the same as
- saying <quote>0123456789</quote>. So any digit matches. The <quote>+</quote>
- means one or more of the preceding expression must be included. The preceding 
- expression here is what is in the square brackets -- in this case, any digit 
- one through nine. Then, at the end, we have a grouping: <quote>(gif|jpe?g)</quote>. 
- This includes a <quote>|</quote>, so this needs to match the expression on
- either side of that bar character also. A simple <quote>gif</quote> on one side, and the other
- side will in turn match either <quote>jpeg</quote> or <quote>jpg</quote>,
- since the <quote>?</quote> means the letter <quote>e</quote> is optional and
- can be matched once or not at all. So we are building an expression here to
- match image GIF or JPEG type image file. It must include the literal
- string <quote>advert</quote>, then one or more digits, and a <quote>.</quote>
- (which is now a literal, and not a special character, since it is escaped
- with <quote>\</quote>), and lastly either <quote>gif</quote>, or
- <quote>jpeg</quote>, or <quote>jpg</quote>. Some possible matches would
- include: <quote>//advert1.jpg</quote>,
- <quote>/nasty/ads/advert1234.gif</quote>,
- <quote>/banners/from/hell/advert99.jpg</quote>. It would not match
- <quote>advert1.gif</quote> (no leading slash), or
- <quote>/adverts232.jpg</quote> (the expression does not include an
- <quote>s</quote>), or <quote>/advert1.jsp</quote> (<quote>jsp</quote> is not
- in the expression anywhere).
-</para>
-
-<para>
- <emphasis><literal>s/microsoft(?!.com)/MicroSuck/i</literal></emphasis> - This is 
- a substitution. <quote>MicroSuck</quote> will replace any occurrence of 
- <quote>microsoft</quote>.  The <quote>i</quote> at the end of the expression
- means ignore case. The <quote>(?!.com)</quote> means 
- the match should fail if <quote>microsoft</quote> is followed by
- <quote>.com</quote>. In other words, this acts like a <quote>NOT</quote>
- modifier. In case this is a hyperlink, we don't want to break it ;-).
-</para>
-
-<para>
- We are barely scratching the surface of regular expressions here so that you
- can understand the default <application>Privoxy</application>
- configuration files, and maybe use this knowledge to customize your own
- installation. There is much, much more that can be done with regular
- expressions. Now that you know enough to get started, you can learn more on
- your own :/
-</para>
-
-<para>
- More reading on Perl Compatible Regular expressions: 
- <ulink url="http://www.perldoc.com/perl5.6/pod/perlre.html">http://www.perldoc.com/perl5.6/pod/perlre.html</ulink>
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2>
-<title><application>Privoxy</application>'s Internal Pages</title>
-
-<para>
- Since <application>Privoxy</application> proxies each requested 
- web page, it is easy for <application>Privoxy</application> to 
- trap certain URLs. In this way, we can talk directly to
- <application>Privoxy</application>, and see how it is 
- configured, see how our rules are being applied, change these 
- rules and other configuration options, and even turn
- <application>Privoxy's</application> filtering off, all with 
- a web browser.
-
-</para>
-
-<para>
- The URLs listed below are the special ones that allow direct access 
- to <application>Privoxy</application>. Of course,
- <application>Privoxy</application> must be running to access these. If 
- not, you will get a friendly error message. Internet access is not 
- necessary either.
-</para>
-
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>  
-   Privoxy main page: 
-  </para>
-  <blockquote>
-   <para> 
-     <ulink url="http://www.privoxy.org/config/">http://www.privoxy.org/config/</ulink>
-   </para>
-  </blockquote>
-  <para>
-   Alternately, this may be reached at <ulink
-   url="http://p.p/">http://p.p/</ulink>, but this
-   variation may not work as reliably as the above in some configurations.
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-    Show information about the current configuration: 
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-status">http://www.privoxy.org/config/show-status</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-    Show the source code version numbers:
-  </para>
-  <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-version">http://www.privoxy.org/config/show-version</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-   Show the client's request headers:
-  </para>
-  <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-request">http://www.privoxy.org/config/show-request</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-   Show which actions apply to a URL and why:
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-url-info">http://www.privoxy.org/config/show-url-info</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-   Toggle Privoxy on or off:
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/toggle">http://www.privoxy.org/config/toggle</ulink>
-   </para>
-  </blockquote>
-  <para>
-   Short cuts. Turn off, then on: 
-  </para>
-   <blockquote>
-   <para> 
-     <ulink url="http://www.privoxy.org/config/toggle?set=disable">http://www.privoxy.org/config/toggle?set=disable</ulink>
-   </para>
-  </blockquote>
-   <blockquote>
-   <para> 
-     <ulink url="http://www.privoxy.org/config/toggle?set=enable">http://www.privoxy.org/config/toggle?set=enable</ulink>
-   </para>
-  </blockquote>
- </listitem>
-
- <listitem>
-  <para>  
-   Edit the actions list file:
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/edit-actions">http://www.privoxy.org/config/edit-actions</ulink>
-   </para>
-  </blockquote>
- </listitem>
- </itemizedlist>
-</para>
-
-<para>
- These may be bookmarked for quick reference.
-
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="actionsanat">
-<title>Anatomy of an Action</title>
-
-<para>
- The way <application>Privoxy</application> applies <quote>actions</quote>
- to any given URL can be complex, and not always so easy to understand what 
- is happening. And sometimes we need to be able to <emphasis>see</emphasis>
- just what <application>Privoxy</application> is doing. Especially, 
- if something <application>Privoxy</application> is doing is causing 
- us a problem inadvertantly. It can be a little daunting to look at 
- the actions files themselves, since they tend to be filled with 
- <quote>regular expressions</quote> whose consequences are not always 
- so obvious. <application>Privoxy</application> provides the 
- <ulink url="http://www.privoxy.org/config/show-url-info">http://www.privoxy.org/config/show-url-info</ulink>
- page that can show us very specifically how <application>actions</application>
- are being applied to any given URL. This is a big help for troubleshooting.
- </para>
-
-<para>
- First, enter one URL (or partial URL) at the prompt, and then
- <application>Privoxy</application> will tell us 
- how the current configuration will handle it. This will not
- help with filtering effects from the <filename>default.filter</filename> file! It
- also will not tell you about any other URLs that may be embedded within the
- URL you are testing. For instance, images such as ads are expressed as URLs
- within the raw page source of HTML pages. So you will only get info for the
- actual URL that is pasted into the prompt area -- not any sub-URLs. If you
- want to know about embedded URLs like ads, you will have to dig those out of
- the HTML source. Use your browser's <quote>View Page Source</quote> option
- for this.
-</para>
-
-<para>
- Let's look at an example, <ulink url="http://google.com">google.com</ulink>, 
- one section at a time:
-</para>
-
-<para>
- <screen>
- System default actions:
-
- { -add-header -block -deanimate-gifs -downgrade -fast-redirects -filter 
-   -hide-forwarded -hide-from -hide-referer -hide-user-agent -image 
-   -image-blocker -limit-connect -no-compression -no-cookies-keep 
-   -no-cookies-read -no-cookies-set -no-popups -vanilla-wafer -wafer }
- </screen>
-</para>
-
-<para>
- This is the top section, and only tells us of the compiled in defaults. This 
- is basically what <application>Privoxy</application> would do if there 
- were not any <quote>actions</quote> defined, i.e. it does nothing. Every action 
- is disabled. This is not particularly informative for our purposes here. OK,
- next section:
-</para>
-
-<para>
- <screen>
-
- Matches for http://google.com:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects 
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} 
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} 
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} 
-   -hide-user-agent -image +image-blocker{blank} +no-compression 
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups 
-   -vanilla-wafer -wafer }
-   /
-
- { -no-cookies-keep -no-cookies-read -no-cookies-set }
-  .google.com
-
- { -fast-redirects }
-  .google.com
-
- </screen>
-</para>
-
-<para>
- This is much more informative, and tells us how we have defined our 
- <quote>actions</quote>, and which ones match for our example, 
- <quote>google.com</quote>. The first grouping shows our default 
- settings, which would apply to all URLs. If you look at your <quote>actions</quote>
- file, this would be the section just below the <quote>aliases</quote> section 
- near the top. This applies to all URLs as signified by the single forward
- slash -- <quote>/</quote>.
-</para>
-
-<para>
- These are the default actions we have enabled. But we can define additional
- actions that would be exceptions to these general rules, and then list 
- specific URLs that these exceptions would apply to. Last match wins.
- Just below this then are two explict matches for <quote>.google.com</quote>.
- The first is negating our various cookie blocking actions (i.e. we will allow
- cookies here). The second is allowing <quote>fast-redirects</quote>. Note
- that there is a leading dot here -- <quote>.google.com</quote>. This will
- match any hosts and sub-domains, in the google.com domain also, such as
- <quote>www.google.com</quote>. So, apparently, we have these actions defined
- somewhere in the lower part of our actions file, and
- <quote>google.com</quote> is referenced in these sections.
-
-</para>
-
-<para>
- And now we pull it altogether in the bottom section and summarize how
- <application>Privoxy</application> is appying all its <quote>actions</quote> 
- to <quote>google.com</quote>:
-
-</para>
-
-<para>
- <screen>
-
- Final results:
-
- -add-header -block -deanimate-gifs -downgrade -fast-redirects 
- +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} 
- +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} 
- +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} 
- -hide-user-agent -image +image-blocker{blank} -limit-connect +no-compression 
- -no-cookies-keep -no-cookies-read -no-cookies-set +no-popups -vanilla-wafer 
- -wafer
-
- </screen>
-</para>
-
-<para>
- Now another example, <quote>ad.doubleclick.net</quote>:
-</para>
-
-<para>
- <screen>
-
- { +block +image }
-  .ad.doubleclick.net
-
- { +block +image }
-  ad*.
-
- { +block +image }
-  .doubleclick.net
-
- </screen>
-</para>
-
-<para>
- We'll just show the interesting part here, the explicit matches. It is 
- matched three different times. Each as an <quote>+block +image</quote>,
- which is the expanded form of one of our aliases that had been defined as: 
- <quote>+imageblock</quote>. (<quote>Aliases</quote> are defined in the 
- first section of the actions file and typically used to combine more 
- than one action.)
-</para>
-
-<para>
- Any one of these would have done the trick and blocked this as an unwanted 
- image. This is unnecessarily redundant since the last case effectively 
- would also cover the first. No point in taking chances with these guys 
- though ;-) Note that if you want an ad or obnoxious 
- URL to be invisible, it should be defined as <quote>ad.doubleclick.net</quote>
- is done here -- as both a <quote>+block</quote> <emphasis>and</emphasis> an
- <quote>+image</quote>. The custom alias <quote>+imageblock</quote> does this
- for us.
-</para>
-
-<para>
- One last example. Let's try <quote>http://www.rhapsodyk.net/adsl/HOWTO/</quote>.
- This one is giving us problems. We are getting a blank page. Hmmm...
-</para>
-
-<para>
- <screen>
-
- Matches for http://www.rhapsodyk.net/adsl/HOWTO/:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects 
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} 
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} 
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} 
-   -hide-user-agent -image +image-blocker{blank} +no-compression 
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups 
-   -vanilla-wafer -wafer }
-   /
-
- { +block +image }
-  /ads
-
- </screen>
-</para>
-
-<para>
- Ooops, the <quote>/adsl/</quote> is matching <quote>/ads</quote>! But 
- we did not want this at all! Now we see why we get the blank page. We could
- now add a new action below this that explictly does <emphasis>not</emphasis>
- block (-block) pages with <quote>adsl</quote>. There are various ways to
- handle such exceptions. Example:
-</para>
-
-<para>
- <screen>
-
- { -block }
-  /adsl
- </screen>
-</para>
-
-<para>
- Now the page displays ;-)
-
-</para>
-
-<para>
- But now what about a situation where we get no explicit matches like 
- we did with:
-
-</para>
-
-<para>
- <screen>
-
- { -block }
-  /adsl
- </screen>
-</para>
-
-<para>
- That actually was very telling and pointed us quickly to where the problem
- was. If you don't get this kind of match, then it means one of the default 
- rules in the first section is causing the problem. This would require some 
- guesswork, and maybe a little trial and error to isolate the offending rule.
- One likely cause would be one of the <quote>{+filter}</quote> actions. Try 
- adding the URL for the site to one of aliases that turn off <quote>+filter</quote>:
-</para>
-
-<para>
- <screen>
-
- {shop}
- .quietpc.com
- .worldpay.com   # for quietpc.com
- .jungle.com
- .scan.co.uk
- .forbes.com
- </screen>
-</para>
-
-<para>
- <quote>{shop}</quote> is an <quote>alias</quote> that expands to 
- <quote>{ -filter -no-cookies -no-cookies-keep }</quote>. Or you could do 
- your own exception to negate filtering:
-
-</para>
-
-<para>
- <screen>
-
- {-filter}
- .forbes.com
- </screen>
-</para>
-
-</sect2>
-
-</sect1>
-
- <!--
-
- This program is free software; you can redistribute it 
- and/or modify it under the terms of the GNU General
- Public License as published by the Free Software
- Foundation; either version 2 of the License, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will
- be useful, but WITHOUT ANY WARRANTY; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A
- PARTICULAR PURPOSE.  See the GNU General Public
- License for more details.
-
- The GNU General Public License should be included with
- this file.  If not, you can view it at
- http://www.gnu.org/copyleft/gpl.html
- or write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
- $Log: user-manual.sgml,v $
- Revision 1.59  2002/03/27 00:54:33  hal9
- Touch up intro for new name.
-
- Revision 1.58  2002/03/26 22:29:55  swa
- we have a new homepage!
-
- Revision 1.57  2002/03/24 20:33:30  hal9
- A few minor catch ups with name change.
-
- Revision 1.56  2002/03/24 16:17:06  swa
- configure needs to be generated.
-
- Revision 1.55  2002/03/24 16:08:08  swa
- we are too lazy to make a block-built
- privoxy logo. hence removed the option.
-
- Revision 1.54  2002/03/24 15:46:20  swa
- name change related issue.
-
- Revision 1.53  2002/03/24 11:51:00  swa
- name change. changed filenames.
-
- Revision 1.52  2002/03/24 11:01:06  swa
- name change
-
- Revision 1.51  2002/03/23 15:13:11  swa
- renamed every reference to the old name with foobar.
- fixed "application foobar application" tag, fixed
- "the foobar" with "foobar". left junkbustser in cvs
- comments and remarks to history untouched.
-
- Revision 1.50  2002/03/23 05:06:21  hal9
- Touch up.
-
- Revision 1.49  2002/03/21 17:01:05  hal9
- New section in Appendix.
-
- Revision 1.48  2002/03/12 06:33:01  hal9
- Catching up to Andreas and re_filterfile changes.
-
- Revision 1.47  2002/03/11 13:13:27  swa
- correct feedback channels
-
- Revision 1.46  2002/03/10 00:51:08  hal9
- Added section on JB internal pages in Appendix.
-
- Revision 1.45  2002/03/09 17:43:53  swa
- more distros
-
- Revision 1.44  2002/03/09 17:08:48  hal9
- New section on Jon's actions file editor, and move some stuff around.
-
- Revision 1.43  2002/03/08 00:47:32  hal9
- Added imageblock{pattern}.
-
- Revision 1.42  2002/03/07 18:16:55  swa
- looks better
-
- Revision 1.41  2002/03/07 16:46:43  hal9
- Fix a few markup problems for jade.
-
- Revision 1.40  2002/03/07 16:28:39  swa
- provide correct feedback channels
-
- Revision 1.39  2002/03/06 16:19:28  hal9
- Note on perceived filtering slowdown per FR.
-
- Revision 1.38  2002/03/05 23:55:14  hal9
- Stupid I did it again. Double hyphen in comment breaks jade.
-
- Revision 1.37  2002/03/05 23:53:49  hal9
- jade barfs on '- -' embedded in comments. - -user option broke it.
-
- Revision 1.36  2002/03/05 22:53:28  hal9
- Add new - - user option.
-
- Revision 1.35  2002/03/05 00:17:27  hal9
- Added section on command line options.
-
- Revision 1.34  2002/03/04 19:32:07  oes
- Changed default port to 8118
-
- Revision 1.33  2002/03/03 19:46:13  hal9
- Emphasis on where/how to report bugs, etc
-
- Revision 1.32  2002/03/03 09:26:06  joergs
- AmigaOS changes, config is now loaded from PROGDIR: instead of
- AmiTCP:db/junkbuster/ if no configuration file is specified on the
- command line.
-
- Revision 1.31  2002/03/02 22:45:52  david__schmidt
- Just tweaking
-
- Revision 1.30  2002/03/02 22:00:14  hal9
- Updated 'New Features' list. Ran through spell-checker.
-
- Revision 1.29  2002/03/02 20:34:07  david__schmidt
- Update OS/2 build section
-
- Revision 1.28  2002/02/24 14:34:24  jongfoster
- Formatting changes.  Now changing the doctype to DocBook XML 4.1
- will work - no other changes are needed.
-
- Revision 1.27  2002/01/11 14:14:32  hal9
- Added a very short section on Templates
-
- Revision 1.26  2002/01/09 20:02:50  hal9
- Fix bug re: auto-detect config file changes.
-
- Revision 1.25  2002/01/09 18:20:30  hal9
- Touch ups for *.action files.
-
- Revision 1.24  2001/12/02 01:13:42  hal9
- Fix typo.
-
- Revision 1.23  2001/12/02 00:20:41  hal9
- Updates for recent changes.
-
- Revision 1.22  2001/11/05 23:57:51  hal9
- Minor update for startup now daemon mode.
-
- Revision 1.21  2001/10/31 21:11:03  hal9
- Correct 2 minor errors
-
- Revision 1.18  2001/10/24 18:45:26  hal9
- *** empty log message ***
-
- Revision 1.17  2001/10/24 17:10:55  hal9
- Catching up with Jon's recent work, and a few other things.
-
- Revision 1.16  2001/10/21 17:19:21  swa
- wrong url in documentation
-
- Revision 1.15  2001/10/14 23:46:24  hal9
- Various minor changes. Fleshed out SEE ALSO section.
-
- Revision 1.13  2001/10/10 17:28:33  hal9
- Very minor changes.
-
- Revision 1.12  2001/09/28 02:57:04  hal9
- Ditto :/
-
- Revision 1.11  2001/09/28 02:25:20  hal9
- Ditto.
-
- Revision 1.9  2001/09/27 23:50:29  hal9
- A few changes. A short section on regular expression in appendix.
-
- Revision 1.8  2001/09/25 00:34:59  hal9
- Some additions, and re-arranging.
-
- Revision 1.7  2001/09/24 14:31:36  hal9
- Diddling.
-
- Revision 1.6  2001/09/24 14:10:32  hal9
- Including David's OS/2 installation instructions.
-
- Revision 1.2  2001/09/13 15:27:40  swa
- cosmetics
-
- Revision 1.1  2001/09/12 15:36:41  swa
- source files for junkbuster documentation
-
- Revision 1.3  2001/09/10 17:43:59  swa
- first proposal of a structure.
-
- Revision 1.2  2001/06/13 14:28:31  swa
- docs should have an author.
-
- Revision 1.1  2001/06/13 14:20:37  swa
- first import of project's documentation for the webserver.
-
- -->
-
-</article>
diff --git a/doc/text/developer-manual.txt b/doc/text/developer-manual.txt
deleted file mode 100644 (file)
index e0a8685..0000000
+++ /dev/null
@@ -1,1315 +0,0 @@
-
-Privoxy Developer Manual
-
-   By: Privoxy Developers
-   
-   $Id: developer-manual.sgml,v 1.13 2002/03/27 01:16:41 hal9 Exp $
-   
-   The developer manual gives the users information on how to help the
-   developer team. It provides guidance on coding, testing, documentation
-   and other issues.
-   
-   Privoxy is a web proxy with advanced filtering capabilities for
-   protecting privacy, filtering web page content, managing cookies,
-   controlling access, and removing ads, banners, pop-ups and other
-   obnoxious Internet junk. Privoxy has a very flexible configuration and
-   can be customized to suit individual needs and tastes. Privoxy has
-   application for both stand-alone systems and multi-user networks.
-   
-   Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-   was originally written by JunkBusters Corporation, and was released as
-   free open-source software under the GNU GPL. Stefan Waldherr made many
-   improvements, and started the SourceForge project to continue
-   development. Other developers have since joined Stefan.
-   
-   You can find the latest version of the user manual at
-   [1]http://www.privoxy.org/developer-manual/. Please see the Contact
-   section in the user-manual if you want to contact the developers.
-     _________________________________________________________________
-   
-   Table of Contents
-   1. [2]Introduction
-   2. [3]Quickstart to Privoxy Development
-   3. [4]Documentation Guidelines
-   4. [5]Coding Guidelines
-          
-        4.1. [6]Introduction
-        4.2. [7]Using Comments
-                
-              4.2.1. [8]Comment, Comment, Comment
-              4.2.2. [9]Use blocks for comments
-              4.2.3. [10]Keep Comments on their own line
-              4.2.4. [11]Comment each logical step
-              4.2.5. [12]Comment All Functions Thoroughly
-              4.2.6. [13]Comment at the end of braces if the content is
-                      more than one screen length
-                      
-        4.3. [14]Naming Conventions
-                
-              4.3.1. [15]Variable Names
-              4.3.2. [16]Function Names
-              4.3.3. [17]Header file prototypes
-              4.3.4. [18]Enumerations, and #defines
-              4.3.5. [19]Constants
-                      
-        4.4. [20]Using Space
-                
-              4.4.1. [21]Put braces on a line by themselves.
-              4.4.2. [22]ALL control statements should have a block
-              4.4.3. [23]Do not belabor/blow-up boolean expressions
-              4.4.4. [24]Use white space freely because it is free
-              4.4.5. [25]Don't use white space around structure operators
-              4.4.6. [26]Make the last brace of a function stand out
-              4.4.7. [27]Use 3 character indentions
-                      
-        4.5. [28]Initializing
-                
-              4.5.1. [29]Initialize all variables
-                      
-        4.6. [30]Functions
-                
-              4.6.1. [31]Name functions that return a boolean as a
-                      question.
-                      
-              4.6.2. [32]Always specify a return type for a function.
-              4.6.3. [33]Minimize function calls when iterating by using
-                      variables
-                      
-              4.6.4. [34]Pass and Return by Const Reference
-              4.6.5. [35]Pass and Return by Value
-              4.6.6. [36]Names of include files
-              4.6.7. [37]Provide multiple inclusion protection
-              4.6.8. [38]Use `extern "C"` when appropriate
-              4.6.9. [39]Where Possible, Use Forward Struct Declaration
-                      Instead of Includes
-                      
-        4.7. [40]General Coding Practices
-                
-              4.7.1. [41]Turn on warnings
-              4.7.2. [42]Provide a default case for all switch statements
-              4.7.3. [43]Try to avoid falling through cases in a switch
-                      statement.
-                      
-              4.7.4. [44]Use 'long' or 'short' Instead of 'int'
-              4.7.5. [45]Don't mix size_t and other types
-              4.7.6. [46]Declare each variable and struct on its own
-                      line.
-                      
-              4.7.7. [47]Use malloc/zalloc sparingly
-              4.7.8. [48]The Programmer Who Uses 'malloc' is Responsible
-                      for Ensuring 'free'
-                      
-              4.7.9. [49]Add loaders to the `file_list' structure and in
-                      order
-                      
-              4.7.10. [50]"Uncertain" new code and/or changes to exitinst
-                      code, use FIXME
-                      
-        4.8. [51]Addendum: Template for files and function comment
-                blocks:
-                
-   5. [52]Version Control Guidelines
-   6. [53]Testing Guidelines
-          
-        6.1. [54]Testplan for releases
-        6.2. [55]Test reports
-                
-   7. [56]Contact the developers
-   8. [57]Copyright and History
-   9. [58]See also
-          
-1. Introduction
-
-   To be filled.
-     _________________________________________________________________
-   
-2. Quickstart to Privoxy Development
-
-   You'll need an account on Sourceforge to support our development. Mail
-   you ID to the list and wait until a project manager has added you. For
-   the time beeing (read, this section is under construction), please
-   note the following guidelines for changing stuff in the code. If it is
-   
-    1. A bugfix / clean-up / cosmetic thing: shoot
-    2. A new feature that can be turned off: shoot
-    3. A clear improvement w/o side effects on other parts of the code:
-       shoot
-    4. A matter of taste: ask the list
-    5. A major redesign of some part of the code: ask the list
-     _________________________________________________________________
-   
-3. Documentation Guidelines
-
-   All docs are in SGML format and located in the doc/source directory.
-   
-   How do you update the webserver (i.e. the pages on sourceforge)?
-   
-    1. Run make dok (which uses the documents in doc/source to update all
-       text files in doc/text and to update all web documents in
-       doc/webserver.
-    2. Run make webserver which copies all files from doc/webserver to
-       the sourceforge webserver via scp.
-     _________________________________________________________________
-   
-4. Coding Guidelines
-
-4.1. Introduction
-
-   This set of standards is designed to make our lives easier. It is
-   developed with the simple goal of helping us keep the "new and
-   improved Privoxy" consistent and reliable. Thus making maintenance
-   easier and increasing chances of success of the project.
-   
-   And that of course comes back to us as individuals. If we can increase
-   our development and product efficiencies then we can solve more of the
-   request for changes/improvements and in general feel good about
-   ourselves. ;->
-     _________________________________________________________________
-   
-4.2. Using Comments
-
-4.2.1. Comment, Comment, Comment
-
-   Explanation:
-   
-   Comment as much as possible without commenting the obvious. For
-   example do not comment "aVariable is equal to bVariable". Instead
-   explain why aVariable should be equal to the bVariable. Just because a
-   person can read code does not mean they will understand why or what is
-   being done. A reader may spend a lot more time figuring out what is
-   going on when a simple comment or explanation would have prevented the
-   extra research. Please help your brother IJB'ers out!
-   
-   The comments will also help justify the intent of the code. If the
-   comment describes something different than what the code is doing then
-   maybe a programming error is occurring.
-   
-   Example:
-/* if page size greater than 1k ... */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-/* if page size is small, send it in blocks */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-This demonstrates 2 cases of "what not to do".  The first is a
-"syntax comment".  The second is a comment that does not fit what
-is actually being done.
-     _________________________________________________________________
-   
-4.2.2. Use blocks for comments
-
-   Explanation:
-   
-   Comments can help or they can clutter. They help when they are
-   differentiated from the code they describe. One line comments do not
-   offer effective separation between the comment and the code. Block
-   identifiers do, by surrounding the code with a clear, definable
-   pattern.
-   
-   Example:
-/*********************************************************************
- * This will stand out clearly in your code!
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-/* unfortunately, this may not */
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-if ( thisVariable == thatVariable ) /* this may not either */
-{
-   DoSomethingVeryImportant();
-}
-
-   Exception:
-   
-   If you are trying to add a small logic comment and do not wish to
-   "disrubt" the flow of the code, feel free to use a 1 line comment
-   which is NOT on the same line as the code.
-     _________________________________________________________________
-   
-4.2.3. Keep Comments on their own line
-
-   Explanation:
-   
-   It goes back to the question of readability. If the comment is on the
-   same line as the code it will be harder to read than the comment that
-   is on its own line.
-   
-   There are three exceptions to this rule, which should be violated
-   freely and often: during the definition of variables, at the end of
-   closing braces, when used to comment parameters.
-   
-   Example:
-/*********************************************************************
- * This will stand out clearly in your code,
- * But the second example won't.
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-if ( thisVariable == thatVariable ) /*can you see me?*/
-{
-   DoSomethingVeryImportant(); /*not easily*/
-}
-
-
-/*********************************************************************
- * But, the encouraged exceptions:
- *********************************************************************/
-int urls_read     = 0;     /* # of urls read + rejected */
-int urls_rejected = 0;     /* # of urls rejected */
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-}
-
-
-short DoSomethingVeryImportant(
-   short firstparam,   /* represents something */
-   short nextparam     /* represents something else */ )
-{
-   ...code here...
-
-}   /* -END- DoSomethingVeryImportant */
-     _________________________________________________________________
-   
-4.2.4. Comment each logical step
-
-   Explanation:
-   
-   Logical steps should be commented to help others follow the intent of
-   the written code and comments will make the code more readable.
-   
-   If you have 25 lines of code without a comment, you should probably go
-   back into it to see where you forgot to put one.
-   
-   Most "for", "while", "do", etc... loops _probably_ need a comment.
-   After all, these are usually major logic containers.
-     _________________________________________________________________
-   
-4.2.5. Comment All Functions Thoroughly
-
-   Explanation:
-   
-   A reader of the code should be able to look at the comments just prior
-   to the beginning of a function and discern the reason for its
-   existence and the consequences of using it. The reader should not have
-   to read through the code to determine if a given function is safe for
-   a desired use. The proper information thoroughly presented at the
-   introduction of a function not only saves time for subsequent
-   maintenance or debugging, it more importantly aids in code reuse by
-   allowing a user to determine the safety and applicability of any
-   function for the problem at hand. As a result of such benefits, all
-   functions should contain the information presented in the addendum
-   section of this document.
-     _________________________________________________________________
-   
-4.2.6. Comment at the end of braces if the content is more than one screen
-length
-
-   Explanation:
-   
-   Each closing brace should be followed on the same line by a comment
-   that describes the origination of the brace if the original brace is
-   off of the screen, or otherwise far away from the closing brace. This
-   will simplify the debugging, maintenance, and readability of the code.
-   
-   As a suggestion , use the following flags to make the comment and its
-   brace more readable:
-   
-   use following a closing brace: } /* -END- if() or while () or etc...
-   */
-   
-   Example:
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if x is 1 */
-
-or:
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if ( 1 == X ) */
-     _________________________________________________________________
-   
-4.3. Naming Conventions
-
-4.3.1. Variable Names
-
-   Explanation:
-   
-   Use all lowercase, and seperate words via an underscore ('_'). Do not
-   start an identifier with an underscore. (ANSI C reserves these for use
-   by the compiler and system headers.) Do not use identifiers which are
-   reserved in ANSI C++. (E.g. template, class, true, false, ...). This
-   is in case we ever decide to port Privoxy to C++.
-   
-   Example:
-int ms_iis5_hack = 0;
-
-   Instead of:
-   
-int msiis5hack = 0; int msIis5Hack = 0;
-     _________________________________________________________________
-   
-4.3.2. Function Names
-
-   Explanation:
-   
-   Use all lowercase, and seperate words via an underscore ('_'). Do not
-   start an identifier with an underscore. (ANSI C reserves these for use
-   by the compiler and system headers.) Do not use identifiers which are
-   reserved in ANSI C++. (E.g. template, class, true, false, ...). This
-   is in case we ever decide to port Privoxy to C++.
-   
-   Example:
-int load_some_file( struct client_state *csp )
-
-   Instead of:
-   
-int loadsomefile( struct client_state *csp )
-int loadSomeFile( struct client_state *csp )
-     _________________________________________________________________
-   
-4.3.3. Header file prototypes
-
-   Explanation:
-   
-   Use a descriptive parameter name in the function prototype in header
-   files. Use the same parameter name in the header file that you use in
-   the c file.
-   
-   Example:
-(.h) extern int load_aclfile( struct client_state *csp );
-(.c) int load_aclfile( struct client_state *csp )
-
-   Instead of:
-(.h) extern int load_aclfile( struct client_state * ); or
-(.h) extern int load_aclfile();
-(.c) int load_aclfile( struct client_state *csp )
-     _________________________________________________________________
-   
-4.3.4. Enumerations, and #defines
-
-   Explanation:
-   
-   Use all capital letters, with underscores between words. Do not start
-   an identifier with an underscore. (ANSI C reserves these for use by
-   the compiler and system headers.)
-   
-   Example:
-(enumeration) : enum Boolean { FALSE, TRUE };
-(#define) : #define DEFAULT_SIZE 100;
-
-   Note: We have a standard naming scheme for #defines that toggle a
-   feature in the preprocessor: FEATURE_>, where > is a short (preferably
-   1 or 2 word) description.
-   
-   Example:
-#define FEATURE_FORCE 1
-
-#ifdef FEATURE_FORCE
-#define FORCE_PREFIX blah
-#endif /* def FEATURE_FORCE */
-     _________________________________________________________________
-   
-4.3.5. Constants
-
-   Explanation:
-   
-   Spell common words out entirely (do not remove vowels).
-   
-   Use only widely-known domain acronyms and abbreviations. Capitalize
-   all letters of an acronym.
-   
-   Use underscore (_) to separate adjacent acronyms and abbreviations.
-   Never terminate a name with an underscore.
-   
-   Example:
-#define USE_IMAGE_LIST 1
-
-   Instead of:
-   
-#define USE_IMG_LST 1 or
-#define _USE_IMAGE_LIST 1 or
-#define USE_IMAGE_LIST_ 1 or
-#define use_image_list 1 or
-#define UseImageList 1
-     _________________________________________________________________
-   
-4.4. Using Space
-
-4.4.1. Put braces on a line by themselves.
-
-   Explanation:
-   
-   The brace needs to be on a line all by itself, not at the end of the
-   statement. Curly braces should line up with the construct that they're
-   associated with. This practice makes it easier to identify the opening
-   and closing braces for a block.
-   
-   Example:
-if ( this == that )
-{
-   ...
-}
-
-   Instead of:
-   
-   if ( this == that ) { ... }
-   
-   or
-   
-   if ( this == that ) { ... }
-   
-   Note: In the special case that the if-statement is inside a loop, and
-   it is trivial, i.e. it tests for a condidtion that is obvious from the
-   purpose of the block, one-liners as above may optically preserve the
-   loop structure and make it easier to read.
-   
-   Status: developer-discrection.
-   
-   Example exception:
-while ( more lines are read )
-{
-   /* Please document what is/is not a comment line here */
-   if ( it's a comment ) continue;
-
-   do_something( line );
-}
-     _________________________________________________________________
-   
-4.4.2. ALL control statements should have a block
-
-   Explanation:
-   
-   Using braces to make a block will make your code more readable and
-   less prone to error. All control statements should have a block
-   defined.
-   
-   Example:
-if ( this == that )
-{
-   DoSomething();
-   DoSomethingElse();
-}
-
-   Instead of:
-   
-   if ( this == that ) DoSomething(); DoSomethingElse();
-   
-   or
-   
-   if ( this == that ) DoSomething();
-   
-   Note: The first example in "Instead of" will execute in a manner other
-   than that which the developer desired (per indentation). Using code
-   braces would have prevented this "feature". The "explanation" and
-   "exception" from the point above also applies.
-     _________________________________________________________________
-   
-4.4.3. Do not belabor/blow-up boolean expressions
-
-   Example:
-structure->flag = ( condition );
-
-   Instead of:
-   
-   if ( condition ) { structure->flag = 1; } else { structure->flag = 0;
-   }
-   
-   Note: The former is readable and consice. The later is wordy and
-   inefficient. Please assume that any developer new to the project has
-   at least a "good" knowledge of C/C++. (Hope I do not offend by that
-   last comment ... 8-)
-     _________________________________________________________________
-   
-4.4.4. Use white space freely because it is free
-
-   Explanation:
-   
-   Make it readable. The notable exception to using white space freely is
-   listed in the next guideline.
-   
-   Example:
-int firstValue   = 0;
-int someValue    = 0;
-int anotherValue = 0;
-int thisVariable = 0;
-
-if ( thisVariable == thatVariable )
-
-firstValue = oldValue + ( ( someValue - anotherValue ) - whatever )
-     _________________________________________________________________
-   
-4.4.5. Don't use white space around structure operators
-
-   Explanation:
-   
-   - structure pointer operator ( "->" ) - member operator ( "." ) -
-   functions and parentheses
-   
-   It is a general coding practice to put pointers, references, and
-   function parentheses next to names. With spaces, the connection
-   between the object and variable/function name is not as clear.
-   
-   Example:
-aStruct->aMember;
-aStruct.aMember;
-FunctionName();
-
-   Instead of: aStruct -> aMember; aStruct . aMember; FunctionName ();
-     _________________________________________________________________
-   
-4.4.6. Make the last brace of a function stand out
-
-   Example:
-int function1( ... )
-{
-   ...code...
-   return( retCode );
-
-}   /* -END- function1 */
-
-
-int function2( ... )
-{
-}   /* -END- function2 */
-
-   Instead of:
-   
-   int function1( ... ) { ...code... return( retCode ); } int function2(
-   ... ) { }
-   
-   Note: Use 1 blank line before the closing brace and 2 lines
-   afterwards. This makes the end of function standout to the most casual
-   viewer. Although function comments help seperate functions, this is
-   still a good coding practice. In fact, I follow these rules when using
-   blocks in "for", "while", "do" loops, and long if {} statements too.
-   After all whitespace is free!
-   
-   Status: developer-discrection on the number of blank lines. Enforced
-   is the end of function comments.
-     _________________________________________________________________
-   
-4.4.7. Use 3 character indentions
-
-   Explanation:
-   
-   If some use 8 character TABs and some use 3 character TABs, the code
-   can look *very* ragged. So use 3 character indentions only. If you
-   like to use TABs, pass your code through a filter such as "expand -t3"
-   before checking in your code.
-   
-   Example:
-static const char * const url_code_map[256] =
-{
-   NULL, ...
-};
-
-
-int function1( ... )
-{
-   if ( 1 )
-   {
-      return( ALWAYS_TRUE );
-   }
-   else
-   {
-      return( HOW_DID_YOU_GET_HERE );
-   }
-
-   return( NEVER_GETS_HERE );
-
-}
-     _________________________________________________________________
-   
-4.5. Initializing
-
-4.5.1. Initialize all variables
-
-   Explanation:
-   
-   Do not assume that the variables declared will not be used until after
-   they have been assigned a value somewhere else in the code. Remove the
-   chance of accidentally using an unassigned variable.
-   
-   Example:
-short anShort = 0;
-float aFloat  = 0;
-struct *ptr = NULL;
-
-   Note: It is much easier to debug a SIGSEGV if the message says you are
-   trying to access memory address 00000000 and not 129FA012; or
-   arrayPtr[20] causes a SIGSEV vs. arrayPtr[0].
-   
-   Status: developer-discrection if and only if the variable is assigned
-   a value "shortly after" declaration.
-     _________________________________________________________________
-   
-4.6. Functions
-
-4.6.1. Name functions that return a boolean as a question.
-
-   Explanation:
-   
-   Value should be phrased as a question that would logically be answered
-   as a true or false statement
-   
-   Example:
-ShouldWeBlockThis();
-ContainsAnImage();
-IsWebPageBlank();
-     _________________________________________________________________
-   
-4.6.2. Always specify a return type for a function.
-
-   Explanation:
-   
-   The default return for a function is an int. To avoid ambiguity,
-   create a return for a function when the return has a purpose, and
-   create a void return type if the function does not need to return
-   anything.
-     _________________________________________________________________
-   
-4.6.3. Minimize function calls when iterating by using variables
-
-   Explanation:
-   
-   It is easy to write the following code, and a clear argument can be
-   made that the code is easy to understand:
-   
-   Example:
-for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ )
-{
-   ....
-}
-
-   Note: Unfortunately, this makes a function call for each and every
-   iteration. This increases the overhead in the program, because the
-   compiler has to look up the function each time, call it, and return a
-   value. Depending on what occurs in the blockListLength() call, it
-   might even be creating and destroying structures with each iteration,
-   even though in each case it is comparing "cnt" to the same value, over
-   and over. Remember too - even a call to blockListLength() is a
-   function call, with the same overhead.
-   
-   Instead of using a function call during the iterations, assign the
-   value to a variable, and evaluate using the variable.
-   
-   Example:
-size_t len = blockListLength();
-
-for ( size_t cnt = 0; cnt < len; cnt ++ )
-{
-   ....
-}
-
-   Exceptions: if the value of blockListLength() *may* change or could
-   *potentially* change, then you must code the function call in the
-   for/while loop.
-     _________________________________________________________________
-   
-4.6.4. Pass and Return by Const Reference
-
-   Explanation:
-   
-   This allows a developer to define a const pointer and call your
-   function. If your function does not have the const keyword, we may not
-   be able to use your function. Consider strcmp, if it were defined as:
-   extern int strcmp( char *s1, char *s2 );
-   
-   I could then not use it to compare argv's in main: int main( int argc,
-   const char *argv[] ) { strcmp( argv[0], "privoxy" ); }
-   
-   Both these pointers are *const*! If the c runtime library maintainers
-   do it, we should too.
-     _________________________________________________________________
-   
-4.6.5. Pass and Return by Value
-
-   Explanation:
-   
-   Most structures cannot fit onto a normal stack entry (i.e. they are
-   not 4 bytes or less). Aka, a function declaration like: int
-   load_aclfile( struct client_state csp )
-   
-   would not work. So, to be consistent, we should declare all prototypes
-   with "pass by value": int load_aclfile( struct client_state *csp )
-     _________________________________________________________________
-   
-4.6.6. Names of include files
-
-   Explanation:
-   
-   Your include statements should contain the file name without a path.
-   The path should be listed in the Makefile, using -I as processor
-   directive to search the indicated paths. An exception to this would be
-   for some proprietary software that utilizes a partial path to
-   distinguish their header files from system or other header files.
-   
-   Example:
-#include <iostream.h>     /* This is not a local include */
-#include "config.h"       /* This IS a local include */
-
-   Exception:
-   
-/* This is not a local include, but requires a path element. */
-#include <sys/fileName.h>
-
-   Note: Please! do not add "-I." to the Makefile without a _very_ good
-   reason. This duplicates the #include "file.h" behaviour.
-     _________________________________________________________________
-   
-4.6.7. Provide multiple inclusion protection
-
-   Explanation:
-   
-   Prevents compiler and linker errors resulting from redefinition of
-   items.
-   
-   Wrap each header file with the following syntax to prevent multiple
-   inclusions of the file. Of course, replace PROJECT_H with your file
-   name, with "." Changed to "_", and make it uppercase.
-   
-   Example:
-#ifndef PROJECT_H_INCLUDED
-#define PROJECT_H_INCLUDED
- ...
-#endif /* ndef PROJECT_H_INCLUDED */
-     _________________________________________________________________
-   
-4.6.8. Use `extern "C"` when appropriate
-
-   Explanation:
-   
-   If our headers are included from C++, they must declare our functions
-   as `extern "C"`. This has no cost in C, but increases the potential
-   re-usability of our code.
-   
-   Example:
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* def __cplusplus */
-
-... function definitions here ...
-
-#ifdef __cplusplus
-}
-#endif /* def __cplusplus */
-     _________________________________________________________________
-   
-4.6.9. Where Possible, Use Forward Struct Declaration Instead of Includes
-
-   Explanation:
-   
-   Useful in headers that include pointers to other struct's.
-   Modifications to excess header files may cause needless compiles.
-   
-   Example:
-/*********************************************************************
- * We're avoiding an include statement here!
- *********************************************************************/
-struct file_list;
-extern file_list *xyz;
-
-   Note: If you declare "file_list xyz;" (without the pointer), then
-   including the proper header file is necessary. If you only want to
-   prototype a pointer, however, the header file is unneccessary.
-   
-   Status: Use with discrection.
-     _________________________________________________________________
-   
-4.7. General Coding Practices
-
-4.7.1. Turn on warnings
-
-   Explanation
-   
-   Compiler warnings are meant to help you find bugs. You should turn on
-   as many as possible. With GCC, the switch is "-Wall". Try and fix as
-   many warnings as possible.
-     _________________________________________________________________
-   
-4.7.2. Provide a default case for all switch statements
-
-   Explanation:
-   
-   What you think is guaranteed is never really guaranteed. The value
-   that you don't think you need to check is the one that someday will be
-   passed. So, to protect yourself from the unknown, always have a
-   default step in a switch statement.
-   
-   Example:
-switch( hash_string( cmd ) )
-{
-   case hash_actions_file :
-      ... code ...
-      break;
-
-   case hash_confdir :
-      ... code ...
-      break;
-
-   default :
-      log_error( ... );
-      ... anomly code goes here ...
-      continue; / break; / exit( 1 ); / etc ...
-
-} /* end switch( hash_string( cmd ) ) */
-
-   Note: If you already have a default condition, you are obviously
-   exempt from this point. Of note, most of the WIN32 code calls
-   `DefWindowProc' after the switch statement. This API call *should* be
-   included in a default statement.
-   
-   Another Note: This is not so much a readability issue as a robust
-   programming issue. The "anomly code goes here" may be no more than a
-   print to the STDERR stream (as in load_config). Or it may really be an
-   ABEND condition.
-   
-   Status: Programmer discretion is advised.
-     _________________________________________________________________
-   
-4.7.3. Try to avoid falling through cases in a switch statement.
-
-   Explanation:
-   
-   In general, you will want to have a 'break' statement within each
-   'case' of a switch statement. This allows for the code to be more
-   readable and understandable, and furthermore can prevent unwanted
-   surprises if someone else later gets creative and moves the code
-   around.
-   
-   The language allows you to plan the fall through from one case
-   statement to another simply by omitting the break statement within the
-   case statement. This feature does have benefits, but should only be
-   used in rare cases. In general, use a break statement for each case
-   statement.
-   
-   If you choose to allow fall through, you should comment both the fact
-   of the fall through and reason why you felt it was necessary.
-     _________________________________________________________________
-   
-4.7.4. Use 'long' or 'short' Instead of 'int'
-
-   Explanation:
-   
-   On 32-bit platforms, int usually has the range of long. On 16-bit
-   platforms, int has the range of short.
-   
-   Status: open-to-debate. In the case of most FSF projects (including
-   X/GNU-Emacs), there are typedefs to int4, int8, int16, (or equivalence
-   ... I forget the exact typedefs now). Should we add these to IJB now
-   that we have a "configure" script?
-     _________________________________________________________________
-   
-4.7.5. Don't mix size_t and other types
-
-   Explanation:
-   
-   The type of size_t varies across platforms. Do not make assumptions
-   about whether it is signed or unsigned, or about how long it is. Do
-   not compare a size_t against another variable of a different type (or
-   even against a constant) without casting one of the values. Try to
-   avoid using size_t if you can.
-     _________________________________________________________________
-   
-4.7.6. Declare each variable and struct on its own line.
-
-   Explanation:
-   
-   It can be tempting to declare a series of variables all on one line.
-   Don't.
-   
-   Example:
-long a = 0;
-long b = 0;
-long c = 0;
-
-   Instead of:
-   
-   long a, b, c;
-   
-   Explanation: - there is more room for comments on the individual
-   variables - easier to add new variables without messing up the
-   original ones - when searching on a variable to find its type, there
-   is less clutter to "visually" eliminate
-   
-   Exceptions: when you want to declare a bunch of loop variables or
-   other trivial variables; feel free to declare them on 1 line. You
-   should, although, provide a good comment on their functions.
-   
-   Status: developer-discrection.
-     _________________________________________________________________
-   
-4.7.7. Use malloc/zalloc sparingly
-
-   Explanation:
-   
-   Create a local stuct (on the stack) if the variable will live and die
-   within the context of one function call.
-   
-   Only "malloc" a struct (on the heap) if the variable's life will
-   extend beyond the context of one function call.
-   
-   Example:
-If a function creates a struct and stores a pointer to it in a
-list, then it should definately be allocated via `malloc'.
-     _________________________________________________________________
-   
-4.7.8. The Programmer Who Uses 'malloc' is Responsible for Ensuring 'free'
-
-   Explanation:
-   
-   If you have to "malloc" an instance, you are responsible for insuring
-   that the instance is `free'd, even if the deallocation event falls
-   within some other programmer's code. You are also responsible for
-   ensuring that deletion is timely (i.e. not too soon, not too late).
-   This is known as "low-coupling" and is a "good thing (tm)". You may
-   need to offer a free/unload/destuctor type function to accomodate
-   this.
-   
-   Example:
-int load_re_filterfile( struct client_state *csp ) { ... }
-static void unload_re_filterfile( void *f ) { ... }
-
-   Exceptions:
-   
-   The developer cannot be expected to provide `free'ing functions for C
-   run-time library functions ... such as `strdup'.
-   
-   Status: developer-discrection. The "main" use of this standard is for
-   allocating and freeing data structures (complex or nested).
-     _________________________________________________________________
-   
-4.7.9. Add loaders to the `file_list' structure and in order
-
-   Explanation:
-   
-   I have ordered all of the "blocker" file code to be in alpha order. It
-   is easier to add/read new blockers when you expect a certain order.
-   
-   Note: It may appear that the alpha order is broken in places by POPUP
-   tests coming before PCRS tests. But since POPUPs can also be referred
-   to as KILLPOPUPs, it is clear that it should come first.
-     _________________________________________________________________
-   
-4.7.10. "Uncertain" new code and/or changes to exitinst code, use FIXME
-
-   Explanation:
-   
-   If you have enough confidence in new code or confidence in your
-   changes, but are not *quite* sure of the reprocussions, add this:
-   
-   /* FIXME: this code has a logic error on platform XYZ, * attempthing
-   to fix */ #ifdef PLATFORM ...changed code here... #endif
-   
-   or:
-   
-   /* FIXME: I think the original author really meant this... */
-   ...changed code here...
-   
-   or:
-   
-   /* FIXME: new code that *may* break something else... */ ...new code
-   here...
-   
-   Note: If you make it clear that this may or may not be a "good thing
-   (tm)", it will be easier to identify and include in the project (or
-   conversly exclude from the project).
-     _________________________________________________________________
-   
-4.8. Addendum: Template for files and function comment blocks:
-
-   Example for file comments:
-const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16
-:41 hal9 Exp $";
-/*********************************************************************
- *
- * File        :  $Source$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log$
- *
- *********************************************************************/
-
-
-#include "config.h"
-
-   ...necessary include files for us to do our work...
-
-const char FILENAME_h_rcs[] = FILENAME_H_VERSION;
-
-   Note: This declares the rcs variables that should be added to the
-   "show-proxy-args" page. If this is a brand new creation by you, you
-   are free to change the "Copyright" section to represent the rights you
-   wish to maintain.
-   
-   Note: The formfeed character that is present right after the comment
-   flower box is handy for (X|GNU)Emacs users to skip the verbige and get
-   to the heart of the code (via `forward-page' and `backward-page').
-   Please include it if you can.
-   
-   Example for file header comments:
-#ifndef _FILENAME_H
-#define _FILENAME_H
-#define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16:
-41 hal9 Exp $"
-/*********************************************************************
- *
- * File        :  $Source$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log$
- *
- *********************************************************************/
-
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-   ... function headers here ...
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char FILENAME_rcs[];
-extern const char FILENAME_h_rcs[];
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef _FILENAME_H */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
-
-   Example for function comments:
-/*********************************************************************
- *
- * Function    :  FUNCTION_NAME
- *
- * Description :  (Fill me in with a good description!)
- *
- * parameters  :
- *          1  :  param1 = pointer to an important thing
- *          2  :  x      = pointer to something else
- *
- * Returns     :  0 => Ok, everything else is an error.
- *
- *********************************************************************/
-int FUNCTION_NAME( void *param1, const char *x )
-{
-   ...
-   return( 0 );
-
-}
-
-   Note: If we all follow this practice, we should be able to parse our
-   code to create a "self-documenting" web page.
-     _________________________________________________________________
-   
-5. Version Control Guidelines
-
-   To be filled. note on cvs comments. don't comment what you did,
-   comment why you did it.
-     _________________________________________________________________
-   
-6. Testing Guidelines
-
-   To be filled.
-     _________________________________________________________________
-   
-6.1. Testplan for releases
-
-   Explain release numbers. major, minor. developer releases. etc.
-   
-    1. Remove any existing rpm with rpm -e
-    2. Remove any file that was left over. This includes (but is not
-       limited to)
-          + /var/log/privoxy
-          + /etc/privoxy
-          + /usr/sbin/privoxy
-          + /etc/init.d/privoxy
-          + /usr/doc/privoxy*
-    3. Install the rpm. Any error messages?
-    4. start,stop,status Privoxy with the specific script (e.g.
-       /etc/rc.d/init/privoxy stop). Reboot your machine. Does autostart
-       work?
-    5. Start browsing. Does Privoxy work? Logfile written?
-    6. Remove the rpm. Any error messages? All files removed?
-     _________________________________________________________________
-   
-6.2. Test reports
-
-   Please submit test reports only with the [59]test form at sourceforge.
-   Three simple steps:
-   
-     * Select category: the distribution you test on.
-     * Select group: the version of Privoxy that we are about to release.
-     * Fill the Summary and Detailed Description with something
-       intelligent (keep it short and precise).
-       
-   Do not mail to the mailinglist (we cannot keep track on issues there).
-     _________________________________________________________________
-   
-7. Contact the developers
-
-   Please see the user manual for information on how to contact the
-   developers.
-     _________________________________________________________________
-   
-8. Copyright and History
-
-   Please see the user manual for information on Copyright and History.
-     _________________________________________________________________
-   
-9. See also
-
-   Please see the user manual for information on references.
-
-References
-
-   1. http://www.privoxy.org/developer-manual/
-   2. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INTRODUCTION
-   3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUICKSTART
-   4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DOCUMENTATION
-   5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CODING
-   6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S1
-   7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S2
-   8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S3
-   9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S4
-  10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S5
-  11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S6
-  12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S7
-  13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S8
-  14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S9
-  15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S10
-  16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S11
-  17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S12
-  18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S13
-  19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S14
-  20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S15
-  21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S16
-  22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S17
-  23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S18
-  24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S19
-  25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S20
-  26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S21
-  27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S22
-  28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S23
-  29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S24
-  30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S25
-  31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S26
-  32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S27
-  33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S28
-  34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S29
-  35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S30
-  36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S31
-  37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S32
-  38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S33
-  39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S34
-  40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S35
-  41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S36
-  42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S37
-  43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S38
-  44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S39
-  45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S40
-  46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S41
-  47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S42
-  48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S43
-  49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S44
-  50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S45
-  51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S46
-  52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CVS
-  53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING
-  54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-PLAN
-  55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-REPORT
-  56. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONTACT
-  57. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT
-  58. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO
-  59. http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005
diff --git a/doc/text/faq.txt b/doc/text/faq.txt
deleted file mode 100644 (file)
index 2e9bfbb..0000000
+++ /dev/null
@@ -1,881 +0,0 @@
-
-Privoxy Frequently Asked Questions
-
-   By: Privoxy Developers
-   
-   $Id: faq.sgml,v 1.32 2002/03/27 00:57:03 hal9 Exp $
-   
-   This FAQ gives users and developers alike answers to frequently asked
-   questions about Privoxy.
-   
-   Privoxy is a web proxy with advanced filtering capabilities for
-   protecting privacy, filtering web page content, managing cookies,
-   controlling access, and removing ads, banners, pop-ups and other
-   obnoxious Internet junk. Privoxy has a very flexible configuration and
-   can be customized to suit individual needs and tastes. Privoxy has
-   application for both stand-alone systems and multi-user networks.
-   
-   Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-   was originally written by JunkBusters Corporation, and was released as
-   free open-source software under the GNU GPL. Stefan Waldherr made many
-   improvements, and started the SourceForge project to continue
-   development.
-   
-   You can find the latest version of the document at
-   [1]http://www.privoxy.org/faq/. Please see the Contact section in the
-   [2]user-manual if you want to contact the developers.
-     _________________________________________________________________
-   
-   Table of Contents
-   1. [3]Frequently Asked Questions
-          
-        1.1. [4]General Information
-                
-              1.1.1. [5]What is this new version of Privoxy?
-              1.1.2. [6]Why "Privoxy"? Why a name change at all?
-              1.1.3. [7]How does it differ from the old Junkbuster?
-              1.1.4. [8]What are some of the new features?
-              1.1.5. [9]What is a "proxy"? How does Privoxy work?
-              1.1.6. [10]My browser does the same things as Privoxy. Why
-                      should I use Privoxy at all?
-                      
-              1.1.7. [11]Is there is a license or fee? What about a
-                      warranty? Registration?
-                      
-              1.1.8. [12]I would like to help you, what do I do?
-                      
-        1.2. [13]Installation
-                
-              1.2.1. [14]Which browsers are supported by Privoxy?
-              1.2.2. [15]Which operating systems are supported?
-              1.2.3. [16]Can I install Privoxy over Junkbuster?
-              1.2.4. [17]I just installed Privoxy. Is there anything
-                      special I have to do now?
-                      
-              1.2.5. [18]What is the proxy address of Privoxy?
-              1.2.6. [19]I just installed Privoxy, and nothing is
-                      happening. All the ads are there. What's wrong?
-                      
-        1.3. [20]Configuration
-                
-              1.3.1. [21]Can I use my old config files?
-              1.3.2. [22]What is an "actions" file?
-              1.3.3. [23]The "actions"concept confuses me. Please list
-                      some of these "actions".
-                      
-              1.3.4. [24]How are actions files configured? What is the
-                      easiest way to do this?
-                      
-              1.3.5. [25]What are the differences between
-                      intermediate.action, basic.action, etc.?
-                      
-              1.3.6. [26]Why can I change the configuration with a
-                      browser? Does that not raise security issues?
-                      
-              1.3.7. [27]What is a "default.filter"?
-              1.3.8. [28]How can I set up Privoxy to act as a proxy for
-                      my LAN?
-                      
-              1.3.9. [29]Instead of ads, now I get a checkerboard
-                      pattern. I don't want to see anything.
-                      
-              1.3.10. [30]Why would anybody want to see a checkerboard
-                      pattern?
-                      
-              1.3.11. [31]I see large red banners on some pages that say
-                      "Blocked". How do I get rid of this?
-                      
-              1.3.12. [32]How can I make Privoxy work with other proxies
-                      like Squid?
-                      
-        1.4. [33]Miscellaneous
-                
-              1.4.1. [34]How much does Privoxy slow my browsing down?
-                      This has to add extra time to browsing.
-                      
-              1.4.2. [35]I noticed considerable delays in page requests
-                      compared to the old Junkbuster. What's wrong?
-                      
-              1.4.3. [36]What is the "http://p.p/"?
-              1.4.4. [37]Do you still maintain the blocklists?
-              1.4.5. [38]How can I submit new ads?
-              1.4.6. [39]How can I hide my IP address?
-              1.4.7. [40]Can Privoxy guarantee I am anonymous?
-              1.4.8. [41]Might some things break because header
-                      information is being altered?
-                      
-              1.4.9. [42]Can Privoxy act as a "caching" proxy to speed up
-                      web browsing?
-                      
-              1.4.10. [43]What about as a firewall? Can Privoxy protect
-                      me?
-                      
-              1.4.11. [44]The Privoxy logo that replaces ads is very
-                      blocky and ugly looking. Can't a better font be
-                      used?
-                      
-              1.4.12. [45]I have large empty spaces now where ads used to
-                      be. Why does Privoxy leave these large gaps?
-                      
-              1.4.13. [46]How can Privoxy filter Secure (HTTPS) URLs?
-              1.4.14. [47]Privoxy runs as a "server". How secure is it?
-                      Do I need to take any special precautions?
-                      
-              1.4.15. [48]How can I temporarily disable Privoxy?
-                      
-        1.5. [49]Troubleshooting
-                
-              1.5.1. [50]I just upgraded and am getting "connection
-                      refused" with every web page?
-                      
-              1.5.2. [51]I just added a new rule, but the steenkin ad is
-                      still getting through. How?
-                      
-              1.5.3. [52]One of my favorite sites does not work with
-                      Privoxy. What can I do?
-                      
-              1.5.4. [53]What time is it?
-                      
-   2. [54]Copyright and History
-   3. [55]See also
-          
-1. Frequently Asked Questions
-
-1.1. General Information
-
-1.1.1. What is this new version of Privoxy?
-
-   The original Internet Junkbuster (tm) is a copyrighted product of
-   [56]Junkbusters Corporation. Development of this effort stopped some
-   time ago as of version 2.0.2. Stefan Waldherr started the ijbswa
-   project on [57]Sourceforge to rekindle development. Other developers
-   subsequently joined with Stefan, and have since added many new
-   features, refinements and enhancements.
-   
-   The new Privoxy started with the same Junkbuster code base, but has
-   changed significantly at this point.
-     _________________________________________________________________
-   
-1.1.2. Why "Privoxy"? Why a name change at all?
-
-   Privoxy is for "Privacy Enhancing Proxy". There are possible legal
-   complications from the continued use of the Junkbuster name, which is
-   a trademark of [58]Junkbusters Corporation. (There are no objections
-   from Junkbusters Corporation to the Privoxy project itself though, and
-   they in fact still share our ideals and goals.)
-   
-   The developers also believed that there so many changes from the
-   original code, that it was time to make a clean break from the past
-   and make a name in their own right, especially now with the pending
-   release of version 3.0.
-     _________________________________________________________________
-   
-1.1.3. How does it differ from the old Junkbuster?
-
-   All the old features remain. The new Privoxy still blocks ads and
-   banners, still manages cookies, and still helps protect your privacy.
-   But, these are all enhanced, and many new features have been added,
-   all in the same vein.
-   
-   The configuration has changed significantly as well. This is something
-   that users will notice right off the bat. The "blocklist" file does
-   not exist any more. This is replaced by "actions" files, such as
-   default.actions. This is where most of the per site configuration is
-   now.
-     _________________________________________________________________
-   
-1.1.4. What are some of the new features?
-
-     * Integrated browser based configuration and control utility
-       ([59]http://p.p). Browser-based tracing of rule and filter
-       effects.
-     * Blocking of annoying pop-up browser windows.
-     * HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-     * Support for Perl Compatible Regular Expressions in the
-       configuration files, and generally a more sophisticated and
-       flexible configuration syntax over previous versions.
-     * GIF de-animation.
-     * Web page content filtering (removes banners based on size,
-       invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.)
-     * Bypass many click-tracking scripts (avoids script redirection).
-     * Multi-threaded (POSIX and native threads).
-     * Auto-detection and re-reading of config file changes.
-     * User-customizable HTML templates (e.g. 404 error page).
-     * Improved cookie management features (e.g. session based cookies).
-     * Builds from source on most UNIX-like systems. Packages available
-       for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac
-       OSX, OS/2, HP-UX 11 and AmigaOS.
-     * In addition, the configuration is much more powerful and versatile
-       over-all.
-     _________________________________________________________________
-   
-1.1.5. What is a "proxy"? How does Privoxy work?
-
-   When you connect to a web site with Privoxy, you are really connecting
-   to your locally running version of Privoxy. Privoxy intercepts your
-   requests for the web page, and relays that to the "real" web site. The
-   web site sends the HTTP data stream back to Privoxy, where Privoxy can
-   work its magic before it relays this data back to your web browser.
-   
-   Since Privoxy sits between you and the WWW, it is in a position to
-   intercept and completely manage all web traffic and HTTP content
-   before it gets to your browser. Privoxy uses various programming
-   methods to do this, all of which is under your control via the various
-   configuration files and options.
-   
-   There are many kinds of proxies. Privoxy best fits the "filtering
-   proxy" category.
-     _________________________________________________________________
-   
-1.1.6. My browser does the same things as Privoxy. Why should I use Privoxy
-at all?
-
-   Modern browsers do indeed have some of the same functionality as
-   Privoxy. Maybe this is adequate for you. But Privoxy is much more
-   versatile and powerful, and can do a number of things that browsers
-   just can't.
-   
-   In addition, a proxy is good choice if you use multiple browsers, or
-   have a LAN with multiple computers. This way all the configuration is
-   in one place, and you don't have to maintain a similar configuration
-   for possibly many browsers.
-     _________________________________________________________________
-   
-1.1.7. Is there is a license or fee? What about a warranty? Registration?
-
-   Privoxy is licensed under the GNU General Public License (GPL). It is
-   free to use, copy, modify or distribute as you wish under the terms of
-   this license. See [60]http://www.gnu.org/copyleft/gpl.html for
-   specifics.
-   
-   There is no warranty of any kind, expressed, implied or otherwise.
-   That is something that would cost real money ;-) There is no
-   registration either. Privoxy really is free in every respect!
-     _________________________________________________________________
-   
-1.1.8. I would like to help you, what do I do?
-
-1.1.8.1. Money Money Money
-
-   We, of course, welcome donations and use the money for domain
-   registering, regular world-wide get-togethers (hahaha). Anyway, we'll
-   soon describe the process how to donate money to the team.
-     _________________________________________________________________
-   
-1.1.8.2. You want to work with us?
-
-   Well, helping the team is always a good idea. We welcome new
-   developers, RPM gurus or documentation makers. Simply get an account
-   on sourceforge.net and mail your id to the developer mailing list.
-   Then read the section Quickstart in the developers manual.
-   
-   Once we have added you to the team, you'll have write access to the
-   CVS repository, and together we'll find a suitable task for you.
-     _________________________________________________________________
-   
-1.2. Installation
-
-1.2.1. Which browsers are supported by Privoxy?
-
-   Any browser that can be configured to use a "proxy", which is probably
-   almost all browsers. Direct browser support is not necessary since
-   Privoxy runs as a separate application and just exchanges standard
-   HTML data with your browser.
-     _________________________________________________________________
-   
-1.2.2. Which operating systems are supported?
-
-   Right now Win32, Mac OSX, OS/2, AmigaOS, Linux, and many flavors of
-   Unix.
-   
-   Source code is available, so porting to other operating systems, is
-   always a possibility.
-     _________________________________________________________________
-   
-1.2.3. Can I install Privoxy over Junkbuster?
-
-   We recommend you uninstall Junkbuster first to minimize conflicts and
-   confusion. You may want to save your old configuration files for
-   future reference. The configuration is substantially changed.
-   
-   See the [61]user-manual for platform specific installation
-   instructions. [FIXME: This is meant for after the name change for
-   3.0!]
-     _________________________________________________________________
-   
-1.2.4. I just installed Privoxy. Is there anything special I have to do now?
-
-   All browsers must be told to use Privoxy as a proxy by specifying the
-   correct proxy address and port number in the appropriate configuration
-   area for the browser. See below.
-     _________________________________________________________________
-   
-1.2.5. What is the proxy address of Privoxy?
-
-   If you set up the Privoxy to run on the computer you browse from
-   (rather than your ISP's server or some networked computer on a LAN),
-   the proxy will be on "localhost" (which is the special name used by
-   every computer on the Internet to refer to itself) and the port will
-   be 8118 (unless you have Privoxy to run on a different port with the
-   listen-address config option).
-   
-   When configuring your browser's proxy settings you typically enter the
-   word "localhost" in the boxes next to "HTTP" and "Secure" (HTTPS) and
-   then the number "8118" for "port". This tells your browser to send all
-   web requests to Privoxy instead of directly to the Internet.
-   
-   Privoxy can also be used to proxy for a Local Area Network. In this
-   case, your would enter either the IP address of the LAN host where
-   Privoxy is running, or the equivalent hostname. Port assignment would
-   be same as above.
-   
-   Privoxy does not currently handle protocols such as FTP, SMTP, IM,
-   IRC, ICQ, or other Internet protocols.
-     _________________________________________________________________
-   
-1.2.6. I just installed Privoxy, and nothing is happening. All the ads are
-there. What's wrong?
-
-   Did you configure your browser to use Privoxy as a proxy? It does not
-   sound like it. See above. You might also try flushing the browser's
-   caches to force a full re-reading of pages. You can verify that
-   Privoxy is running, and your browser is correctly configured by
-   entering the special URL: [62]http://p.p/. This should give you a
-   banner that says "This is Privoxy" and access to Privoxy's internal
-   configuration. If you see this, then you are good to go. If not, the
-   browser or Privoxy are not set up correctly.
-     _________________________________________________________________
-   
-1.3. Configuration
-
-1.3.1. Can I use my old config files?
-
-   There are major changes to Junkbuster configuration from version 2.0.x
-   to 2.9.x and later. The older files will not work at all. If this is
-   the case, you will need to re-enter your old data into the new
-   configuration structure. This is probably also a good recommendation
-   even if upgrading from 2.9.x to 3.x since there were many minor
-   changes along the way.
-     _________________________________________________________________
-   
-1.3.2. What is an "actions" file?
-
-   "actions" files are where various actions that Privoxy might take, are
-   configured. Typically, you would define a set of default actions that
-   apply to all URLs, then add exceptions to these defaults.
-   
-   Actions can be defined on a per site basis, or for groups of sites.
-   Actions can also be grouped together and then applied to one or more
-   sites. There are many possible actions that might apply to any given
-   site. As an example, if we are blocking cookies as one of our default
-   actions, but need to accept cookies from a given site, we would define
-   this in our "actions" file.
-   
-   Privoxy comes with several default actions files, with varying degrees
-   of filtering and blocking, as starting points for your own
-   configuration (see below).
-     _________________________________________________________________
-   
-1.3.3. The "actions"concept confuses me. Please list some of these
-"actions".
-
-   These are all explained in the [63]user-manual. Please refer to that.
-     _________________________________________________________________
-   
-1.3.4. How are actions files configured? What is the easiest way to do this?
-
-   The easiest way to do this, is to access Privoxy with your web browser
-   at [64]http://p.p/, and then select "[65]Edit the actions list" from
-   the selection list. You can also do this by editing the appropriate
-   file with a text editor.
-   
-   Please see the [66]user-manual for a detailed explanation of these and
-   other configuration files, and their various options and syntax.
-     _________________________________________________________________
-   
-1.3.5. What are the differences between intermediate.action, basic.action,
-etc.?
-
-   Configuring Privoxy is not easy. To help you get started, we provide
-   you with three different default configurations. The following table
-   shows you, which features are enabled in each configuration.
-   
-   Table 1. Default Configurations
-   Feature default.action basic.action intermediate.action
-   advanced.action
-   ad-filtering ? x x x
-   blank image ? x x x
-   de-animate GIFs ? x x x
-   referer forging ? x x x
-   jon's +no-cookies-keep (i.e. session cookies only) ? x x x
-   no-popup windows ?   x x
-   fast redirects ?   x x
-   hide-referrer ?   x x
-   hide-useragent ?   x x
-   content-modification ?     x
-   feature-x ?
-   feature-y ?
-   feature-z ?
-     _________________________________________________________________
-   
-1.3.6. Why can I change the configuration with a browser? Does that not
-raise security issues?
-
-   What I don't understand, is how I can browser edit the config file as
-   a regular user, while the whole /etc/privoxy hierarchy belongs to the
-   user "privoxy", with only 644 perms.
-   
-   When you use the browser-based editor, Privoxy itself is writing to
-   the config files. Because Privoxy is running as the user "privoxy", it
-   can update the config files.
-   
-   If you don't like this, setting "enable-edit-actions 0" in the config
-   file will disable the browser-based editor. If you're that paranoid,
-   you should also consider setting "enable-remote-toggle 0" to prevent
-   browser-based enabling/disabling of Privoxy.
-   
-   Note that normally only local users can connect to Privoxy, so this is
-   not (normally) a security problem.
-     _________________________________________________________________
-   
-1.3.7. What is a "default.filter"?
-
-   The "default.filter" file is used to "filter" any web page content. By
-   "filtering" we mean it can modify, remove, or change anything on the
-   page, including HTML tags, and JavaScript. Regular expressions are
-   used to accomplish this, and operate on a line by line basis. This is
-   potentially a very powerful feature, but requires some expertise.
-   
-   If you are familiar with regular expressions, and HTML, you can look
-   at the provided default.filter with a text editor and see some of
-   things it can be used for.
-   
-   Presently, there is no GUI editor option for this part of the
-   configuration, but you can disable/enable various sections of the
-   included default file with the "Actions List Editor" from your
-   browser.
-     _________________________________________________________________
-   
-1.3.8. How can I set up Privoxy to act as a proxy for my LAN?
-
-   By default, Privoxy only responds to requests from localhost. To have
-   it act as a server for a network, this needs to be changed in the main
-   config file where the Privoxy configuration is located. In that file
-   is a "listen-address" option. It may be commented out with a "#"
-   symbol. Make sure it is uncommented, and assign it the address of the
-   LAN gateway interface, and port number to use:
-   
-  listen-address  192.168.1.1:8118
-
-   Save the file, and restart Privoxy. Configure all browsers on the
-   network then to use this address and port number.
-     _________________________________________________________________
-   
-1.3.9. Instead of ads, now I get a checkerboard pattern. I don't want to see
-anything.
-
-   This is a configuration option for images that Privoxy is stopping.
-   You have the choice a checkerboard pattern, a transparent 1x1 GIF
-   image (aka "blank"), or a custom URL or your choice.
-   
-   If you want to see nothing, then change the "+image-blocker" action to
-   "+image-blocker{blank}". This can be done from the "Edit Actions List"
-   selection at [67]http://p.p/. Or by hand editing the appropriate
-   actions file. This will only effect what is defined as "images"
-   though.
-     _________________________________________________________________
-   
-1.3.10. Why would anybody want to see a checkerboard pattern?
-
-   This can be helpful for troubleshooting problems. It might also be
-   good for anyone new to Privoxy so that they can see if their favorite
-   pages are displaying correctly, and Privoxy is not inadvertently
-   removing something important.
-     _________________________________________________________________
-   
-1.3.11. I see large red banners on some pages that say "Blocked". How do I
-get rid of this?
-
-   These are URLs that match something in one of Privoxy's block actions
-   (+block). It is meant to be a warning so that you know something has
-   been blocked and an easy way for you to see why. These are handled
-   differently than what has been defined as "images" (e.g. ad banners).
-   If you want them to be treated as if they were images, so that they
-   can be made invisible, then move the offending URL from the "+block"
-   section to the "+imageblock" section of your actions file.
-   Alternately, you could modify the "block" HTML template that is used
-   by Privoxy to display this, and make it something more to your liking.
-     _________________________________________________________________
-   
-1.3.12. How can I make Privoxy work with other proxies like Squid?
-
-   This can be done. See the [68]user manual, which describes how to do
-   this.
-     _________________________________________________________________
-   
-1.4. Miscellaneous
-
-1.4.1. How much does Privoxy slow my browsing down? This has to add extra
-time to browsing.
-
-   It should not slow you down any in real terms, and may actually help
-   speed things up since ads, banners and other junk are not being
-   displayed. The actual processing time required by Privoxy itself for
-   each page, is relatively small in the overall scheme of things, and
-   happens very quickly. This is typically more than offset by time saved
-   not downloading and rendering ad images.
-   
-   "Filtering" via the filterfile mechanism may cause a perceived
-   slowdown, since the entire page is buffered before displaying. See
-   below.
-     _________________________________________________________________
-   
-1.4.2. I noticed considerable delays in page requests compared to the old
-Junkbuster. What's wrong?
-
-   Using the default filtering configuration, I noticed considerable
-   delays in page requests compared to the old Junkbuster. Loading pages
-   with large contents seemed to take forever, then suddenly delivering
-   all the content at once.
-   
-   The whole content must be loaded in order to filter, and nothing is is
-   sent to the browser during this time. The loading time does not really
-   change in real numbers, but the feeling is different, because most
-   browsers are able to start rendering incomplete content, giving the
-   user a feeling of "it works".
-   
-   To modify the content of a page (i.e. make frames resizeable again,
-   etc.) and not just replace ads, Privoxy needs to download the entire
-   page first, do its content magic and then send the page to the
-   browser.
-     _________________________________________________________________
-   
-1.4.3. What is the "http://p.p/"?
-
-   Since Privoxy sits between your web browser and the Internet, it can
-   be programmed to handle certain pages specially.
-   
-   With recent versions of Privoxy (version 2.9.x), you can get some
-   information about Privoxy and change some settings by going to
-   http://p.p/ or, equivalently, http://www.privoxy.org/config/ (Note
-   that p.p is far easier to type but may not work in some
-   configurations).
-   
-   These pages are *not* forwarded to a server on the Internet - instead
-   they are handled by a special web server which is built in to Privoxy.
-   
-   If you are not running Privoxy, then http://p.p/ will fail, and
-   http://www.privoxy.org/config/ will return a web page telling you
-   you're not running Privoxy.
-   
-   If you have version 2.0.2, then the equivalent is
-   http://example.com/show-proxy-args (but you get far less information,
-   and you should really consider upgrading to 2.9.x).
-     _________________________________________________________________
-   
-1.4.4. Do you still maintain the blocklists?
-
-   No. The format of the blocklists has changed significantly in the
-   versions 2.9.x. Once we have released the new version, there will
-   again be blocklists that you can update automatically.
-     _________________________________________________________________
-   
-1.4.5. How can I submit new ads?
-
-   As of now, please discontinue to submit new ad blocking infos. Once we
-   have released the new version, there will again be a form on the
-   website, which you can use to contribute new ads.
-     _________________________________________________________________
-   
-1.4.6. How can I hide my IP address?
-
-   You cannot hide your IP address with Privoxy or any other software,
-   since the server needs to know your IP address to send the answer to
-   you.
-   
-   Fortunately there are many publicly usable anonymous proxies out
-   there, which solve the problem by providing a further level of
-   indirection between you and the web server, shared by many people and
-   thus letting your requests "drown" in white noise of unrelated
-   requests as far as user tracking is concerned.
-   
-   Most of them will, however, log your IP address and make it available
-   to the authorities in case you abuse that anonymity for criminal
-   purposes. In fact you can't even rule out that some of them only exist
-   to *collect* information on (those suspicious) people with a more than
-   average preference for privacy.
-   
-   You can find a list of anonymous public proxies at [69]multiproxy.org
-   and many more through Google.
-     _________________________________________________________________
-   
-1.4.7. Can Privoxy guarantee I am anonymous?
-
-   No. Your chances of remaining anonymous are greatly improved, but
-   unless you are an expert on Internet security it would be safest to
-   assume that everything you do on the Web can be traced back to you.
-   
-   Privoxy can remove various information about you, and allows you more
-   freedom to decide which sites you can trust. But it's still possible
-   that web sites can find out who you are. Here's one way this can
-   happen.
-   
-   A few browsers disclose the user's email address in certain
-   situations, such as when transferring a file by FTP. Privoxy does not
-   filter FTP. If you need this feature, or are concerned about the mail
-   handler of your browser disclosing your email address, you might
-   consider products such as NSClean.
-   
-   Browsers available only as binaries could use non-standard headers to
-   give out any information they can have access to: see the
-   manufacturer's license agreement. It's impossible to anticipate and
-   prevent every breach of privacy that might occur. The professionally
-   paranoid prefer browsers available as source code, because
-   anticipating their behavior is easier. Trust the source, Luke!
-     _________________________________________________________________
-   
-1.4.8. Might some things break because header information is being altered?
-
-   Definitely. More and more sites use HTTP header content to decide what
-   to display and how to display it. There is many ways that this can be
-   handled, so having hard and fast rules, is tricky.
-   
-   "USER AGENT" in particular is often used in this way to identify the
-   browser, and adjust content accordingly. Changing this now is not
-   recommended, since so many sites do look for this. You may get
-   undesirable results by changing this.
-   
-   For instance, different browsers use different encodings of Russian
-   and Czech characters, certain web servers convert pages on-the-fly
-   according to the User Agent header. Giving a "User Agent" with the
-   wrong operating system or browser manufacturer causes some sites in
-   these languages to be garbled; Surfers to Eastern European sites
-   should change it to something closer. And then some page access
-   counters work by looking at the "REFERER" header; they may fail or
-   break if unavailable. The weather maps of Intellicast have been
-   blocked by their server when no "REFERER" or cookie is provided, is
-   another example. There are many, many other ways things can go wrong
-   when trying to fool a web server.
-   
-   If you have problems with a site, you will have to adjust your
-   configuration accordingly. Cookies are probably the most likely
-   adjustment that may be required, but by no means the only one.
-     _________________________________________________________________
-   
-1.4.9. Can Privoxy act as a "caching" proxy to speed up web browsing?
-
-   No, it does not have this ability at all. You want something like
-   [70]Squid for this. And, yes, before you ask, Privoxy can co-exist
-   with other kinds of proxies like "Squid".
-     _________________________________________________________________
-   
-1.4.10. What about as a firewall? Can Privoxy protect me?
-
-   Not in the way you mean, or in the way a true firewall can, or a proxy
-   that has this specific capability. Privoxy can help protect your
-   privacy, but not really protect you from intrusion attempts.
-     _________________________________________________________________
-   
-1.4.11. The Privoxy logo that replaces ads is very blocky and ugly looking.
-Can't a better font be used?
-
-   This is not a font problem. The logo is an image that is created by
-   Privoxy on the fly. So as to not waste memory, the image is rather
-   small. The blockiness comes when the image is scaled to fill a largish
-   area. There is not much to be done about this, other than to use one
-   of the other "imageblock" directives: pattern, blank, or a URL of your
-   choosing.
-   
-   Given the above problem, we have decided to remove the logo option
-   entirely [as of v2.9.13].
-     _________________________________________________________________
-   
-1.4.12. I have large empty spaces now where ads used to be. Why does Privoxy
-leave these large gaps?
-
-   It would be easy enough to just eliminate this space altogether,
-   rather than fill it with blank space. But, this would create problems
-   with many pages that use the overall size of the ad to help organize
-   the page layout and position the various components of the page where
-   they were intended to be. It is best left this way.
-     _________________________________________________________________
-   
-1.4.13. How can Privoxy filter Secure (HTTPS) URLs?
-
-   This is a limitation since HTTPS transactions are encrypted SSL
-   sessions between your browser and the secure site, and are meant to be
-   reliably secure and private. This means that all cookies and HTTP
-   header information are also encrypted from the time they leave your
-   browser, to the site, and vice versa. Privoxy does not try to
-   unencrypt this information, so it just passes through as is. Privoxy
-   can still catch images and ads that are embedded in the SSL stream
-   though.
-     _________________________________________________________________
-   
-1.4.14. Privoxy runs as a "server". How secure is it? Do I need to take any
-special precautions?
-
-   There are no known exploits that might effect Privoxy. On Unix-like
-   systems, Privoxy can run as a non-privileged user, which is how we
-   recommend it be run. Also, by default Privoxy only listens to requests
-   from "localhost". It is not itself directly exposed to the Internet in
-   this configuration. If you want to have Privoxy serve as a LAN proxy,
-   this will have to be opened up to allow for LAN requests. In this
-   case, we'd recommend you specify only the LAN gateway address, e.g.
-   192.168.1.1 in the main Privoxy config file. All LAN hosts can then
-   use this as their proxy address in the browser proxy configuration. In
-   this way, Privoxy will not listen on any external ports. Of course, a
-   firewall is always good too. Better safe than sorry.
-     _________________________________________________________________
-   
-1.4.15. How can I temporarily disable Privoxy?
-
-   The easiest way is to access Privoxy with your browser by using the
-   special URL: [71]http://p.p/ and select "Toggle Privoxy on or off"
-   from that page.
-     _________________________________________________________________
-   
-1.5. Troubleshooting
-
-1.5.1. I just upgraded and am getting "connection refused" with every web
-page?
-
-   Either Privoxy is not running, or your browser is configured for a
-   different port than what Privoxy is using.
-   
-   The old Privoxy (and also Junkbuster) used port 8000 by default. This
-   has been changed to port 8118 now, due to a conflict with NAS (Network
-   Audio Service), which uses port 8000. If you haven't, you need to
-   change your browser to the new port number, or alternately change
-   Privoxy's "listen-address" setting in the config file used to start
-   Privoxy.
-     _________________________________________________________________
-   
-1.5.2. I just added a new rule, but the steenkin ad is still getting
-through. How?
-
-   If the ad had been displayed before you added its URL, it will
-   probably be held in the browser's cache for some time, so it will be
-   displayed without the need for any request to the server, and Privoxy
-   will not be in the picture. The best thing to do is try flushing the
-   browser's caches. And then try again.
-   
-   If this doesn't help, you probably have an error in the rule you
-   applied. Try pasting the full URL of the offending ad into
-   [72]http://www.privoxy.org/config/show-url-info and see if any actions
-   match your new rule.
-     _________________________________________________________________
-   
-1.5.3. One of my favorite sites does not work with Privoxy. What can I do?
-
-   First verify that it is indeed a Privoxy problem, by disabling Privoxy
-   filtering and blocking. Go to [73]http://p.p/ and click on "Toggle
-   Privoxy On or Off", then disable it. Now try that page again.
-   
-   If still a problem, go to "Show which actions apply to a URL and why"
-   from [74]http://p.p/ and paste the full URL of the page in question
-   into the prompt. See which actions are being applied to the URL. Now,
-   armed with this information, go to "Edit the actions list". Here you
-   should see various sections that have various Privoxy features
-   disabled for specific sites. Disabled "actions" will have a "-" (minus
-   sign) in front of them. Add your problem page URL to one of these
-   sections that looks like it is disabling the feature that is causing
-   the problem. Re-try the page. There might be some trial and error
-   involved. This is discussed in a little more detail in the
-   [75]user-manual appendix.
-   
-   Alternately, if you are comfortable with a text editor, you can
-   accomplish the same thing by editing the appropriate "actions" file.
-     _________________________________________________________________
-   
-1.5.4. What time is it?
-
-   Time for you to go!
-     _________________________________________________________________
-   
-2. Copyright and History
-
-   Please see the user manual for information on Copyright and History.
-     _________________________________________________________________
-   
-3. See also
-
-   Please see the user manual for information on references.
-
-References
-
-   1. http://www.privoxy.org/faq/
-   2. http://www.privoxy.org/user-manual/contact.html
-   3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUESTIONS
-   4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#GENERAL
-   5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWJB
-   6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN37
-   7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DIFFERS
-   8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FEATURES
-   9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#PROXYMORON
-  10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSERS2
-  11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LICENSE
-  12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#JOINTEAM
-  13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION
-  14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHBROWSERS
-  15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHOS
-  16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWINSTALL
-  17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN151
-  18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOCALHOST
-  19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN176
-  20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURATION
-  21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWCONFIG
-  22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN192
-  23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSS
-  24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN210
-  25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGFILES
-  26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSECONFIG
-  27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN327
-  28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN339
-  29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN351
-  30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN362
-  31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN367
-  32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#OTHERPROXY
-  33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#MISC
-  34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN386
-  35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOADINGTIMES
-  36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURL
-  37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BLOCKLIST
-  38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWADS
-  39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#IP
-  40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN427
-  41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN438
-  42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN448
-  43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN456
-  44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN461
-  45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN470
-  46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN474
-  47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN481
-  48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TURNOFF
-  49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN499
-  50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN501
-  51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN514
-  52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN520
-  53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN538
-  54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT
-  55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO
-  56. http://www.junkbusters.com/
-  57. http://ijbswa.sourceforge.net/
-  58. http://junkbusters.com/
-  59. http://p.p/
-  60. http://www.gnu.org/copyleft/gpl.html
-  61. http://www.privoxy.org/user-manual/
-  62. http://p.p/
-  63. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE
-  64. http://p.p/
-  65. http://www.privoxy.org/config/edit-actions
-  66. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE
-  67. http://p.p/
-  68. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#FORWARDING
-  69. http://www.multiproxy.org/anon_list.htm
-  70. http://www.squid-cache.org/
-  71. http://p.p/
-  72. http://www.privoxy.org/config/show-url-info
-  73. http://p.p/
-  74. http://p.p/
-  75. file://localhost/home/swa/sf/current-org/doc/user-manual/appendix.html#ACTIONSANAT
diff --git a/doc/text/user-manual.txt b/doc/text/user-manual.txt
deleted file mode 100644 (file)
index 5a33782..0000000
+++ /dev/null
@@ -1,2097 +0,0 @@
-
-Privoxy User Manual
-
-   By: Privoxy Developers
-   
-   $Id: user-manual.sgml,v 1.60 2002/03/27 01:57:34 hal9 Exp $
-   
-   The user manual gives users information on how to install, configure
-   and use Privoxy. Privoxy is a web proxy with advanced filtering
-   capabilities for protecting privacy, filtering web page content,
-   managing cookies, controlling access, and removing ads, banners,
-   pop-ups and other obnoxious Internet Junk. Privoxy has a very flexible
-   configuration and can be customized to suit individual needs and
-   tastes. Privoxy has application for both stand-alone systems and
-   multi-user networks.
-   
-   You can find the latest version of the user manual at
-   [1]http://www.privoxy.org/user-manual/.
-     _________________________________________________________________
-   
-   Table of Contents
-   1. [2]Introduction
-          
-        1.1. [3]New Features
-                
-   2. [4]Installation
-          
-        2.1. [5]Source
-        2.2. [6]Red Hat
-        2.3. [7]SuSE
-        2.4. [8]OS/2
-        2.5. [9]Windows
-        2.6. [10]Other
-                
-   3. [11]Privoxy Configuration
-          
-        3.1. [12]Controlling Privoxy with Your Web Browser
-        3.2. [13]Configuration Files Overview
-        3.3. [14]The Main Configuration File
-                
-              3.3.1. [15]Defining Other Configuration Files
-              3.3.2. [16]Other Configuration Options
-              3.3.3. [17]Access Control List (ACL)
-              3.3.4. [18]Forwarding
-              3.3.5. [19]Windows GUI Options
-                      
-        3.4. [20]The Actions File
-                
-              3.4.1. [21]URL Domain and Path Syntax
-              3.4.2. [22]Actions
-              3.4.3. [23]Aliases
-                      
-        3.5. [24]The Filter File
-        3.6. [25]Templates
-                
-   4. [26]Quickstart to Using Privoxy
-          
-        4.1. [27]Command Line Options
-                
-   5. [28]Contacting the Developers, Bug Reporting and Feature Requests
-   6. [29]Copyright and History
-          
-        6.1. [30]License
-        6.2. [31]History
-                
-   7. [32]See also
-   8. [33]Appendix
-          
-        8.1. [34]Regular Expressions
-                
-              21
-              22
-              23
-              24
-              25
-              26
-              27
-              28
-              29
-                      
-        8.2. [35]Privoxy's Internal Pages
-        8.3. [36]Anatomy of an Action
-                
-1. Introduction
-
-   Privoxy is a web proxy with advanced filtering capabilities for
-   protecting privacy, filtering web page content, managing cookies,
-   controlling access, and removing ads, banners, pop-ups and other
-   obnoxious Internet junk. Privoxy has a very flexible configuration and
-   can be customized to suit individual needs and tastes. Privoxy has
-   application for both stand-alone systems and multi-user networks.
-   
-   Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-   was originally written by JunkBusters Corporation, and was released as
-   free open-source software under the GNU GPL. Stefan Waldherr made many
-   improvements, and started the SourceForge project to continue
-   development.
-   
-   Privoxy continues the Junkbuster tradition, but adds many refinements
-   and enhancements.
-   
-   This documentation is included with the current BETA version of
-   Privoxy and is mostly complete at this point. The most up to date
-   reference for the time being is still the comments in the source files
-   and in the individual configuration files. Development of version 3.0
-   is currently nearing completion, and includes many significant changes
-   and enhancements over earlier versions. The target release date for
-   stable v3.0 is "soon" ;-)
-   
-   Since this is a BETA version, not all new features are well tested.
-   This documentation may be slightly out of sync as a result (especially
-   with CVS sources). And there may be bugs, though hopefully not many!
-     _________________________________________________________________
-   
-1.1. New Features
-
-   In addition to Internet Junkbuster's traditional feature of ad and
-   banner blocking and cookie management, Privoxy provides new features,
-   some of them currently under development:
-   
-     * Integrated browser based configuration and control utility
-       ([37]http://p.p). Browser-based tracing of rule and filter
-       effects.
-     * Blocking of annoying pop-up browser windows.
-     * HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-     * Support for Perl Compatible Regular Expressions in the
-       configuration files, and generally a more sophisticated and
-       flexible configuration syntax over previous versions.
-     * GIF de-animation.
-     * Web page content filtering (removes banners based on size,
-       invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.)
-     * Bypass many click-tracking scripts (avoids script redirection).
-     * Multi-threaded (POSIX and native threads).
-     * Auto-detection and re-reading of config file changes.
-     * User-customizable HTML templates (e.g. 404 error page).
-     * Improved cookie management features (e.g. session based cookies).
-     * Builds from source on most UNIX-like systems. Packages available
-       for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac
-       OSX, OS/2, HP-UX 11 and AmigaOS.
-     * In addition, the configuration is much more powerful and versatile
-       over-all.
-     _________________________________________________________________
-   
-2. Installation
-
-   Privoxy is available as raw source code, or pre-compiled binaries. See
-   the [38]Privoxy Home Page for binaries and current release info.
-   Privoxy is also available via [39]CVS. This is the recommended
-   approach at this time. But please be aware that CVS is constantly
-   changing, and it may break in mysterious ways.
-     _________________________________________________________________
-   
-2.1. Source
-
-   For gzipped tar archives, unpack the source:
-   
- tar xzvf privoxy-2.9.13-beta-src* [.tgz or .tar.gz]
- cd privoxy-2.9.13-beta
-
-   For retrieving the current CVS sources, you'll need the CVS package
-   installed first. To download CVS source:
-   
-  cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
-  cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co cu
-rrent
-  cd current
-
-   This will create a directory named current/, which will contain the
-   source tree.
-   
-   Then, in either case, to build from tarball/CVS source:
-   
- ./configure      (--help to see options)
- make             (the make from gnu, gmake for *BSD)
- su
- make -n install  (to see where all the files will go)
- make install     (to really install)
-
-   For Redhat and SuSE Linux RPM packages, see below.
-     _________________________________________________________________
-   
-2.2. Red Hat
-
-   To build Redhat RPM packages, install source as above. Then:
-   
- autoheader
- autoconf
- ./configure
- make redhat-dist
-
-   This will create both binary and src RPMs in the usual places.
-   Example:
-   
-      /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-   
-      /usr/src/redhat/SRPMS/privoxy-2.9.11-1.src.rpm
-   
-   To install, of course:
-   
- rpm -Uvv /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-
-   This will place the Privoxy configuration files in /etc/privoxy/, and
-   log files in /var/log/privoxy/.
-     _________________________________________________________________
-   
-2.3. SuSE
-
-   To build SuSE RPM packages, install source as above. Then:
-   
- autoheader
- autoconf
- ./configure
- make suse-dist
-
-   This will create both binary and src RPMs in the usual places.
-   Example:
-   
-      /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-   
-      /usr/src/packages/SRPMS/privoxy-2.9.11-1.src.rpm
-   
-   To install, of course:
-   
- rpm -Uvv /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-
-   This will place the Privoxy configuration files in /etc/privoxy/, and
-   log files in /var/log/privoxy/.
-     _________________________________________________________________
-   
-2.4. OS/2
-
-   Privoxy is packaged in a WarpIN self- installing archive. The
-   self-installing program will be named depending on the release
-   version, something like: ijbos2_setup_1.2.3.exe. In order to install
-   it, simply run this executable or double-click on its icon and follow
-   the WarpIN installation panels. A shadow of the Privoxy executable
-   will be placed in your startup folder so it will start automatically
-   whenever OS/2 starts.
-   
-   The directory you choose to install Privoxy into will contain all of
-   the configuration files.
-   
-   If you would like to build binary images on OS/2 yourself, you will
-   need a few Unix-like tools: autoconf, autoheader and sh. These tools
-   will be used to create the required config.h file, which is not part
-   of the source distribution because it differs based on platform. You
-   will also need a compiler. The distribution has been created using IBM
-   VisualAge compilers, but you can use any compiler you like. GCC/EMX
-   has the disadvantage of needing to be single-threaded due to a
-   limitation of EMX's implementation of the select() socket call.
-   
-   In addition to needing the source code distribution as outlined
-   earlier, you will want to extract the os2seutp directory from CVS:
- cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
-
- cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co os2
-setup
-
-   This will create a directory named os2setup/, which will contain the
-   Makefile.vac makefile and os2build.cmd which is used to completely
-   create the binary distribution. The sequence of events for building
-   the executable for yourself goes something like this:
- cd current
- autoheader
- autoconf
- sh configure
- cd ..\os2setup
- nmake -f Makefile.vac
-
-   You will see this sequence laid out in os2build.cmd.
-     _________________________________________________________________
-   
-2.5. Windows
-
-   Click-click. (I need help on this. Not a clue here. Also for
-   configuration section below. HB.)
-     _________________________________________________________________
-   
-2.6. Other
-
-   Some quick notes on other Operating Systems.
-   
-   For FreeBSD (and other *BSDs?), the build will require gmake instead
-   of the included make. gmake is available from [40]http://www.gnu.org.
-   The rest should be the same as above for Linux/Unix.
-     _________________________________________________________________
-   
-3. Privoxy Configuration
-
-   All Privoxy configuration is kept in text files. These files can be
-   edited with a text editor. Many important aspects of Privoxy can also
-   be controlled easily with a web browser.
-     _________________________________________________________________
-   
-3.1. Controlling Privoxy with Your Web Browser
-
-   Privoxy can be reached by the special URL [41]http://p.p/ (or
-   alternately [42]http://www.privoxy.org/config/), which is an internal
-   page. You will see the following section:
-   
-Please choose from the following options:
-
-    * Show information about the current configuration
-    * Show the source code version numbers
-    * Show the client's request headers.
-    * Show which actions apply to a URL and why
-    * Toggle Privoxy on or off
-    * Edit the actions list
-
-
-   This should be self-explanatory. Note the last item is an editor for
-   the "actions list", which is where much of the ad, banner, cookie, and
-   URL blocking magic is configured as well as other advanced features of
-   Privoxy. This is an easy way to adjust various aspects of Privoxy
-   configuration. The actions file, and other configuration files, are
-   explained in detail below. Privoxy will automatically detect any
-   changes to these files.
-   
-   "Toggle Privoxy On or Off" is handy for sites that might have problems
-   with your current actions and filters, or just to test if a site
-   misbehaves, whether it is Privoxy causing the problem or not. Privoxy
-   continues to run as a proxy in this case, but all filtering is
-   disabled.
-     _________________________________________________________________
-   
-3.2. Configuration Files Overview
-
-   For Unix, *BSD and Linux, all configuration files are located in
-   /etc/privoxy/ by default. For MS Windows, OS/2, and AmigaOS these are
-   all in the same directory as the Privoxy executable. The name and
-   number of configuration files has changed from previous versions, and
-   is subject to change as development progresses.
-   
-   The installed defaults provide a reasonable starting point, though
-   possibly aggressive by some standards. For the time being, there are
-   only three default configuration files (this will change in time):
-   
-     * The main configuration file is named config on Linux, Unix, BSD,
-       OS/2, and AmigaOS and config.txt on Windows.
-     * The default.action file is used to define various "actions"
-       relating to images, banners, pop-ups, access restrictions, banners
-       and cookies. There is a CGI based editor for this file that can be
-       accessed via [43]http://p.p. (Other actions files are included as
-       well with differing levels of filtering and blocking, e.g.
-       ijb-basic.action.)
-     * The default.filter file can be used to re-write the raw page
-       content, including viewable text as well as embedded HTML and
-       JavaScript, and whatever else lurks on any given web page.
-       
-   default.action and default.filter can use Perl style regular
-   expressions for maximum flexibility. All files use the "#" character
-   to denote a comment. Such lines are not processed by Privoxy. After
-   making any changes, there is no need to restart Privoxy in order for
-   the changes to take effect. Privoxy should detect such changes
-   automatically.
-   
-   While under development, the configuration content is subject to
-   change. The below documentation may not be accurate by the time you
-   read this. Also, what constitutes a "default" setting, may change, so
-   please check all your configuration files on important issues.
-     _________________________________________________________________
-   
-3.3. The Main Configuration File
-
-   Again, the main configuration file is named config on Linux/Unix/BSD
-   and OS/2, and config.txt on Windows. Configuration lines consist of an
-   initial keyword followed by a list of values, all separated by
-   whitespace (any number of spaces or tabs). For example:
-   
-     blockfile blocklist.ini
-   
-   Indicates that the blockfile is named "blocklist.ini". (A default
-   installation does not use this.)
-   
-   A "#" indicates a comment. Any part of a line following a "#" is
-   ignored, except if the "#" is preceded by a "\".
-   
-   Thus, by placing a "#" at the start of an existing configuration line,
-   you can make it a comment and it will be treated as if it weren't
-   there. This is called "commenting out" an option and can be useful to
-   turn off features: If you comment out the "logfile" line, Privoxy will
-   not log to a file at all. Watch for the "default:" section in each
-   explanation to see what happens if the option is left unset (or
-   commented out).
-   
-   Long lines can be continued on the next line by using a "\" as the
-   very last character.
-   
-   There are various aspects of Privoxy behavior that can be tuned.
-     _________________________________________________________________
-   
-3.3.1. Defining Other Configuration Files
-
-   Privoxy can use a number of other files to tell it what ads to block,
-   what cookies to accept, etc. This section of the configuration file
-   tells Privoxy where to find all those other files.
-   
-   On Windows and AmigaOS, Privoxy looks for these files in the same
-   directory as the executable. On Unix and OS/2, Privoxy looks for these
-   files in the current working directory. In either case, an absolute
-   path name can be used to avoid problems.
-   
-   When development goes modular and multi-user, the blocker, filter, and
-   per-user config will be stored in subdirectories of "confdir". For
-   now, only confdir/templates is used for storing HTML templates for CGI
-   results.
-   
-   The location of the configuration files:
-   
-     confdir /etc/privoxy       # No trailing /, please.
-   
-   The directory where all logging (i.e. logfile and jarfile) takes
-   place. No trailing "/", please:
-   
-     logdir /var/log/privoxy
-   
-   Note that all file specifications below are relative to the above two
-   directories!
-   
-   The "default.action" file contains patterns to specify the actions to
-   apply to requests for each site. Default: Cookies to and from all
-   destinations are kept only during the current browser session (i.e.
-   they are not saved to disk). Pop-ups are disabled for all sites. All
-   sites are filtered through selected sections of "default.filter". No
-   sites are blocked. Privoxy displays a checkboard type pattern for
-   filtered ads and other images. The syntax of this file is explained in
-   detail [44]below. Other "actions" files are included, and you are free
-   to use any of them. They have varying degrees of aggressiveness.
-   
-     actionsfile default.action
-   
-   The "default.filter" file contains content modification rules that use
-   "regular expressions". These rules permit powerful changes on the
-   content of Web pages, e.g., you could disable your favorite JavaScript
-   annoyances, re-write the actual displayed text, or just have some fun
-   replacing "Microsoft" with "MicroSuck" wherever it appears on a Web
-   page. Default: whatever the developers are playing with :-/
-   
-   Filtering requires buffering the page content, which may appear to
-   slow down page rendering since nothing is displayed until all content
-   has passed the filters. (It does not really take longer, but seems
-   that way since the page is not incrementally displayed.) This effect
-   will be more noticeable on slower connections.
-   
-     filterfile default.filter
-   
-   The logfile is where all logging and error messages are written. The
-   logfile can be useful for tracking down a problem with Privoxy (e.g.,
-   it's not blocking an ad you think it should block) but in most cases
-   you probably will never look at it.
-   
-   Your logfile will grow indefinitely, and you will probably want to
-   periodically remove it. On Unix systems, you can do this with a cron
-   job (see "man cron"). For Redhat, a logrotate script has been
-   included.
-   
-   On SuSE Linux systems, you can place a line like "/var/log/privoxy.*
-   +1024k 644 nobody.nogroup" in /etc/logfiles, with the effect that
-   cron.daily will automatically archive, gzip, and empty the log, when
-   it exceeds 1M size.
-   
-   Default: Log to the a file named logfile. Comment out to disable
-   logging.
-   
-     logfile logfile
-   
-   The "jarfile" defines where Privoxy stores the cookies it intercepts.
-   Note that if you use a "jarfile", it may grow quite large. Default:
-   Don't store intercepted cookies.
-   
-     #jarfile jarfile
-   
-   If you specify a "trustfile", Privoxy will only allow access to sites
-   that are named in the trustfile. You can also mark sites as trusted
-   referrers, with the effect that access to untrusted sites will be
-   granted, if a link from a trusted referrer was used. The link target
-   will then be added to the "trustfile". This is a very restrictive
-   feature that typical users most probably want to leave disabled.
-   Default: Disabled, don't use the trust mechanism.
-   
-     #trustfile trust
-   
-   If you use the trust mechanism, it is a good idea to write up some
-   on-line documentation about your blocking policy and to specify the
-   URL(s) here. They will appear on the page that your users receive when
-   they try to access untrusted content. Use multiple times for multiple
-   URLs. Default: Don't display links on the "untrusted" info page.
-   
-     trust-info-url http://www.your-site.com/why_we_block.html
-     trust-info-url http://www.your-site.com/what_we_allow.html
-     _________________________________________________________________
-   
-3.3.2. Other Configuration Options
-
-   This part of the configuration file contains options that control how
-   Privoxy operates.
-   
-   "Admin-address" should be set to the email address of the proxy
-   administrator. It is used in many of the proxy-generated pages.
-   Default: fill@me.in.please.
-   
-     #admin-address fill@me.in.please
-   
-   "Proxy-info-url" can be set to a URL that contains more info about
-   this Privoxy installation, it's configuration and policies. It is used
-   in many of the proxy-generated pages and its use is highly recommended
-   in multi-user installations, since your users will want to know why
-   certain content is blocked or modified. Default: Don't show a link to
-   on-line documentation.
-   
-     proxy-info-url http://www.your-site.com/proxy.html
-   
-   "Listen-address" specifies the address and port where Privoxy will
-   listen for connections from your Web browser. The default is to listen
-   on the localhost port 8118, and this is suitable for most users. (In
-   your web browser, under proxy configuration, list the proxy server as
-   "localhost" and the port as "8118").
-   
-   If you already have another service running on port 8118, or if you
-   want to serve requests from other machines (e.g. on your local
-   network) as well, you will need to override the default. The syntax is
-   "listen-address [<ip-address>]:<port>". If you leave out the IP
-   address, Privoxy will bind to all interfaces (addresses) on your
-   machine and may become reachable from the Internet. In that case,
-   consider using access control lists (acl's) (see "aclfile" above), or
-   a firewall.
-   
-   For example, suppose you are running Privoxy on a machine which has
-   the address 192.168.0.1 on your local private network (192.168.0.0)
-   and has another outside connection with a different address. You want
-   it to serve requests from inside only:
-   
-     listen-address 192.168.0.1:8118
-   
-   If you want it to listen on all addresses (including the outside
-   connection):
-   
-     listen-address :8118
-   
-   If you do this, consider using ACLs (see "aclfile" above). Note: you
-   will need to point your browser(s) to the address and port that you
-   have configured here. Default: localhost:8118 (127.0.0.1:8118).
-   
-   The debug option sets the level of debugging information to log in the
-   logfile (and to the console in the Windows version). A debug level of
-   1 is informative because it will show you each request as it happens.
-   Higher levels of debug are probably only of interest to developers.
-   
-     debug         1 # GPC   = show each GET/POST/CONNECT request
-     debug         2 # CONN  = show each connection status
-     debug         4 # IO    = show I/O status
-     debug         8 # HDR   = show header parsing
-     debug        16 # LOG   = log all data into the logfile
-     debug        32 # FRC   = debug force feature
-     debug        64 # REF   = debug regular expression filter
-     debug       128 #       = debug fast redirects
-     debug       256 #       = debug GIF de-animation
-     debug       512 # CLF   = Common Log Format
-     debug      1024 #       = debug kill pop-ups
-     debug      4096 # INFO  = Startup banner and warnings.
-     debug      8192 # ERROR = Non-fatal errors
-   
-   It is highly recommended that you enable ERROR reporting (debug 8192),
-   at least until v3.0 is released.
-   
-   The reporting of FATAL errors (i.e. ones which crash Privoxy) is
-   always on and cannot be disabled.
-   
-   If you want to use CLF (Common Log Format), you should set "debug 512"
-   ONLY, do not enable anything else.
-   
-   Multiple "debug" directives, are OK - they're logical-OR'd together.
-   
-     debug 15 # same as setting the first 4 listed above
-   
-   Default:
-   
-     debug 1 # URLs
-     debug 4096 # Info
-     debug 8192 # Errors - *we highly recommended enabling this*
-   
-   Privoxy normally uses "multi-threading", a software technique that
-   permits it to handle many different requests simultaneously. In some
-   cases you may wish to disable this -- particularly if you're trying to
-   debug a problem. The "single-threaded" option forces Privoxy to handle
-   requests sequentially. Default: Multi-threaded mode.
-   
-     #single-threaded
-   
-   "toggle" allows you to temporarily disable all Privoxy's filtering.
-   Just set "toggle 0".
-   
-   The Windows version of Privoxy puts an icon in the system tray, which
-   also allows you to change this option. If you right-click on that icon
-   (or select the "Options" menu), one choice is "Enable". Clicking on
-   enable toggles Privoxy on and off. This is useful if you want to
-   temporarily disable Privoxy, e.g., to access a site that requires
-   cookies which you would otherwise have blocked. This can also be
-   toggled via a web browser at the Privoxy internal address of
-   [45]http://p.p on any platform.
-   
-   "toggle 1" means Privoxy runs normally, "toggle 0" means that Privoxy
-   becomes a non-anonymizing non-blocking proxy. Default: 1 (on).
-   
-     toggle 1
-   
-   For content filtering, i.e. the "+filter" and "+deanimate-gif"
-   actions, it is necessary that Privoxy buffers the entire document
-   body. This can be potentially dangerous, since a server could just
-   keep sending data indefinitely and wait for your RAM to exhaust. With
-   nasty consequences.
-   
-   The buffer-limit option lets you set the maximum size in Kbytes that
-   each buffer may use. When the documents buffer exceeds this size, it
-   is flushed to the client unfiltered and no further attempt to filter
-   the rest of it is made. Remember that there may multiple threads
-   running, which might require increasing the "buffer-limit" Kbytes
-   each, unless you have enabled "single-threaded" above.
-   
-     buffer-limit 4069
-   
-   To enable the web-based default.action file editor set
-   enable-edit-actions to 1, or 0 to disable. Note that you must have
-   compiled Privoxy with support for this feature, otherwise this option
-   has no effect. This internal page can be reached at [46]http://p.p.
-   
-   Security note: If this is enabled, anyone who can use the proxy can
-   edit the actions file, and their changes will affect all users. For
-   shared proxies, you probably want to disable this. Default: enabled.
-   
-     enable-edit-actions 1
-   
-   Allow Privoxy to be toggled on and off remotely, using your web
-   browser. Set "enable-remote-toggle"to 1 to enable, and 0 to disable.
-   Note that you must have compiled Privoxy with support for this
-   feature, otherwise this option has no effect.
-   
-   Security note: If this is enabled, anyone who can use the proxy can
-   toggle it on or off (see [47]http://p.p), and their changes will
-   affect all users. For shared proxies, you probably want to disable
-   this. Default: enabled.
-   
-     enable-remote-toggle 1
-     _________________________________________________________________
-   
-3.3.3. Access Control List (ACL)
-
-   Access controls are included at the request of some ISPs and systems
-   administrators, and are not usually needed by individual users. Please
-   note the warnings in the FAQ that this proxy is not intended to be a
-   substitute for a firewall or to encourage anyone to defer addressing
-   basic security weaknesses.
-   
-   If no access settings are specified, the proxy talks to anyone that
-   connects. If any access settings file are specified, then the proxy
-   talks only to IP addresses permitted somewhere in this file and not
-   denied later in this file.
-   
-   Summary -- if using an ACL:
-   
-   Client must have permission to receive service.
-   
-   LAST match in ACL wins.
-   
-   Default behavior is to deny service.
-   
-   The syntax for an entry in the Access Control List is:
-   
-     ACTION    SRC_ADDR[/SRC_MASKLEN]    [ DST_ADDR[/DST_MASKLEN] ]
-   
-   Where the individual fields are:
-   
-    ACTION      = "permit-access" or "deny-access"
-    SRC_ADDR    = client hostname or dotted IP address
-    SRC_MASKLEN = number of bits in the subnet mask for the source
-    DST_ADDR    = server or forwarder hostname or dotted IP address
-    DST_MASKLEN = number of bits in the subnet mask for the target
-   
-   The field separator (FS) is whitespace (space or tab).
-   
-   IMPORTANT NOTE: If Privoxy is using a forwarder (see below) or a
-   gateway for a particular destination URL, the DST_ADDR that is
-   examined is the address of the forwarder or the gateway and NOT the
-   address of the ultimate target. This is necessary because it may be
-   impossible for the local Privoxy to determine the address of the
-   ultimate target (that's often what gateways are used for).
-   
-   Here are a few examples to show how the ACL features work:
-   
-   "localhost" is OK -- no DST_ADDR implies that ALL destination
-   addresses are OK:
-   
-     permit-access localhost
-   
-   A silly example to illustrate permitting any host on the class-C
-   subnet with Privoxy to go anywhere:
-   
-     permit-access www.privoxy.com/24
-   
-   Except deny one particular IP address from using it at all:
-   
-     deny-access ident.privoxy.com
-   
-   You can also specify an explicit network address and subnet mask.
-   Explicit addresses do not have to be resolved to be used.
-   
-     permit-access 207.153.200.0/24
-   
-   A subnet mask of 0 matches anything, so the next line permits
-   everyone.
-   
-     permit-access 0.0.0.0/0
-   
-   Note, you cannot say:
-   
-     permit-access .org
-   
-   to allow all *.org domains. Every IP address listed must resolve
-   fully.
-   
-   An ISP may want to provide a Privoxy that is accessible by "the world"
-   and yet restrict use of some of their private content to hosts on its
-   internal network (i.e. its own subscribers). Say, for instance the ISP
-   owns the Class-B IP address block 123.124.0.0 (a 16 bit netmask). This
-   is how they could do it:
-   
-    permit-access 0.0.0.0/0 0.0.0.0/0   # other clients can go anywhere
-                                          # with the following exceptions
-   :
-   
-    deny-access   0.0.0.0/0   123.124.0.0/16 # block all external request
-   s for
-                                             # sites on the ISP's network
-    permit 0.0.0.0/0 www.my_isp.com        # except for the ISP's main
-                                             # web site
-    permit 123.124.0.0/16 0.0.0.0/0          # the ISP's clients can go
-                                             # anywhere
-   
-   Note that if some hostnames are listed with multiple IP addresses, the
-   primary value returned by DNS (via gethostbyname()) is used. Default:
-   Anyone can access the proxy.
-     _________________________________________________________________
-   
-3.3.4. Forwarding
-
-   This feature allows chaining of HTTP requests via multiple proxies. It
-   can be used to better protect privacy and confidentiality when
-   accessing specific domains by routing requests to those domains to a
-   special purpose filtering proxy such as lpwa.com. Or to use a caching
-   proxy to speed up browsing.
-   
-   It can also be used in an environment with multiple networks to route
-   requests via multiple gateways allowing transparent access to multiple
-   networks without having to modify browser configurations.
-   
-   Also specified here are SOCKS proxies. Privoxy SOCKS 4 and SOCKS 4A.
-   The difference is that SOCKS 4A will resolve the target hostname using
-   DNS on the SOCKS server, not our local DNS client.
-   
-   The syntax of each line is:
-   
-    forward target_domain[:port] http_proxy_host[:port]
-    forward-socks4 target_domain[:port] socks_proxy_host[:port]
-   http_proxy_host[:port]
-    forward-socks4a target_domain[:port] socks_proxy_host[:port]
-   http_proxy_host[:port]
-   
-   If http_proxy_host is ".", then requests are not forwarded to a HTTP
-   proxy but are made directly to the web servers.
-   
-   Lines are checked in sequence, and the last match wins.
-   
-   There is an implicit line equivalent to the following, which specifies
-   that anything not finding a match on the list is to go out without
-   forwarding or gateway protocol, like so:
-   
-     forward .* . # implicit
-   
-   In the following common configuration, everything goes to Lucent's
-   LPWA, except SSL on port 443 (which it doesn't handle):
-   
-    forward .* lpwa.com:8000
-    forward :443 .
-   
-   Some users have reported difficulties related to LPWA's use of "." as
-   the last element of the domain, and have said that this can be fixed
-   with this:
-   
-     forward lpwa. lpwa.com:8000
-   
-   (NOTE: the syntax for specifying target_domain has changed since the
-   previous paragraph was written -- it will not work now. More
-   information is welcome.)
-   
-   In this fictitious example, everything goes via an ISP's caching
-   proxy, except requests to that ISP:
-   
-    forward .* caching.myisp.net:8000
-    forward myisp.net .
-   
-   For the @home network, we're told the forwarding configuration is
-   this:
-   
-     forward .* proxy:8080
-   
-   Also, we're told they insist on getting cookies and JavaScript, so you
-   should allow cookies from home.com. We consider JavaScript a potential
-   security risk. Java need not be enabled.
-   
-   In this example direct connections are made to all "internal" domains,
-   but everything else goes through Lucent's LPWA by way of the company's
-   SOCKS gateway to the Internet.
-   
-    forward-socks4 .* lpwa.com:8000 firewall.my_company.com:1080
-    forward my_company.com .
-   
-   This is how you could set up a site that always uses SOCKS but no
-   forwarders:
-   
-     forward-socks4a .* . firewall.my_company.com:1080
-   
-   An advanced example for network administrators:
-   
-   If you have links to multiple ISPs that provide various special
-   content to their subscribers, you can configure forwarding to pass
-   requests to the specific host that's connected to that ISP so that
-   everybody can see all of the content on all of the ISPs.
-   
-   This is a bit tricky, but here's an example:
-   
-   host-a has a PPP connection to isp-a.com. And host-b has a PPP
-   connection to isp-b.com. host-a can run a Privoxy proxy with
-   forwarding like this:
-   
-    forward .* .
-    forward isp-b.com host-b:8118
-   
-   host-b can run a Privoxy proxy with forwarding like this:
-   
-    forward .* .
-    forward isp-a.com host-a:8118
-   
-   Now, anyone on the Internet (including users on host-a and host-b) can
-   set their browser's proxy to either host-a or host-b and be able to
-   browse the content on isp-a or isp-b.
-   
-   Here's another practical example, for University of Kent at Canterbury
-   students with a network connection in their room, who need to use the
-   University's Squid web cache.
-   
-    forward *. ssbcache.ukc.ac.uk:3128  # Use the proxy, except for:
-    forward .ukc.ac.uk .  # Anything on the same domain as us
-    forward * .  # Host with no domain specified
-    forward 129.12.*.* .  # A dotted IP on our /16 network.
-    forward 127.*.*.* .  # Loopback address
-    forward localhost.localdomain .  # Loopback address
-    forward www.ukc.mirror.ac.uk .  # Specific host
-   
-   If you intend to chain Privoxy and squid locally, then chain as
-   browser -> squid -> privoxy is the recommended way.
-   
-   Your squid configuration could then look like this:
-   
-     # Define Privoxy as parent cache
-   
-     cache_peer 127.0.0.1 parent 8118 0 no-query
-   
-     # Define ACL for protocol FTP
-     acl FTP proto FTP
-     # Do not forward ACL FTP to privoxy
-     always_direct allow FTP
-     # Do not forward ACL CONNECT (https) to privoxy
-     always_direct allow CONNECT
-     # Forward the rest to privoxy
-     never_direct allow all
-     _________________________________________________________________
-   
-3.3.5. Windows GUI Options
-
-   Privoxy has a number of options specific to the Windows GUI interface:
-   
-   If "activity-animation" is set to 1, the Privoxy icon will animate
-   when "Privoxy" is active. To turn off, set to 0.
-   
-     activity-animation 1
-   
-   If "log-messages" is set to 1, Privoxy will log messages to the
-   console window:
-   
-     log-messages 1
-   
-   If "log-buffer-size" is set to 1, the size of the log buffer, i.e. the
-   amount of memory used for the log messages displayed in the console
-   window, will be limited to "log-max-lines" (see below).
-   
-   Warning: Setting this to 0 will result in the buffer to grow
-   infinitely and eat up all your memory!
-   
-     log-buffer-size 1
-   
-   log-max-lines is the maximum number of lines held in the log buffer.
-   See above.
-   
-     log-max-lines 200
-   
-   If "log-highlight-messages" is set to 1, Privoxy will highlight
-   portions of the log messages with a bold-faced font:
-   
-     log-highlight-messages 1
-   
-   The font used in the console window:
-   
-     log-font-name Comic Sans MS
-   
-   Font size used in the console window:
-   
-     log-font-size 8
-   
-   "show-on-task-bar" controls whether or not Privoxy will appear as a
-   button on the Task bar when minimized:
-   
-     show-on-task-bar 0
-   
-   If "close-button-minimizes" is set to 1, the Windows close button will
-   minimize Privoxy instead of closing the program (close with the exit
-   option on the File menu).
-   
-     close-button-minimizes 1
-   
-   The "hide-console" option is specific to the MS-Win console version of
-   Privoxy. If this option is used, Privoxy will disconnect from and hide
-   the command console.
-   
-     #hide-console
-     _________________________________________________________________
-   
-3.4. The Actions File
-
-   The "default.action" file (formerly actionsfile or ijb.action) is used
-   to define what actions Privoxy takes, and thus determines how images,
-   cookies and various other aspects of HTTP content and transactions are
-   handled. Images can be anything you want, including ads, banners, or
-   just some obnoxious URL that you would rather not see. Cookies can be
-   accepted or rejected, or accepted only during the current browser
-   session (i.e. not written to disk). Changes to default.action should
-   be immediately visible to Privoxy without the need to restart.
-   
-   The easiest way to edit "actions" file is with a browser by loading
-   [48]http://p.p/, and then select "Edit Actions List". A text editor
-   can also be used.
-   
-   To determine which actions apply to a request, the URL of the request
-   is compared to all patterns in this file. Every time it matches, the
-   list of applicable actions for the URL is incrementally updated. You
-   can trace this process by visiting [49]http://p.p/show-url-info.
-   
-   There are four types of lines in this file: comments (begin with a "#"
-   character), actions, aliases and patterns, all of which are explained
-   below, as well as the configuration file syntax that Privoxy
-   understands.
-     _________________________________________________________________
-   
-3.4.1. URL Domain and Path Syntax
-
-   Generally, a pattern has the form <domain>/<path>, where both the
-   <domain> and <path> part are optional. If you only specify a domain
-   part, the "/" can be left out:
-   
-   www.example.com - is a domain only pattern and will match any request
-   to "www.example.com".
-   
-   www.example.com/ - means exactly the same.
-   
-   www.example.com/index.html - matches only the single document
-   "/index.html" on "www.example.com".
-   
-   /index.html - matches the document "/index.html", regardless of the
-   domain.
-   
-   index.html - matches nothing, since it would be interpreted as a
-   domain name and there is no top-level domain called ".html".
-   
-   The matching of the domain part offers some flexible options: if the
-   domain starts or ends with a dot, it becomes unanchored at that end.
-   For example:
-   
-   .example.com - matches any domain that ENDS in ".example.com".
-   
-   www. - matches any domain that STARTS with "www".
-   
-   Additionally, there are wild-cards that you can use in the domain
-   names themselves. They work pretty similar to shell wild-cards: "*"
-   stands for zero or more arbitrary characters, "?" stands for any
-   single character. And you can define character classes in square
-   brackets and they can be freely mixed:
-   
-   ad*.example.com - matches "adserver.example.com", "ads.example.com",
-   etc but not "sfads.example.com".
-   
-   *ad*.example.com - matches all of the above, and then some.
-   
-   .?pix.com - matches "www.ipix.com", "pictures.epix.com",
-   "a.b.c.d.e.upix.com", etc.
-   
-   www[1-9a-ez].example.com - matches "www1.example.com",
-   "www4.example.com", "wwwd.example.com", "wwwz.example.com", etc., but
-   not "wwww.example.com".
-   
-   If Privoxy was compiled with "pcre" support (default), Perl compatible
-   regular expressions can be used. See the pcre/docs/ directory or "man
-   perlre" (also available on
-   [50]http://www.perldoc.com/perl5.6/pod/perlre.html) for details. A
-   brief discussion of regular expressions is in the [51]Appendix. For
-   instance:
-   
-   /.*/advert[0-9]+\.jpe?g - would match a URL from any domain, with any
-   path that includes "advert" followed immediately by one or more
-   digits, then a "." and ending in either "jpeg" or "jpg". So we match
-   "example.com/ads/advert2.jpg", and
-   "www.example.com/ads/banners/advert39.jpeg", but not
-   "www.example.com/ads/banners/advert39.gif" (no gifs in the example
-   pattern).
-   
-   Please note that matching in the path is case INSENSITIVE by default,
-   but you can switch to case sensitive at any point in the pattern by
-   using the "(?-i)" switch:
-   
-   www.example.com/(?-i)PaTtErN.* - will match only documents whose path
-   starts with "PaTtErN" in exactly this capitalization.
-     _________________________________________________________________
-   
-3.4.2. Actions
-
-   Actions are enabled if preceded with a "+", and disabled if preceded
-   with a "-". Actions are invoked by enclosing the action name in curly
-   braces (e.g. {+some_action}), followed by a list of URLs to which the
-   action applies. There are three classes of actions:
-   
-     * Boolean (e.g. "+/-block"):
-         {+name}        # enable this action
-         {-name}        # disable this action
-       
-     * parameterized (e.g. "+/-hide-user-agent"):
-         {+name{param}}  # enable action and set parameter to "param"
-         {-name}         # disable action
-       
-     * Multi-value (e.g. "{+/-add-header{Name: value}}",
-       "{+/-wafer{name=value}}"):
-         {+name{param}}   # enable action and add parameter "param"
-         {-name{param}}   # remove the parameter "param"
-         {-name}          # disable this action totally
-       
-   If nothing is specified in this file, no "actions" are taken. So in
-   this case Privoxy would just be a normal, non-blocking,
-   non-anonymizing proxy. You must specifically enable the privacy and
-   blocking features you need (although the provided default
-   default.action file will give a good starting point).
-   
-   Later defined actions always over-ride earlier ones. For multi-valued
-   actions, the actions are applied in the order they are specified.
-   
-   The list of valid Privoxy "actions" are:
-   
-     * Add the specified HTTP header, which is not checked for validity.
-       You may specify this many times to specify many different headers:
-         +add-header{Name: value}
-       
-     * Block this URL totally. In a default installation, a "blocked" URL
-       will result in bright red banner that says "BLOCKED", with a
-       reason why it is being blocked.
-         +block
-       
-     * De-animate all animated GIF images, i.e. reduce them to their last
-       frame. This will also shrink the images considerably (in bytes,
-       not pixels!). If the option "first" is given, the first frame of
-       the animation is used as the replacement. If "last" is given, the
-       last frame of the animation is used instead, which probably makes
-       more sense for most banner animations, but also has the risk of
-       not showing the entire last frame (if it is only a delta to an
-       earlier frame).
-         +deanimate-gifs{last}
-         +deanimate-gifs{first}
-       
-     * "+downgrade" will downgrade HTTP/1.1 client requests to HTTP/1.0
-       and downgrade the responses as well. Use this action for servers
-       that use HTTP/1.1 protocol features that Privoxy doesn't handle
-       well yet. HTTP/1.1 is only partially implemented. Default is not
-       to downgrade requests.
-         +downgrade
-       
-     * Many sites, like yahoo.com, don't just link to other sites.
-       Instead, they will link to some script on their own server, giving
-       the destination as a parameter, which will then redirect you to
-       the final target. URLs resulting from this scheme typically look
-       like: http://some.place/some_script?http://some.where-else.
-       Sometimes, there are even multiple consecutive redirects encoded
-       in the URL. These redirections via scripts make your web browsing
-       more traceable, since the server from which you follow such a link
-       can see where you go to. Apart from that, valuable bandwidth and
-       time is wasted, while your browser ask the server for one redirect
-       after the other. Plus, it feeds the advertisers.
-       The "+fast-redirects" option enables interception of these
-       requests by Privoxy, who will cut off all but the last valid URL
-       in the request and send a local redirect back to your browser
-       without contacting the remote site.
-         +fast-redirects
-       
-     * Apply the filters in the section_header section of the
-       default.filter file to the site(s). default.filter sections are
-       grouped according to like functionality.
-        +filter{section_header}
-       
-       Filter sections that are pre-defined in the supplied
-       default.filter include:
-       
-   html-annoyances: Get rid of particularly annoying HTML abuse.
-   
-   js-annoyances: Get rid of particularly annoying JavaScript abuse
-   
-   no-poups: Kill all popups in JS and HTML
-   
-   frameset-borders: Give frames a border
-   
-   webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
-   
-   no-refresh: Automatic refresh sucks on auto-dialup lines
-   
-   fun: Text replacements for subversive browsing fun!
-   
-   nimda: Remove (virus) Nimda code.
-   
-   banners-by-size: Kill banners by size
-   
-   crude-parental: Kill all web pages that contain the words "sex" or
-   "warez"
-   
-     * Block any existing X-Forwarded-for header, and do not add a new
-       one:
-         +hide-forwarded
-       
-     * If the browser sends a "From:" header containing your e-mail
-       address, this either completely removes the header ("block"), or
-       changes it to the specified e-mail address.
-         +hide-from{block}
-         +hide-from{spam@sittingduck.xqq}
-       
-     * Don't send the "Referer:" (sic) header to the web site. You can
-       block it, forge a URL to the same server as the request (which is
-       preferred because some sites will not send images otherwise) or
-       set it to a constant string of your choice.
-         +hide-referer{block}
-         +hide-referer{forge}
-         +hide-referer{http://nowhere.com}
-       
-     * Alternative spelling of "+hide-referer". It has the same
-       parameters, and can be freely mixed with, "+hide-referer".
-       ("referrer" is the correct English spelling, however the HTTP
-       specification has a bug - it requires it to be spelled "referer".)
-         +hide-referrer{...}
-       
-     * Change the "User-Agent:" header so web servers can't tell your
-       browser type. Warning! This breaks many web sites. Specify the
-       user-agent value you want. Example, pretend to be using Netscape
-       on Linux:
-         +hide-user-agent{Mozilla (X11; I; Linux 2.0.32 i586)}
-       
-     * Treat this URL as an image. This only matters if it's also
-       "+block"ed, in which case a "blocked" image can be sent rather
-       than a HTML page. See "+image-blocker{}" below for the control
-       over what is actually sent. If you want invisible ads, they should
-       be defined as images and blocked. And also, "image-blocker" should
-       be set to "blank".
-         +image
-       
-     * Decides what to do with URLs that end up tagged with "{+block
-       +image}", e.g an advertizement. There are five options.
-       "-image-blocker" will send a HTML "blocked" page, usually
-       resulting in a "broken image" icon. "+image-blocker{blank}" will
-       send a 1x1 transparent GIF image. And finally,
-       "+image-blocker{http://xyz.com}" will send a HTTP temporary
-       redirect to the specified image. This has the advantage of the
-       icon being being cached by the browser, which will speed up the
-       display. "+image-blocker{pattern}" will send a checkboard type
-       pattern
-         +image-blocker{blank}
-         +image-blocker{pattern}
-         +image-blocker{http://p.p/send-banner}
-       
-     * By default (i.e. in the absence of a "+limit-connect" action),
-       Privoxy will only allow CONNECT requests to port 443, which is the
-       standard port for https as a precaution.
-       The CONNECT methods exists in HTTP to allow access to secure
-       websites (https:// URLs) through proxies. It works very simply:
-       the proxy connects to the server on the specified port, and then
-       short-circuits its connections to the client and to the remote
-       proxy. This can be a big security hole, since CONNECT-enabled
-       proxies can be abused as TCP relays very easily.
-       If you want to allow CONNECT for more ports than this, or want to
-       forbid CONNECT altogether, you can specify a comma separated list
-       of ports and port ranges (the latter using dashes, with the
-       minimum defaulting to 0 and max to 65K):
-         +limit-connect{443} # This is the default and need no be
-       specified.
-         +limit-connect{80,443} # Ports 80 and 443 are OK.
-         +limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to
-       100
-          #and above 500 are OK.
-       
-     * "+no-compression" prevents the website from compressing the data.
-       Some websites do this, which can be a problem for Privoxy, since
-       "+filter", "+no-popup" and "+gif-deanimate" will not work on
-       compressed data. This will slow down connections to those
-       websites, though. Default is "nocompression" is turned on.
-         +nocompression
-       
-     * If the website sets cookies, "no-cookies-keep" will make sure they
-       are erased when you exit and restart your web browser. This makes
-       profiling cookies useless, but won't break sites which require
-       cookies so that you can log in for transactions. Default: on.
-         +no-cookies-keep
-       
-     * Prevent the website from reading cookies:
-         +no-cookies-read
-       
-     * Prevent the website from setting cookies:
-         +no-cookies-set
-       
-     * Filter the website through a built-in filter to disable those
-       obnoxious JavaScript pop-up windows via window.open(), etc. The
-       two alternative spellings are equivalent.
-         +no-popup
-         +no-popups
-       
-     * This action only applies if you are using a jarfile for saving
-       cookies. It sends a cookie to every site stating that you do not
-       accept any copyright on cookies sent to you, and asking them not
-       to track you. Of course, this is a (relatively) unique header they
-       could use to track you.
-         +vanilla-wafer
-       
-     * This allows you to add an arbitrary cookie. It can be specified
-       multiple times in order to add as many cookies as you like.
-         +wafer{name=value}
-       
-   The meaning of any of the above is reversed by preceding the action
-   with a "-", in place of the "+".
-   
-   Some examples:
-   
-   Turn off cookies by default, then allow a few through for specified
-   sites:
-   
-    # Turn off all persistent cookies
-    { +no-cookies-read }
-    { +no-cookies-set }
-    # Allow cookies for this browser session ONLY
-    { +no-cookies-keep }
-    # Exceptions to the above, sites that benefit from persistent cookies
-    { -no-cookies-read }
-    { -no-cookies-set }
-    { -no-cookies-keep }
-    .javasoft.com
-    .sun.com
-    .yahoo.com
-    .msdn.microsoft.com
-    .redhat.com
-    # Alternative way of saying the same thing
-    {-no-cookies-set -no-cookies-read -no-cookies-keep}
-    .sourceforge.net
-    .sf.net
-   
-   Now turn off "fast redirects", and then we allow two exceptions:
-   
-    # Turn them off!
-    {+fast-redirects}
-   
-    # Reverse it for these two sites, which don't work right without it.
-    {-fast-redirects}
-    www.ukc.ac.uk/cgi-bin/wac\.cgi\?
-    login.yahoo.com
-   
-   Turn on page filtering according to rules in the defined sections of
-   refilterfile, and make one exception for sourceforge:
-   
-    # Run everything through the filter file, using only the
-    # specified sections:
-    +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\
-    +filter{webbugs} +filter{nimda} +filter{banners-by-size}
-   
-    # Then disable filtering of code from sourceforge!
-    {-filter}
-    .cvs.sourceforge.net
-   
-   Now some URLs that we want "blocked", ie we won't see them. Many of
-   these use regular expressions that will expand to match multiple URLs:
-   
-     # Blocklist:
-     {+block}
-     /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g))
-     /.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/])
-     /.*/(ng)?adclient\.cgi
-     /.*/(plain|live|rotate)[-_.]?ads?/
-     /.*/(sponsor)s?[0-9]?/
-     /.*/_?(plain|live)?ads?(-banners)?/
-     /.*/abanners/
-     /.*/ad(sdna_image|gifs?)/
-     /.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
-     /.*/adbanners/
-     /.*/adserver
-     /.*/adstream\.cgi
-     /.*/adv((er)?ts?|ertis(ing|ements?))?/
-     /.*/banner_?ads/
-     /.*/banners?/
-     /.*/banners?\.cgi/
-     /.*/cgi-bin/centralad/getimage
-     /.*/images/addver\.gif
-     /.*/images/marketing/.*\.(gif|jpe?g)
-     /.*/popupads/
-     /.*/siteads/
-     /.*/sponsor.*\.gif
-     /.*/sponsors?[0-9]?/
-     /.*/advert[0-9]+\.jpg
-     /Media/Images/Adds/
-     /ad_images/
-     /adimages/
-     /.*/ads/
-     /bannerfarm/
-     /grafikk/annonse/
-     /graphics/defaultAd/
-     /image\.ng/AdType
-     /image\.ng/transactionID
-     /images/.*/.*_anim\.gif # alvin brattli
-     /ip_img/.*\.(gif|jpe?g)
-     /rotateads/
-     /rotations/
-     /worldnet/ad\.cgi
-     /cgi-bin/nph-adclick.exe/
-     /.*/Image/BannerAdvertising/
-     /.*/ad-bin/
-     /.*/adlib/server\.cgi
-     /autoads/
-   
-   Note that many of these actions have the potential to cause a page to
-   misbehave, possibly even not to display at all. There are many ways a
-   site designer may choose to design his site, and what HTTP header
-   content he may depend on. There is no way to have hard and fast rules
-   for all sites. See the [52]Appendix for a brief example on
-   troubleshooting actions.
-     _________________________________________________________________
-   
-3.4.3. Aliases
-
-   Custom "actions", known to Privoxy as "aliases", can be defined by
-   combining other "actions". These can in turn be invoked just like the
-   built-in "actions". Currently, an alias can contain any character
-   except space, tab, "=", "{" or "}". But please use only "a"- "z",
-   "0"-"9", "+", and "-". Alias names are not case sensitive, and must be
-   defined before anything else in the default.actionfile ! And there can
-   only be one set of "aliases" defined.
-   
-   Now let's define a few aliases:
-   
-    # Useful customer aliases we can use later. These must come first!
-    {{alias}}
-    +no-cookies = +no-cookies-set +no-cookies-read
-    -no-cookies = -no-cookies-set -no-cookies-read
-    fragile     = -block -no-cookies -filter -fast-redirects -hide-refere
-   r -no-popups
-    shop        = -no-cookies -filter -fast-redirects
-    +imageblock = +block +image
-    #For people who don't like to type too much:  ;-)
-    c0 = +no-cookies
-    c1 = -no-cookies
-    c2 = -no-cookies-set +no-cookies-read
-    c3 = +no-cookies-set -no-cookies-read
-    #... etc.  Customize to your heart's content.
-   
-   Some examples using our "shop" and "fragile" aliases from above:
-   
-    # These sites are very complex and require
-    # minimal interference.
-    {fragile}
-    .office.microsoft.com
-    .windowsupdate.microsoft.com
-    .nytimes.com
-    # Shopping sites - still want to block ads.
-    {shop}
-    .quietpc.com
-    .worldpay.com   # for quietpc.com
-    .jungle.com
-    .scan.co.uk
-    # These shops require pop-ups
-    {shop -no-popups}
-    .dabs.com
-    .overclockers.co.uk
-     _________________________________________________________________
-   
-3.5. The Filter File
-
-   Any web page can be dynamically modified with the filter file. This
-   modification can be removal, or re-writing, of any web page content,
-   including tags and non-visible content. The default filter file is
-   default.filter, located in the config directory.
-   
-   The included example file is divided into sections. Each section
-   begins with the FILTER keyword, followed by the identifier for that
-   section, e.g. "FILTER: webbugs". Each section performs a similar type
-   of filtering, such as "html-annoyances".
-   
-   This file uses regular expressions to alter or remove any string in
-   the target page. The expressions can only operate on one line at a
-   time. Some examples from the included default default.filter:
-   
-   Stop web pages from displaying annoying messages in the status bar by
-   deleting such references:
-   
-    FILTER: html-annoyances
-    # New browser windows should be resizeable and have a location and st
-   atus
-    # bar. Make it so.
-    #
-    s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig
-    s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig
-    s/scrolling="?(no|0|Auto)"?/scrolling=1/ig
-    s/menubar="?(no|0)"?/menubar=1/ig
-    # The <BLINK> tag was a crime!
-    #
-    s*<blink>|</blink>**ig
-    # Is this evil?
-    #
-    #s/framespacing="?(no|0)"?//ig
-    #s/margin(height|width)=[0-9]*//gi
-   
-   Just for kicks, replace any occurrence of "Microsoft" with
-   "MicroSuck", and have a little fun with topical buzzwords:
-   
-    FILTER: fun
-    s/microsoft(?!.com)/MicroSuck/ig
-    # Buzzword Bingo:
-    #
-    s/industry-leading|cutting-edge|award-winning/<font color=red><b>BING
-   O!</b></font>/ig
-   
-   Kill those pesky little web-bugs:
-   
-    # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
-    FILTER: webbugs
-    s/<img\s+[^>]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\
-   s*['"]?1(\D[^>]*?)?>/<!-- Squished WebBug -->/sig
-     _________________________________________________________________
-   
-3.6. Templates
-
-   When Privoxy displays one of its internal pages, such as a 404 Not
-   Found error page, it uses the appropriate template. On Linux, BSD, and
-   Unix, these are located in /etc/privoxy/templates by default. These
-   may be customized, if desired.
-     _________________________________________________________________
-   
-4. Quickstart to Using Privoxy
-
-   Install package, then run and enjoy! Privoxy is typically started by
-   specifying the main configuration file to be used on the command line.
-   Example Unix startup command:
-   
-
- # /usr/sbin/privoxy /etc/privoxy/config
-
-
-   An init script is provided for SuSE and Redhat.
-   
-   For for SuSE: /etc/rc.d/privoxy start
-   
-   For RedHat: /etc/rc.d/init.d/privoxy start
-   
-   If no configuration file is specified on the command line, Privoxy
-   will look for a file named config in the current directory. Except on
-   Win32 where it will try config.txt. If no file is specified on the
-   command line and no default configuration file can be found, Privoxy
-   will fail to start.
-   
-   Be sure your browser is set to use the proxy which is by default at
-   localhost, port 8118. With Netscape (and Mozilla), this can be set
-   under Edit -> Preferences -> Advanced -> Proxies -> HTTP Proxy. For
-   Internet Explorer: Tools > Internet Properties -> Connections -> LAN
-   Setting. Then, check "Use Proxy" and fill in the appropriate info
-   (Address: localhost, Port: 8118). Include if HTTPS proxy support too.
-   
-   The included default configuration files should give a reasonable
-   starting point, though may be somewhat aggressive in blocking junk.
-   You will probably want to keep an eye out for sites that require
-   persistent cookies, and add these to default.action as needed. By
-   default, most of these will be accepted only during the current
-   browser session, until you add them to the configuration. If you want
-   the browser to handle this instead, you will need to edit
-   default.action and disable this feature. If you use more than one
-   browser, it would make more sense to let Privoxy handle this. In which
-   case, the browser(s) should be set to accept all cookies.
-   
-   If a particular site shows problems loading properly, try adding it to
-   the {fragile} section of default.action. This will turn off most
-   actions for this site.
-   
-   Privoxy is HTTP/1.1 compliant, but not all 1.1 features are as yet
-   implemented. If browsers that support HTTP/1.1 (like Mozilla or recent
-   versions of I.E.) experience problems, you might try to force HTTP/1.0
-   compatibility. For Mozilla, look under Edit -> Preferences -> Debug ->
-   Networking. Or set the "+downgrade" config option in default.action.
-   
-   After running Privoxy for a while, you can start to fine tune the
-   configuration to suit your personal, or site, preferences and
-   requirements. There are many, many aspects that can be customized.
-   "Actions" (as specified in default.action) can be adjusted by pointing
-   your browser to [53]http://p.p/, and then follow the link to "edit the
-   actions list". (This is an internal page and does not require Internet
-   access.)
-   
-   In fact, various aspects of Privoxy configuration can be viewed from
-   this page, including current configuration parameters, source code
-   version numbers, the browser's request headers, and "actions" that
-   apply to a given URL. In addition to the default.action file editor
-   mentioned above, Privoxy can also be turned "on" and "off" from this
-   page.
-   
-   If you encounter problems, please verify it is a Privoxy bug, by
-   disabling Privoxy, and then trying the same page. Also, try another
-   browser if possible to eliminate browser or site problems. Before
-   reporting it as a bug, see if there is not a configuration option that
-   is enabled that is causing the page not to load. You can then add an
-   exception for that page or site. If a bug, please report it to the
-   developers (see below).
-     _________________________________________________________________
-   
-4.1. Command Line Options
-
-   Privoxy may be invoked with the following command-line options:
-   
-     * --version
-       Print version info and exit, Unix only.
-     * --help
-       Print a short usage info and exit, Unix only.
-     * --no-daemon
-       Don't become a daemon, i.e. don't fork and become process group
-       leader, don't detach from controlling tty. Unix only.
-     * --pidfile FILE
-       On startup, write the process ID to FILE. Delete the FILE on exit.
-       Failiure to create or delete the FILE is non-fatal. If no FILE
-       option is given, no PID file will be used. Unix only.
-     * --user USER[.GROUP]
-       After (optionally) writing the PID file, assume the user ID of
-       USER, and if included the GID of GROUP. Exit if the privileges are
-       not sufficient to do so. Unix only.
-     * configfile
-       If no configfile is included on the command line, Privoxy will
-       look for a file named "config" in the current directory (except on
-       Win32 where it will look for "config.txt" instead). Specify full
-       path to avoid confusion.
-     _________________________________________________________________
-   
-5. Contacting the Developers, Bug Reporting and Feature Requests
-
-   We value your feedback. However, to provide you with the best support,
-   please note:
-   
-     * Use the [54]Sourceforge support forum to get help.
-     * Submit bugs only thru our [55]Sourceforge bug forum. Make sure
-       that the bug has not already been submitted. Please try to verify
-       that it is a Privoxy bug, and not a browser or site bug first. If
-       you are using your own custom configuration, please try the stock
-       configs to see if the problem is a configuration related bug. And
-       if not using the latest development snapshot, please try the
-       latest one. Or even better, CVS sources.
-     * Submit feature requests only thru our [56]Sourceforge feature
-       request forum.
-       
-   For any other issues, feel free to use the [57]mailing lists.
-   
-   Anyone interested in actively participating in development and related
-   discussions can join the appropriate mailing list [58]here. Archives
-   are available here too.
-     _________________________________________________________________
-   
-6. Copyright and History
-
-6.1. License
-
-   Privoxy is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2 of the License, or (at your
-   option) any later version.
-   
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details, which is available from
-   [59]the Free Software Foundation, Inc, 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.
-     _________________________________________________________________
-   
-6.2. History
-
-   Privoxy is derived from the Internet Junkbuster, with many improvments
-   and enhancements over the original.
-   
-   Junkbuster was originally written by Anonymous Coders and
-   [60]Junkbuster's Corporation, and was released as free open-source
-   software under the GNU GPL. [61]Stefan Waldherr made many
-   improvements, and started the [62]SourceForge project Privoxy to
-   rekindle development. There are now several active developers
-   contributing. The last stable release of Junkbuster was v2.0.2, which
-   has now grown whiskers ;-).
-     _________________________________________________________________
-   
-7. See also
-
-     [63]http://sourceforge.net/projects/ijbswa
-   
-     [64]http://www.privoxy.org/
-   
-     [65]http://p.p/
-   
-     [66]http://www.junkbusters.com/ht/en/cookies.html
-   
-     [67]http://www.waldherr.org/junkbuster/
-   
-     [68]http://privacy.net/analyze/
-   
-    [69]http://www.squid-cache.org/
-     _________________________________________________________________
-   
-8. Appendix
-
-8.1. Regular Expressions
-
-   Privoxy can use "regular expressions" in various config files.
-   Assuming support for "pcre" (Perl Compatible Regular Expressions) is
-   compiled in, which is the default. Such configuration directives do
-   not require regular expressions, but they can be used to increase
-   flexibility by matching a pattern with wild-cards against URLs.
-   
-   If you are reading this, you probably don't understand what "regular
-   expressions" are, or what they can do. So this will be a very brief
-   introduction only. A full explanation would require a book ;-)
-   
-   "Regular expressions" is a way of matching one character expression
-   against another to see if it matches or not. One of the "expressions"
-   is a literal string of readable characters (letter, numbers, etc), and
-   the other is a complex string of literal characters combined with
-   wild-cards, and other special characters, called meta-characters. The
-   "meta-characters" have special meanings and are used to build the
-   complex pattern to be matched against. Perl Compatible Regular
-   Expressions is an enhanced form of the regular expression language
-   with backward compatibility.
-   
-   To make a simple analogy, we do something similar when we use
-   wild-card characters when listing files with the dir command in DOS.
-   *.* matches all filenames. The "special" character here is the
-   asterisk which matches any and all characters. We can be more specific
-   and use ? to match just individual characters. So "dir file?.text"
-   would match "file1.txt", "file2.txt", etc. We are pattern matching,
-   using a similar technique to "regular expressions"!
-   
-   Regular expressions do essentially the same thing, but are much, much
-   more powerful. There are many more "special characters" and ways of
-   building complex patterns however. Let's look at a few of the common
-   ones, and then some examples:
-   
-   . - Matches any single character, e.g. "a", "A", "4", ":", or "@".
-   
-   ? - The preceding character or expression is matched ZERO or ONE
-   times. Either/or.
-   
-   + - The preceding character or expression is matched ONE or MORE
-   times.
-   
-   * - The preceding character or expression is matched ZERO or MORE
-   times.
-   
-   \ - The "escape" character denotes that the following character should
-   be taken literally. This is used where one of the special characters
-   (e.g. ".") needs to be taken literally and not as a special
-   meta-character.
-   
-   [] - Characters enclosed in brackets will be matched if any of the
-   enclosed characters are encountered.
-   
-   () - parentheses are used to group a sub-expression, or multiple
-   sub-expressions.
-   
-   | - The "bar" character works like an "or" conditional statement. A
-   match is successful if the sub-expression on either side of "|"
-   matches.
-   
-   s/string1/string2/g - This is used to rewrite strings of text.
-   "string1" is replaced by "string2" in this example.
-   
-   These are just some of the ones you are likely to use when matching
-   URLs with Privoxy, and is a long way from a definitive list. This is
-   enough to get us started with a few simple examples which may be more
-   illuminating:
-   
-   /.*/banners/.* - A simple example that uses the common combination of
-   "." and "*" to denote any character, zero or more times. In other
-   words, any string at all. So we start with a literal forward slash,
-   then our regular expression pattern (".*") another literal forward
-   slash, the string "banners", another forward slash, and lastly another
-   ".*". We are building a directory path here. This will match any file
-   with the path that has a directory named "banners" in it. The ".*"
-   matches any characters, and this could conceivably be more forward
-   slashes, so it might expand into a much longer looking path. For
-   example, this could match:
-   "/eye/hate/spammers/banners/annoy_me_please.gif", or just
-   "/banners/annoying.html", or almost an infinite number of other
-   possible combinations, just so it has "banners" in the path somewhere.
-   
-   A now something a little more complex:
-   
-   /.*/adv((er)?ts?|ertis(ing|ements?))?/ - We have several literal
-   forward slashes again ("/"), so we are building another expression
-   that is a file path statement. We have another ".*", so we are
-   matching against any conceivable sub-path, just so it matches our
-   expression. The only true literal that must match our pattern is adv,
-   together with the forward slashes. What comes after the "adv" string
-   is the interesting part.
-   
-   Remember the "?" means the preceding expression (either a literal
-   character or anything grouped with "(...)" in this case) can exist or
-   not, since this means either zero or one match. So
-   "((er)?ts?|ertis(ing|ements?))" is optional, as are the individual
-   sub-expressions: "(er)", "(ing|ements?)", and the "s". The "|" means
-   "or". We have two of those. For instance, "(ing|ements?)", can expand
-   to match either "ing" OR "ements?". What is being done here, is an
-   attempt at matching as many variations of "advertisement", and
-   similar, as possible. So this would expand to match just "adv", or
-   "advert", or "adverts", or "advertising", or "advertisement", or
-   "advertisements". You get the idea. But it would not match
-   "advertizements" (with a "z"). We could fix that by changing our
-   regular expression to: "/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/",
-   which would then match either spelling.
-   
-   /.*/advert[0-9]+\.(gif|jpe?g) - Again another path statement with
-   forward slashes. Anything in the square brackets "[]" can be matched.
-   This is using "0-9" as a shorthand expression to mean any digit one
-   through nine. It is the same as saying "0123456789". So any digit
-   matches. The "+" means one or more of the preceding expression must be
-   included. The preceding expression here is what is in the square
-   brackets -- in this case, any digit one through nine. Then, at the
-   end, we have a grouping: "(gif|jpe?g)". This includes a "|", so this
-   needs to match the expression on either side of that bar character
-   also. A simple "gif" on one side, and the other side will in turn
-   match either "jpeg" or "jpg", since the "?" means the letter "e" is
-   optional and can be matched once or not at all. So we are building an
-   expression here to match image GIF or JPEG type image file. It must
-   include the literal string "advert", then one or more digits, and a
-   "." (which is now a literal, and not a special character, since it is
-   escaped with "\"), and lastly either "gif", or "jpeg", or "jpg". Some
-   possible matches would include: "//advert1.jpg",
-   "/nasty/ads/advert1234.gif", "/banners/from/hell/advert99.jpg". It
-   would not match "advert1.gif" (no leading slash), or "/adverts232.jpg"
-   (the expression does not include an "s"), or "/advert1.jsp" ("jsp" is
-   not in the expression anywhere).
-   
-   s/microsoft(?!.com)/MicroSuck/i - This is a substitution. "MicroSuck"
-   will replace any occurrence of "microsoft". The "i" at the end of the
-   expression means ignore case. The "(?!.com)" means the match should
-   fail if "microsoft" is followed by ".com". In other words, this acts
-   like a "NOT" modifier. In case this is a hyperlink, we don't want to
-   break it ;-).
-   
-   We are barely scratching the surface of regular expressions here so
-   that you can understand the default Privoxy configuration files, and
-   maybe use this knowledge to customize your own installation. There is
-   much, much more that can be done with regular expressions. Now that
-   you know enough to get started, you can learn more on your own :/
-   
-   More reading on Perl Compatible Regular expressions:
-   [70]http://www.perldoc.com/perl5.6/pod/perlre.html
-     _________________________________________________________________
-   
-8.2. Privoxy's Internal Pages
-
-   Since Privoxy proxies each requested web page, it is easy for Privoxy
-   to trap certain URLs. In this way, we can talk directly to Privoxy,
-   and see how it is configured, see how our rules are being applied,
-   change these rules and other configuration options, and even turn
-   Privoxy's filtering off, all with a web browser.
-   
-   The URLs listed below are the special ones that allow direct access to
-   Privoxy. Of course, Privoxy must be running to access these. If not,
-   you will get a friendly error message. Internet access is not
-   necessary either.
-   
-     * Privoxy main page:
-       
-     [71]http://www.privoxy.org/config/
-       Alternately, this may be reached at [72]http://p.p/, but this
-       variation may not work as reliably as the above in some
-       configurations.
-     * Show information about the current configuration:
-       
-     [73]http://www.privoxy.org/config/show-status
-     * Show the source code version numbers:
-       
-     [74]http://www.privoxy.org/config/show-version
-     * Show the client's request headers:
-       
-     [75]http://www.privoxy.org/config/show-request
-     * Show which actions apply to a URL and why:
-       
-     [76]http://www.privoxy.org/config/show-url-info
-     * Toggle Privoxy on or off:
-       
-     [77]http://www.privoxy.org/config/toggle
-       Short cuts. Turn off, then on:
-       
-     [78]http://www.privoxy.org/config/toggle?set=disable
-       
-     [79]http://www.privoxy.org/config/toggle?set=enable
-     * Edit the actions list file:
-       
-     [80]http://www.privoxy.org/config/edit-actions
-       
-   These may be bookmarked for quick reference.
-     _________________________________________________________________
-   
-8.3. Anatomy of an Action
-
-   The way Privoxy applies "actions" to any given URL can be complex, and
-   not always so easy to understand what is happening. And sometimes we
-   need to be able to see just what Privoxy is doing. Especially, if
-   something Privoxy is doing is causing us a problem inadvertantly. It
-   can be a little daunting to look at the actions files themselves,
-   since they tend to be filled with "regular expressions" whose
-   consequences are not always so obvious. Privoxy provides the
-   [81]http://www.privoxy.org/config/show-url-info page that can show us
-   very specifically how actions are being applied to any given URL. This
-   is a big help for troubleshooting.
-   
-   First, enter one URL (or partial URL) at the prompt, and then Privoxy
-   will tell us how the current configuration will handle it. This will
-   not help with filtering effects from the default.filter file! It also
-   will not tell you about any other URLs that may be embedded within the
-   URL you are testing. For instance, images such as ads are expressed as
-   URLs within the raw page source of HTML pages. So you will only get
-   info for the actual URL that is pasted into the prompt area -- not any
-   sub-URLs. If you want to know about embedded URLs like ads, you will
-   have to dig those out of the HTML source. Use your browser's "View
-   Page Source" option for this.
-   
-   Let's look at an example, [82]google.com, one section at a time:
-   
- System default actions:
-
- { -add-header -block -deanimate-gifs -downgrade -fast-redirects -filter
-   -hide-forwarded -hide-from -hide-referer -hide-user-agent -image
-   -image-blocker -limit-connect -no-compression -no-cookies-keep
-   -no-cookies-read -no-cookies-set -no-popups -vanilla-wafer -wafer }
-
-
-   This is the top section, and only tells us of the compiled in
-   defaults. This is basically what Privoxy would do if there were not
-   any "actions" defined, i.e. it does nothing. Every action is disabled.
-   This is not particularly informative for our purposes here. OK, next
-   section:
-   
- Matches for http://google.com:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal}
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge}
-   -hide-user-agent -image +image-blocker{blank} +no-compression
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups
-   -vanilla-wafer -wafer }
-   /
-
- { -no-cookies-keep -no-cookies-read -no-cookies-set }
-  .google.com
-
- { -fast-redirects }
-  .google.com
-
-
-   This is much more informative, and tells us how we have defined our
-   "actions", and which ones match for our example, "google.com". The
-   first grouping shows our default settings, which would apply to all
-   URLs. If you look at your "actions" file, this would be the section
-   just below the "aliases" section near the top. This applies to all
-   URLs as signified by the single forward slash -- "/".
-   
-   These are the default actions we have enabled. But we can define
-   additional actions that would be exceptions to these general rules,
-   and then list specific URLs that these exceptions would apply to. Last
-   match wins. Just below this then are two explict matches for
-   ".google.com". The first is negating our various cookie blocking
-   actions (i.e. we will allow cookies here). The second is allowing
-   "fast-redirects". Note that there is a leading dot here --
-   ".google.com". This will match any hosts and sub-domains, in the
-   google.com domain also, such as "www.google.com". So, apparently, we
-   have these actions defined somewhere in the lower part of our actions
-   file, and "google.com" is referenced in these sections.
-   
-   And now we pull it altogether in the bottom section and summarize how
-   Privoxy is appying all its "actions" to "google.com":
-   
- Final results:
-
- -add-header -block -deanimate-gifs -downgrade -fast-redirects
- +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}
- +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal}
- +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge}
- -hide-user-agent -image +image-blocker{blank} -limit-connect +no-compression
- -no-cookies-keep -no-cookies-read -no-cookies-set +no-popups -vanilla-wafer
- -wafer
-
-
-   Now another example, "ad.doubleclick.net":
-   
- { +block +image }
-  .ad.doubleclick.net
-
- { +block +image }
-  ad*.
-
- { +block +image }
-  .doubleclick.net
-
-
-   We'll just show the interesting part here, the explicit matches. It is
-   matched three different times. Each as an "+block +image", which is
-   the expanded form of one of our aliases that had been defined as:
-   "+imageblock". ("Aliases" are defined in the first section of the
-   actions file and typically used to combine more than one action.)
-   
-   Any one of these would have done the trick and blocked this as an
-   unwanted image. This is unnecessarily redundant since the last case
-   effectively would also cover the first. No point in taking chances
-   with these guys though ;-) Note that if you want an ad or obnoxious
-   URL to be invisible, it should be defined as "ad.doubleclick.net" is
-   done here -- as both a "+block" and an "+image". The custom alias
-   "+imageblock" does this for us.
-   
-   One last example. Let's try "http://www.rhapsodyk.net/adsl/HOWTO/".
-   This one is giving us problems. We are getting a blank page. Hmmm...
-   
- Matches for http://www.rhapsodyk.net/adsl/HOWTO/:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal}
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge}
-   -hide-user-agent -image +image-blocker{blank} +no-compression
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups
-   -vanilla-wafer -wafer }
-   /
-
- { +block +image }
-  /ads
-
-
-   Ooops, the "/adsl/" is matching "/ads"! But we did not want this at
-   all! Now we see why we get the blank page. We could now add a new
-   action below this that explictly does not block (-block) pages with
-   "adsl". There are various ways to handle such exceptions. Example:
-   
- { -block }
-  /adsl
-
-
-   Now the page displays ;-)
-   
-   But now what about a situation where we get no explicit matches like
-   we did with:
-   
- { -block }
-  /adsl
-
-
-   That actually was very telling and pointed us quickly to where the
-   problem was. If you don't get this kind of match, then it means one of
-   the default rules in the first section is causing the problem. This
-   would require some guesswork, and maybe a little trial and error to
-   isolate the offending rule. One likely cause would be one of the
-   "{+filter}" actions. Try adding the URL for the site to one of aliases
-   that turn off "+filter":
-   
- {shop}
- .quietpc.com
- .worldpay.com   # for quietpc.com
- .jungle.com
- .scan.co.uk
- .forbes.com
-
-
-   "{shop}" is an "alias" that expands to "{ -filter -no-cookies
-   -no-cookies-keep }". Or you could do your own exception to negate
-   filtering:
-   
- {-filter}
- .forbes.com
-
-References
-
-   Visible links
-   1. http://www.privoxy.org/user-manual/
-   2. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INTRODUCTION
-   3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN35
-   4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION
-   5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-SOURCE
-   6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-RH
-   7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-SUSE
-   8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-OS2
-   9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-WIN
-  10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-OTHER
-  11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURATION
-  12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN154
-  13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN172
-  14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN203
-  15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN236
-  16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN329
-  17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN466
-  18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FORWARDING
-  19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN663
-  20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSFILE
-  21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN762
-  22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN836
-  23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1153
-  24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FILTERFILE
-  25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1212
-  26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUICKSTART
-  27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1268
-  28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONTACT
-  29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT
-  30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1327
-  31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1333
-  32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO
-  33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#APPENDIX
-  34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#REGEX
-  35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1521
-  36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSANAT
-  37. http://p.p/
-  38. http://sourceforge.net/projects/ijbswa/
-  39. http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/current/
-  40. http://www.gnu.org/
-  41. http://p.p/
-  42. http://www.privoxy.org/config/
-  43. http://p.p/
-  44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSFILE
-  45. http://p.p/
-  46. http://p.p/
-  47. http://p.p/
-  48. http://p.p/
-  49. http://p.p/show-url-info
-  50. http://www.perldoc.com/perl5.6/pod/perlre.html
-  51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#REGEX
-  52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSANAT
-  53. http://p.p/
-  54. http://sourceforge.net/tracker/?group_id=11118&atid=211118
-  55. http://sourceforge.net/tracker/?group_id=11118&atid=111118
-  56. http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-  57. http://sourceforge.net/mail/?group_id=11118
-  58. http://sourceforge.net/mail/?group_id=11118
-  59. http://www.gnu.org/copyleft/gpl.html
-  60. http://www.junkbusters.com/
-  61. http://www.waldherr.org/junkbuster/
-  62. http://sourceforge.net/projects/ijbswa/
-  63. http://sourceforge.net/projects/ijbswa
-  64. http://www.privoxy.org/
-  65. http://p.p/
-  66. http://www.junkbusters.com/ht/en/cookies.html
-  67. http://www.waldherr.org/junkbuster/
-  68. http://privacy.net/analyze/
-  69. http://www.squid-cache.org/
-  70. http://www.perldoc.com/perl5.6/pod/perlre.html
-  71. http://www.privoxy.org/config/
-  72. http://p.p/
-  73. http://www.privoxy.org/config/show-status
-  74. http://www.privoxy.org/config/show-version
-  75. http://www.privoxy.org/config/show-request
-  76. http://www.privoxy.org/config/show-url-info
-  77. http://www.privoxy.org/config/toggle
-  78. http://www.privoxy.org/config/toggle?set=disable
-  79. http://www.privoxy.org/config/toggle?set=enable
-  80. http://www.privoxy.org/config/edit-actions
-  81. http://www.privoxy.org/config/show-url-info
-  82. http://google.com/
-
-   Hidden links:
-  83. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1393
-  84. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1401
-  85. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1404
-  86. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1407
-  87. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1410
-  88. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1415
-  89. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1418
-  90. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1421
-  91. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1427
similarity index 100%
rename from doc/obsolete/top.gif
rename to doc/top.gif
diff --git a/doc/webserver/.gitignore b/doc/webserver/.gitignore
deleted file mode 100644 (file)
index 7184d63..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-developer-manual
-faq
-user-manual
-man-page
\ No newline at end of file
diff --git a/doc/webserver/.htaccess b/doc/webserver/.htaccess
deleted file mode 100644 (file)
index 0ecf688..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# http://privoxy.org/.htaccess
-#
-# By Jon Foster
-#
-# Intercepts requests for these servers:
-#    http://ijbswa.sourceforge.net/
-#    http://privoxy.com/
-#    http://www.privoxy.com/
-#    http://www.privoxy.org/
-#
-# And redirects all requests to the canonical web server:
-#    http://privoxy.org/
-#
-#
-# Uses Apache's mod_rewrite
-# See http://httpd.apache.org/docs/mod/mod_rewrite.html
-#
-
-# Enable mod_rewrite
-RewriteEngine on
-
-
-RewriteCond %{HTTP_HOST}   !^privoxy\.org\.?$ [NC]
-RewriteCond %{HTTP_HOST}   !^$
-RewriteRule ^(.*)$         http://privoxy.org/$1 [R,L]
-
index 4221e3a..60680f9 100644 (file)
@@ -3,7 +3,6 @@ on the project's homepage
 
    ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
 
-which is indeed http://ijbswa.sourceforge.net 
-and http://www.privoxy.org/.
+which is indeed http://ijbswa.sourceforge.net.
 
--Stefan, April 2002
\ No newline at end of file
+-Stefan, June 2001
\ No newline at end of file
diff --git a/doc/webserver/config/.htaccess b/doc/webserver/config/.htaccess
deleted file mode 100644 (file)
index 0a2bfbf..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# http://ijbswa.sourceforge.net/config/.htaccess
-#
-# By Jon Foster
-#
-# Redirects any request for any file in this directory tree
-# to an error page.  The error page is reached through the
-# URL http://privoxy.org/config/ and is actually in
-# the file index.php
-#
-# Uses Apache's mod_rewrite
-# See http://httpd.apache.org/docs/mod/mod_rewrite.html
-#
-
-# Enable mod_rewrite
-RewriteEngine on
-
-# we are reached via /config/ prefix
-RewriteBase   /config/
-
-# The only file which really exists is index.php - allow this
-RewriteCond %{HTTP_HOST}   ^privoxy\.org\.?$ [NC,OR]
-RewriteCond %{HTTP_HOST}   ^$
-RewriteRule  index.php - [L]
-
-# Silently redirect the config dir to index.php
-RewriteCond %{HTTP_HOST}   ^privoxy\.org\.?$ [NC,OR]
-RewriteCond %{HTTP_HOST}   ^$
-RewriteRule  ^$      index.php [L]
-
-# anything else gets redirected to the config dir, and we update
-# the browser's location bar.
-RewriteRule  ^(.*)$  http://privoxy.org/config/  [R,L]
-
-
diff --git a/doc/webserver/config/index.php b/doc/webserver/config/index.php
deleted file mode 100644 (file)
index 38f5976..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
-<html><head>
-<title>Privoxy not running</title>
-</head>
-
-<body>
-
-<h1>Privoxy isn't working</h1>
-
-<p>If you were redirected to this page, it means that you aren't using
-<a href="http://privoxy.org/">Privoxy</a>. &nbsp; Please check your browser settings.</p>
-
-<p>Junkbuster 2.9.x was renamed Privoxy.  If you recently upgraded, then
-the web-based interface has moved - it is now at <a href="http://config.privoxy.org/">http://config.privoxy.org/</a>
-(Short form: <a href="http://ijbswa.sourceforge.net/config/">p.p</a> [Privoxy Proxy]).</p>
-
-<p><a href="http://privoxy.org/">Privoxy home page</a></p>
-
-</body>
-</html>
-
diff --git a/doc/webserver/default_page.php b/doc/webserver/default_page.php
deleted file mode 100644 (file)
index 75a4fdc..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-// Default Web Page for groups that haven't setup their page yet
-// Please replace this file with your own website
-//
-// $Id: default_page.php,v 1.2 2000/01/07 18:11:56 precision Exp $
-//
-$headers = getallheaders();
-?>
-<HTML>
-<HEAD>
-<TITLE>SourceForge: Welcome</TITLE>
-<LINK rel="stylesheet" href="http://sourceforge.net/sourceforge.css" type="text/css">
-</HEAD>
-
-<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0">
-
-<!-- top strip -->
-<TABLE width="100%" border=0 cellspacing=0 cellpadding=2 bgcolor="737b9c">
-  <TR>
-    <TD><SPAN class=maintitlebar>&nbsp;&nbsp;
-      <A class=maintitlebar href="http://sourceforge.net/"><B>Home</B></A> | 
-      <A class=maintitlebar href="http://sourceforge.net/about.php"><B>About</B></A> | 
-      <A class=maintitlebar href="http://sourceforge.net/partners.php"><B>Partners</B></a> |
-      <A class=maintitlebar href="http://sourceforge.net/contact.php"><B>Contact Us</B></A></SPAN></TD>
-    </TD>
-  </TR>
-</TABLE>
-<!-- end top strip -->
-
-<!-- top title table -->
-<TABLE width="100%" border=0 cellspacing=0 cellpadding=0 bgcolor="" valign="center">
-  <TR valign="top" bgcolor="#eeeef8">
-    <TD>
-      <A href="http://sourceforge.net/"><IMG src="http://sourceforge.net/images/sflogo2-steel.png" vspace="0" border=0 width="143" height="70"></A>
-    </TD>
-    <TD width="99%"><!-- right of logo -->
-      <a href="http://www.valinux.com"><IMG src="http://sourceforge.net/images/valogo3.png" align="right" alt="VA Linux Systems" hspace="5" vspace="0" border=0 width="117" height="70"></A>
-    </TD><!-- right of logo -->
-  </TR>
-  <TR><TD bgcolor="#543a48" colspan=2><IMG src="http://sourceforge.net/images/blank.gif" height=2 vspace=0></TD></TR>
-</TABLE>
-<!-- end top title table -->
-
-<!-- center table -->
-<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="#FFFFFF" align="center">
-  <TR>
-    <TD>
-      <CENTER><BR>
-      <H1>Welcome to http://<?php print $headers[Host]; ?>/</H1>
-      <P>We're Sorry but this Project hasn't yet uploaded their personal webpage yet.<BR>
-      Please check back soon for updates or visit <A href="http://sourceforge.net/">SourceForge</A></P><BR>
-      </CENTER>
-    </TD>
-  </TR>
-</TABLE>
-<!-- end center table -->
-
-<!-- footer table -->
-<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c">
-  <TR>
-    <TD align="center"><FONT color="#ffffff"><SPAN class="titlebar">
-      All trademarks and copyrights on this page are properties of their respective owners. Forum comments are owned by the poster. The rest is copyright Â©1999-2000 VA Linux Systems, Inc.</SPAN></FONT>
-    </TD>
-  </TR>
-</TABLE>
-
-<!-- end footer table -->
-</BODY>
-</HTML>
diff --git a/doc/webserver/developer-manual.html b/doc/webserver/developer-manual.html
new file mode 100644 (file)
index 0000000..2a74cd1
--- /dev/null
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/developer-manual.html,v $
+
+ Purpose     :  Developer Manual
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: developer-manual.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|Developer Manual</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>How to quickly dive into Junkbuster Development:</h1>
+<p>
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:49 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+$Log: developer-manual.html,v $
+Revision 1.1  2001/06/13 14:20:37  swa
+first import of project's documentation for the webserver.
+
+-->
+</html>
diff --git a/doc/webserver/documentation-guidelines.html b/doc/webserver/documentation-guidelines.html
new file mode 100644 (file)
index 0000000..f6a23fe
--- /dev/null
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/documentation-guidelines.html,v $
+
+ Purpose     :  Gives direction on writing documentation.
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: documentation-guidelines.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|Documentation Guidelines</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>Documentation guideline:</h1>
+<p>
+All docs should be ...
+<ul>
+  <li>in a format that is widely used. I propose HTML.
+  <li>we either
+      <ul>
+       <li>generate man pages from the documentation (let's _NOT_ write them manually), or 
+       <li>we have a man page that points to the documentation (I propose
+           this option)
+      </ul>
+  <li>have a consistent layout
+  <li>have a link to the latest version of the document (i.e. point to a URL at sf)
+  <li>be consistent with the redirect script (i.e. the junkbuster program
+      points via the redirect URL at sf to valid end-points in the document)
+  <li>started from scratch but recycle parts from the original junkbuster documents
+</ul>
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:48 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+$Log: documentation-guidelines.html,v $
+Revision 1.1  2001/06/13 14:20:37  swa
+first import of project's documentation for the webserver.
+
+-->
+</html>
diff --git a/doc/webserver/faq.html b/doc/webserver/faq.html
new file mode 100644 (file)
index 0000000..a97c036
--- /dev/null
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/faq.html,v $
+
+ Purpose     :  FAQ
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: faq.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|FAQ</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>Questions</h1>
+
+<p>
+
+Please read the <a href="http://www.junkbusters.com/ht/en/ijbfaq.html">Junkbuster FAQ</a> at <a href="http://www.junkbusters.com">Junkbuster Corp.</a> and some other docs first.
+
+<h2>Installation</h2>
+<h2>Mail accounts</h2>
+<p>
+<a href="#yahoo">How can I make my Yahoo account work?</a>
+<p>
+<a href="#hotmail">How can I make my Hotmail account work?</a>
+<p>
+<a href="#gmx">How can I make my GMX account work?</a>
+<h2>Misc</h2>
+<p>
+<a href="#ip">How can I hide my IP address?</a>
+<p>
+<a href="#image">What is the imagefile (simage.ini, etc.) for?</a>
+<h2>Removal</h2>
+
+<h1>Answers</h1>
+
+<h3><a name="yahoo"></a>How can I make my Yahoo account work?</h3>
+<p>
+to be filled
+</p>
+
+<h3><a name="hotmail"></a>How can I make my Hotmail account work?</h3>
+<p>
+to be filled
+</p>
+
+<h3><a name="gmx"></a>How can I make my GMX account work?</h3>
+<p>
+to be filled
+
+<h3><a name="ip"></a>How can I hide my IP address?</h3>
+<p>
+You cannot hide your IP address with Junkbuster.
+
+<h3><a name="image"></a>What is the imagefile (simage.ini, etc.) for?</h3>
+<p>
+Anytime the Junkbuster determines (with the help of the blocklist) that a URL
+contains an advertisement, it has to decide whether this advertisement is an
+image or not. The Junkbuster uses the imagefile for that purpose..
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:47 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+$Log: faq.html,v $
+Revision 1.1  2001/06/13 14:20:37  swa
+first import of project's documentation for the webserver.
+
+-->
+</html>
index e3bf729..00bf0b7 100644 (file)
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
 <!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/user-manual.html,v $
 
-  File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/index.html,v $
+ Purpose     :  Index file of the project's homepage
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: user-manual.html,v 1.1 2001/06/13 14:20:37 swa Exp $
 
-  Purpose     :  Index file of the project's homepage
-                 This file belongs in
-                 ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-
-  $Id: index.html,v 1.13 2002/03/26 22:29:56 swa Exp $
-
-  Written by and Copyright (C) 2001 the SourceForge
-  Privoxy team. http://www.privoxy.org/
-
-  Based on the Internet Junkbuster originally written
-  by and Copyright (C) 1997 Anonymous Coders and
-  Junkbusters Corporation.  http://www.junkbusters.com
-
-  This program is free software; you can redistribute it
-  and/or modify it under the terms of the GNU General
-  Public License as published by the Free Software
-  Foundation; either version 2 of the License, or (at
-  your option) any later version.
-
-  This program is distributed in the hope that it will
-  be useful, but WITHOUT ANY WARRANTY; without even the
-  implied warranty of MERCHANTABILITY or FITNESS FOR A
-  PARTICULAR PURPOSE.  See the GNU General Public
-  License for more details.
-
-  The GNU General Public License should be included with
-  this file.  If not, you can view it at
-  http://www.gnu.org/copyleft/gpl.html
-  or write to the Free Software Foundation, Inc., 59
-  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
 
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
 -->
 
-<html>
-  <head>
-    <title>Privoxy|Project Homepage</title>
-    <link rel="stylesheet" type="text/css" href="p_web.css">
-    <meta name="description" content="Privoxy helps consumers reduce unwanted junk email and protect their privacy from direct marketing companies.">
-    <meta name="keywords" content="stop, junk, privoxy, ad, advertisement, werbung, busters, junkbusters, junkbuster, mail, email, e-mail, direct, spam, spamoff, declare, telemarketing, telemarketers, privacy, sharing, names, renting, direct, marketing, database, databases, junk mail, lists, environment, conservation, recycling, catalogs, consumer, sending, opt out ">
-    <meta name="MSSmartTagsPreventParsing" content="TRUE">
-  </head>
-
-  <body>
+<head>
+<title>Junkbuster|Project Homepage</title>
+<link rel=stylesheet type="text/css" href="swa.css">
 
-<h1>Privoxy</h1>
+<meta http-equiv="refresh" content="5; URL=http://www.waldherr.org/junkbuster/">
 
-<p>Privoxy is a web proxy with advanced filtering capabilities
-for protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other obnoxious
-Internet junk. Privoxy has a very flexible configuration and can be
-customized to suit individual needs and tastes. Privoxy has
-application for both stand-alone systems and multi-user networks.</p>
+</head>
 
-<p>Privoxy is based on the code of the Internet Junkbuster. Junkbuster was
-originally written by <a href=
-    "http://www.junkbusters.com/ht/en/ijbfaq.html">JunkBusters
-    Corporation</a>, and was released as free open-source software
-    under the <a href="http://www.gnu.org/">GNU</a> <a href=
-    "http://www.gnu.org/licenses/gpl.html">GPL</a>. <a href=
-    "http://www.waldherr.org/junkbuster/">Stefan Waldherr</a> made
-    many improvements, and started the <a href=
-    "http://sourceforge.net/projects/ijbswa/">SourceForge
-    project</a> to continue development.</p>
+<body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
 
-<h2>More infos ...</h2>
+<body>
 <p>
-<ul>
-  <li>The <a href="http://sourceforge.net/projects/ijbswa/">
-      project page</a> on <a href="http://sourceforge.net/">
-      Sourceforge</a></li>
-  <li><a href="http://www.waldherr.org/junkbuster/">Stefan Waldherr's
-      site</a></li>
-  <li><a href="http://www.junkbusters.com/ht/en/ijbfaq.html">JunkBusters
-      Corporation</a></li>
-</ul>
-
-<h2>Download</h2>
-<p>
-<ul>
-  <li><a href=
-      "http://sourceforge.net/project/showfiles.php?group_id=11118">Download</a> recent releases</li>
-  <li>Browse the <a href=
-      "http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/current/">
-      CVS repository</a></li>
-</ul>
-
-<h2>Documentation</h2>
-<p>
-<ul>
-  <li><a href="user-manual/">User manual</a></li>
-  <li><a href="developer-manual/">Developer manual</a></li>
-  <li><a href="faq/">Frequently Asked Questions</a></li>
-  <li><a href="man-page/privoxy-man-page.html">Classic man page</a></li>
-</ul>
-
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-
-<br>
+<br><br>
 <br>
 <br>
 
 <center>
-<a href="http://sourceforge.net/projects/ijbswa/"><img src=
-"http://sourceforge.net/sflogo.php?group_id=11118&amp;type=1"
-width="88" height="31" border="0" alt="SourceForge Logo"></a>
+You will be <a href="http://www.waldherr.org/junkbuster/">redirected</a> in a couple of moments. This page will soon have more content.
 </center>
 
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:46 CEST 2001
+<!-- hhmts end -->
 </body>
-</html>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ $Log: user-manual.html,v $
+ Revision 1.1  2001/06/13 14:20:37  swa
+ first import of project's documentation for the webserver.
 
+-->
+</html>
diff --git a/doc/webserver/p_doc.css b/doc/webserver/p_doc.css
deleted file mode 100644 (file)
index 8eb2159..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-hr { width: 95% }
-body { background: #EEEEEE; }
-h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif }
-code { color: green }
-pre { margin-left: 2% }
-# p { margin-left:20px }
-body { margin-left:20px }
-h1 { color: #404; font-size: 175%; margin-left:0px }
-h2 { color: #606; margin-left:0px }
-h3, h4 { color: #806; margin-left:0px }
-ul { list-style-type: square }
diff --git a/doc/webserver/p_web.css b/doc/webserver/p_web.css
deleted file mode 100644 (file)
index 8eb2159..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-hr { width: 95% }
-body { background: #EEEEEE; }
-h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif }
-code { color: green }
-pre { margin-left: 2% }
-# p { margin-left:20px }
-body { margin-left:20px }
-h1 { color: #404; font-size: 175%; margin-left:0px }
-h2 { color: #606; margin-left:0px }
-h3, h4 { color: #806; margin-left:0px }
-ul { list-style-type: square }
index a85b2c6..70d7e0b 100755 (executable)
@@ -1,11 +1,21 @@
-<?php
+M<?php
 
 error_reporting(E_ALL);
 
-// redirect.php
+// File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
 //
-// Copyright (C) 2001 The SourceForge ijbswa team.
-// May be used under the GNU GPL, version 2 or later.
+// Purpose     :  redirects requests to a specific paragraph in the online docs
+//                This file belongs into
+//                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+//                
+// $Id: Makefile.in,v 1.12 2001/06/12 17:15:56 swa Exp $
+//
+// Written by and Copyright (C) 2001 the SourceForge
+// IJBSWA team.  http://ijbswa.sourceforge.net
+//
+// Based on the Internet Junkbuster originally written
+// by and Copyright (C) 1997 Anonymous Coders and 
+// Junkbusters Corporation.  http://www.junkbusters.com
 
 
 // Parse the v= and to= paramaters
@@ -71,7 +81,7 @@ parse_parameters();
 
 
 // Please do NOT delete any of these redirects.  Even if you take them
-// out of Privoxy, they may be in use by older releases.
+// out of JunkBuster, they may be in use by older releases.
 
 // Note 2: Should *not* include #target part in these URLs.
 // (It works with MS IE, but is not valid HTTP.)
@@ -107,3 +117,25 @@ switch($to)
 
 exit;
 ?>
+
+// This program is free software; you can redistribute it 
+// and/or modify it under the terms of the GNU General
+// Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at
+// your option) any later version.
+//
+// This program is distributed in the hope that it will
+// be useful, but WITHOUT ANY WARRANTY; without even the
+// implied warranty of MERCHANTABILITY or FITNESS FOR A
+// PARTICULAR PURPOSE.  See the GNU General Public
+// License for more details.
+//
+// The GNU General Public License should be included with
+// this file.  If not, you can view it at
+// http://www.gnu.org/copyleft/gpl.html
+// or write to the Free Software Foundation, Inc., 59
+// Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+//
+//
+// $Log: Makefile.in,v $
+//
diff --git a/doc/webserver/robots.txt b/doc/webserver/robots.txt
deleted file mode 100644 (file)
index 790f3ff..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# This is the Internet Junkbuster web site.
-#
-# If the robot is connecting through a JunkBuster, then the
-# control interface is at /config.   It isn't very useful
-# to index it, and you're likely to break stuff.  So go away!
-#
-# Even if you're not connected through a JunkBuster, the 
-# one "JunkBuster's not working" page there is not very
-# interesting.
-
-User-agent: *
-Disallow: /config/
-
-
-
diff --git a/doc/webserver/swa.css b/doc/webserver/swa.css
new file mode 100644 (file)
index 0000000..22489e5
--- /dev/null
@@ -0,0 +1,9 @@
+body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px;}
+h1 { margin-left:20px; font-family:Helvetica,Arial; font-size:18pt;}
+h2 { margin-left:25px; font-family:Helvetica,Arial; font-size:14pt; }
+h3 { margin-left:25px; font-family:Helvetica,Arial; font-size:12pt; }
+p  { margin-left:27px; margin-right:20px; font-size:10pt; }
+# next definition removes bullets for netscape
+# li { margin-left:27px; margin-right:20px; font-size:10pt; }
+form,pre,ul,ol { margin-left:27px; margin-right:20px; font-size:10pt; }
+div,td,th,address,nobr,b,i { font-size:10pt; }
diff --git a/doc/webserver/testplan.html b/doc/webserver/testplan.html
new file mode 100644 (file)
index 0000000..050a66d
--- /dev/null
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/testplan.html,v $
+
+ Purpose     :  Provide guideance to test before release
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: testplan.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|Testplan</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>Testplan for releases:</h1>
+<p>
+<ol>
+  <li>Remove any existing rpm with rpm -e
+  <li>Remove any file that was left over. This includes (but is not limited
+      to)
+      <ul>
+       <li>/var/log/junkbuster
+       <li>/etc/junkbuster
+       <li>/usr/sbin/junkbuster
+       <li>/etc/init.d/junkbuster
+       <li>/usr/doc/junkbuster*
+      </ul>
+  <li>Install the rpm. Any error messages?
+  <li>start,stop,status junkbuster with the specific script
+      (e.g. /etc/rc.d/init/junkbuster stop). Reboot your machine. Does
+      autostart work?
+  <li>Start browsing. Does the junkbuster work? Logfile written?
+  <li>Remove the rpm. Any error messages? All files removed?
+</ol>
+
+<h1>Test reports:</h1>
+<p>
+Please submit test reports only with the <a href="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005">test form</a>
+at sourceforge. Three simple steps:
+<ul>
+  <li>Select category: the distribution you test on.
+  <li>Select group: the version of Junkbuster that we are about to release.
+  <li>Fill the Summary and Detailed Description with something intelligent
+      (keep it short and precise).
+</ul>
+<p>
+Do not mail to the mailinglist (we cannot keep track on issues there).
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:44 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ $Log: testplan.html,v $
+ Revision 1.1  2001/06/13 14:20:37  swa
+ first import of project's documentation for the webserver.
+
+-->
+</html>
diff --git a/doc/webserver/user-manual.html b/doc/webserver/user-manual.html
new file mode 100644 (file)
index 0000000..e90fad3
--- /dev/null
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/user-manual.html,v $
+
+ Purpose     :  User Manual
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: user-manual.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|User Manual</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>To be filled:</h1>
+<p>
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:43 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ $Log: user-manual.html,v $
+ Revision 1.1  2001/06/13 14:20:37  swa
+ first import of project's documentation for the webserver.
+
+-->
+</html>
index 09c7b5f..7e82acd 100644 (file)
--- a/encode.c
+++ b/encode.c
@@ -1,4 +1,4 @@
-const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
+const char encode_rcs[] = "$Id: encode.c,v 1.1.1.1 2001/05/15 13:58:51 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/encode.c,v $
@@ -7,7 +7,7 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
  *                encode cookies and HTML text.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -33,27 +33,6 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
  *
  * Revisions   :
  *    $Log: encode.c,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.5  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.4  2002/01/22 23:28:07  jongfoster
- *    Adding convenience function html_encode_and_free_original()
- *    Making all functions accept NULL paramaters - in this case, they
- *    simply return NULL.  This allows error-checking to be deferred.
- *
- *    Revision 1.3  2001/11/13 00:16:40  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.2  2001/05/17 22:52:35  oes
- *     - Cleaned CRLF's from the sources and related files
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:51  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -64,8 +43,8 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
 #include "config.h"
 
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
+#include <malloc.h>
 
 #include "encode.h"
 
@@ -176,20 +155,12 @@ static const char * const cookie_code_map[256] = {
  *
  * Returns     :  Encoded string, newly allocated on the heap. 
  *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
  *
  *********************************************************************/
 char * html_encode(const char *s)
 {
-   char * buf;
-   
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
    /* each input char can expand to at most 6 chars */
-   buf = (char *) malloc((strlen(s) * 6) + 1);
+   char * buf = (char *) malloc((strlen(s) * 6) + 1);
 
    if (buf)
    {
@@ -215,41 +186,6 @@ char * html_encode(const char *s)
    return(buf);
 }
 
-
-/*********************************************************************
- *
- * Function    :  html_encode_and_free_original
- *
- * Description :  Encodes a string so it's not interpreted as
- *                containing HTML tags or entities.
- *                Replaces <, >, &, and " with the appropriate HTML
- *                entities.  Free()s original string.
- *                If original string is NULL, simply returns NULL.
- *
- * Parameters  :
- *          1  :  s = String to encode.  Null-terminated.
- *
- * Returns     :  Encoded string, newly allocated on the heap. 
- *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
- *
- *********************************************************************/
-char * html_encode_and_free_original(char *s)
-{
-   char * result;
-   
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
-   result = html_encode(s);
-   free(s);
-
-   return result;
-}
-
-
 /*********************************************************************
  *
  * Function    :  cookie_encode
@@ -263,20 +199,12 @@ char * html_encode_and_free_original(char *s)
  *
  * Returns     :  Encoded string, newly allocated on the heap. 
  *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
  *
  *********************************************************************/
 char * cookie_encode(const char *s)
 {
-   char * buf;
-
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
    /* each input char can expand to at most 3 chars */
-   buf = (char *) malloc((strlen(s) * 3) + 1);
+   char * buf = (char *) malloc((strlen(s) * 3) + 1);
 
    if (buf)
    {
@@ -315,20 +243,12 @@ char * cookie_encode(const char *s)
  *
  * Returns     :  Encoded string, newly allocated on the heap. 
  *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
  *
  *********************************************************************/
 char * url_encode(const char *s)
 {
-   char * buf;
-
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
    /* each input char can expand to at most 3 chars */
-   buf = (char *) malloc((strlen(s) * 3) + 1);
+   char * buf = (char *) malloc((strlen(s) * 3) + 1);
 
    if (buf)
    {
@@ -368,7 +288,7 @@ char * url_encode(const char *s)
  * Returns     :  The integer value, or -1 for non-hex characters.
  *
  *********************************************************************/
-static int xdtoi(const int d)
+static int xdtoi(char d)
 {
    if ((d >= '0') && (d <= '9'))
    {
@@ -406,10 +326,10 @@ static int xtoi(const char *s)
 {
    int d1, d2;
 
-   d1 = xdtoi(*s);
+   d1 = xdtoi(*s++);
    if(d1 >= 0)
    {
-      d2 = xdtoi(*(s+1));
+      d2 = xdtoi(*s);
       if(d2 >= 0)
       {
          return (d1 << 4) + d2;
@@ -451,7 +371,7 @@ char *url_decode(const char * s)
                break;
 
             case '%':
-               if ((*q = xtoi(s + 1)) != '\0')
+               if ((*q = xtoi(s + 1)))
                {
                   s += 3;
                   q++;
index 875b966..ba0b6cf 100644 (file)
--- a/encode.h
+++ b/encode.h
@@ -1,15 +1,15 @@
-#ifndef ENCODE_H_INCLUDED
-#define ENCODE_H_INCLUDED
-#define ENCODE_H_VERSION "$Id: encode.h,v 1.4 2002/03/24 13:25:43 swa Exp $"
+#ifndef _ENCODE_H
+#define _ENCODE_H
+#define ENCODE_H_VERSION "$Id: encode.h,v 1.1 2001/05/13 21:57:06 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/encode.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/encode.h,v $
  *
  * Purpose     :  Functions to encode and decode URLs, and also to
  *                encode cookies and HTML text.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: encode.h,v $
- *    Revision 1.4  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.3  2002/01/22 23:28:07  jongfoster
- *    Adding convenience function html_encode_and_free_original()
- *    Making all functions accept NULL paramaters - in this case, they
- *    simply return NULL.  This allows error-checking to be deferred.
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:58:51  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -63,8 +48,6 @@ extern char * cookie_encode(const char *s);
 extern char * url_encode(const char *s);
 extern char * url_decode(const char *str);
 
-extern char * html_encode_and_free_original(char *s);
-
 /* Revision control strings from this header and associated .c file */
 extern const char encode_rcs[];
 extern const char encode_h_rcs[];
@@ -73,7 +56,7 @@ extern const char encode_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef ENCODE_H_INCLUDED */
+#endif /* ndef _ENCODE_H */
 
 /*
   Local Variables:
index ec623b8..f069875 100644 (file)
--- a/errlog.c
+++ b/errlog.c
@@ -1,4 +1,4 @@
-const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
+const char errlog_rcs[] = "$Id: errlog.c,v 1.13 2001/07/13 13:58:58 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/errlog.c,v $
@@ -7,7 +7,7 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
  *                printf-like fashion.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -33,89 +33,6 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
  *
  * Revisions   :
  *    $Log: errlog.c,v $
- *    Revision 1.36  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.35  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.34  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.33  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.32  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.31  2002/03/06 23:02:57  jongfoster
- *    Removing tabs
- *
- *    Revision 1.30  2002/03/05 22:43:45  david__schmidt
- *    - Better error reporting on OS/2
- *    - Fix double-slash comment (oops)
- *
- *    Revision 1.29  2002/03/04 23:45:13  jongfoster
- *    Printing thread ID if using Win32 native threads
- *
- *    Revision 1.28  2002/03/04 17:59:59  oes
- *    Deleted deletePidFile(), cosmetics
- *
- *    Revision 1.27  2002/03/04 02:08:01  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.26  2002/01/09 19:05:45  steudten
- *    Fix big memory leak.
- *
- *    Revision 1.25  2002/01/09 14:32:08  oes
- *    Added support for gmtime_r and localtime_r.
- *
- *    Revision 1.24  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.23  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.22  2001/11/05 23:43:05  steudten
- *    Add time+date to log files.
- *
- *    Revision 1.21  2001/10/25 03:40:47  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.20  2001/09/16 23:04:34  jongfoster
- *    Fixing a warning
- *
- *    Revision 1.19  2001/09/13 20:08:06  jongfoster
- *    Adding support for LOG_LEVEL_CGI
- *
- *    Revision 1.18  2001/09/10 11:27:24  oes
- *    Declaration of w32_socket_strerr now conditional
- *
- *    Revision 1.17  2001/09/10 10:17:13  oes
- *    Removed unused variable; Fixed sprintf format
- *
- *    Revision 1.16  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.15  2001/07/29 17:41:10  jongfoster
- *    Now prints thread ID for each message (pthreads only)
- *
- *    Revision 1.14  2001/07/19 19:03:48  haroon
- *    - Added case for LOG_LEVEL_POPUPS
- *
  *    Revision 1.13  2001/07/13 13:58:58  oes
  *     - Added case for LOG_LEVEL_DEANIMATE
  *     - Removed all #ifdef PCRS
@@ -206,22 +123,18 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
 \f
 
 #include "config.h"
-#include "miscutil.h"
 
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
-#endif /* !defined(_WIN32) && !defined(__OS2__) */
+#endif /* ndef _WIN32 */
 
 #include <errno.h>
-#include <assert.h>
-#ifdef FEATURE_PTHREAD
-#include <pthread.h>
-#endif /* def FEATURE_PTHREAD */
+/* #include <pthread.h> */
 
 #ifdef _WIN32
 #include <windows.h>
@@ -230,15 +143,8 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
 #endif /* ndef _WIN_CONSOLE */
 #endif /* def _WIN32 */
 
-#ifdef __OS2__
-#include <sys/socket.h> /* For sock_errno */
-#define INCL_DOS
-#include <os2.h>
-#endif
-
 #include "errlog.h"
 #include "project.h"
-#include "jcc.h"
 
 const char errlog_h_rcs[] = ERRLOG_H_VERSION;
 
@@ -253,14 +159,16 @@ const char errlog_h_rcs[] = ERRLOG_H_VERSION;
 /* where to log (default: stderr) */
 static FILE *logfp = NULL;
 
+/* where to log (NULL == stderr) */
+static char * logfilename = NULL;
+
 /* logging detail level.  */
 static int debug = (LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO);  
 
 /* static functions */
 static void fatal_error(const char * error_message);
-#ifdef _WIN32
-static char *w32_socket_strerr(int errcode, char *tmp_buf);
-#endif
+static char * w32_socket_strerr(int errcode, char * tmp_buf);
+
 
 /*********************************************************************
  *
@@ -279,7 +187,7 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf);
 static void fatal_error(const char * error_message)
 {
 #if defined(_WIN32) && !defined(_WIN_CONSOLE)
-   MessageBox(g_hwndLogFrame, error_message, "Privoxy Error", 
+   MessageBox(g_hwndLogFrame, error_message, "Internet JunkBuster Error", 
       MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);  
 
    /* Cleanup - remove taskbar icon etc. */
@@ -289,17 +197,13 @@ static void fatal_error(const char * error_message)
    fputs(error_message, stderr);
 #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */
 
-#if defined(unix)
-   unlink(pidfile);
-#endif /* unix */
-
    exit(1);
 }
 
 
 /*********************************************************************
  *
- * Function    :  init_error_log
+ * Function    :  init_errlog
  *
  * Description :  Initializes the logging module.  Must call before
  *                calling log_error.
@@ -323,7 +227,6 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
 
    if ((logfp != NULL) && (logfp != stderr))
    {
-      log_error(LOG_LEVEL_INFO, "(Re-)Open logfile %s", logfname ? logfname : "none");
       fclose(logfp);
    }
    logfp = stderr;
@@ -331,9 +234,9 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
    /* set the designated log file */
    if( logfname )
    {
-      if( NULL == (fp = fopen(logfname, "a")) )
+      if( !(fp = fopen(logfname, "a")) )
       {
-         log_error(LOG_LEVEL_FATAL, "init_error_log(): can't open logfile: %s", logfname);
+         log_error(LOG_LEVEL_FATAL, "init_errlog(): can't open logfile: %s", logfname);
       }
 
       /* set logging to be completely unbuffered */
@@ -342,7 +245,7 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
       logfp = fp;
    }
 
-   log_error(LOG_LEVEL_INFO, "Privoxy version " VERSION);
+   log_error(LOG_LEVEL_INFO, "Internet JunkBuster version " VERSION);
    if (prog_name != NULL)
    {
       log_error(LOG_LEVEL_INFO, "Program name: %s", prog_name);
@@ -370,15 +273,10 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
 void log_error(int loglevel, char *fmt, ...)
 {
    va_list ap;
-   char *outbuf= NULL;
-   static char *outbuf_save = NULL;
+   char outbuf[BUFFER_SIZE];
    char * src = fmt;
    int outc = 0;
    long this_thread = 1;  /* was: pthread_t this_thread;*/
-#ifdef __OS2__
-   PTIB     ptib;
-   APIRET   ulrc;
-#endif /* __OS2__ */
 
 #if defined(_WIN32) && !defined(_WIN_CONSOLE)
    /*
@@ -399,95 +297,58 @@ void log_error(int loglevel, char *fmt, ...)
    }
 
    /* FIXME get current thread id */
-#ifdef FEATURE_PTHREAD
-   this_thread = (long)pthread_self();
-#elif defined(_WIN32)
-   this_thread = GetCurrentThreadId();
-#elif defined(__OS2__)
-   ulrc = DosGetInfoBlocks(&ptib, NULL);
-   if (ulrc == 0)
-     this_thread = ptib -> tib_ptib2 -> tib2_ultid;
-#endif /* def FEATURE_PTHREAD */
-
-   if ( !outbuf_save ) 
-   {
-      outbuf_save = outbuf = (char*)malloc(BUFFER_SIZE);
-      assert(outbuf);
-   }
-   outbuf = outbuf_save;
-
-    {
-       /*
-        * Write timestamp into tempbuf.
-        *
-        * Complex because not all OSs have tm_gmtoff or
-        * the %z field in strftime()
-        */
-       time_t now; 
-       struct tm tm_now; 
-       time (&now);
-#ifdef HAVE_LOCALTIME_R
-       tm_now = *localtime_r(&now, &tm_now);
-#else
-       tm_now = *localtime (&now); 
-#endif
-       strftime(outbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); 
-       outbuf += strlen( outbuf );
-    }
+   /* this_thread = (long)pthread_self(); */
+
    switch (loglevel)
    {
       case LOG_LEVEL_ERROR:
-         outc = sprintf(outbuf, "Privoxy(%ld) Error: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Error: ", this_thread);
          break;
       case LOG_LEVEL_FATAL:
-         outc = sprintf(outbuf, "Privoxy(%ld) Fatal error: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Fatal error: ", this_thread);
          break;
       case LOG_LEVEL_GPC:
-         outc = sprintf(outbuf, "Privoxy(%ld) Request: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Request: ", this_thread);
          break;
       case LOG_LEVEL_CONNECT:
-         outc = sprintf(outbuf, "Privoxy(%ld) Connect: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Connect: ", this_thread);
          break;
       case LOG_LEVEL_LOG:
-         outc = sprintf(outbuf, "Privoxy(%ld) Writing: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Writing: ", this_thread);
          break;
       case LOG_LEVEL_HEADER:
-         outc = sprintf(outbuf, "Privoxy(%ld) Header: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Header: ", this_thread);
          break;
       case LOG_LEVEL_INFO:
-         outc = sprintf(outbuf, "Privoxy(%ld) Info: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Info: ", this_thread);
          break;
       case LOG_LEVEL_RE_FILTER:
-         outc = sprintf(outbuf, "Privoxy(%ld) Re-Filter: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Re-Filter: ", this_thread);
          break;
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
       case LOG_LEVEL_FORCE:
-         outc = sprintf(outbuf, "Privoxy(%ld) Force: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Force: ", this_thread);
          break;
-#endif /* def FEATURE_FORCE_LOAD */
-#ifdef FEATURE_FAST_REDIRECTS
+#endif /* def FORCE_LOAD */
+#ifdef FAST_REDIRECTS
       case LOG_LEVEL_REDIRECTS:
-         outc = sprintf(outbuf, "Privoxy(%ld) Redirect: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Redirect: ", this_thread);
          break;
-#endif /* def FEATURE_FAST_REDIRECTS */
+#endif /* def FAST_REDIRECTS */
       case LOG_LEVEL_DEANIMATE:
-         outc = sprintf(outbuf, "Privoxy(%ld) Gif-Deanimate: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Gif-Deanimate: ", this_thread);
          break;
       case LOG_LEVEL_CLF:
-         outbuf = outbuf_save;
          outc = 0;
          outbuf[0] = '\0';
          break;
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
       case LOG_LEVEL_POPUPS:
-         outc = sprintf(outbuf, "Privoxy(%ld) Kill-Popups: ", this_thread);
-         break;
-#endif /* def FEATURE_KILL_POPUPS */
-      case LOG_LEVEL_CGI:
-         outc = sprintf(outbuf, "Privoxy(%ld) CGI: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Kill-Popups: ", this_thread);
          break;
+#endif /* def KILLPOPUPS */
       default:
-         outc = sprintf(outbuf, "Privoxy(%ld) UNKNOWN LOG TYPE(%d): ", this_thread, loglevel);
+         outc = sprintf(outbuf, "IJB(%d) UNKNOWN LOG TYPE(%d): ", this_thread, loglevel);
          break;
    }
    
@@ -498,7 +359,7 @@ void log_error(int loglevel, char *fmt, ...)
    while ((*src) && (outc < BUFFER_SIZE-2))
    {
       char tempbuf[BUFFER_SIZE];
-      char *sval = NULL;
+      char *sval;
       int ival;
       unsigned uval;
       long lval;
@@ -562,7 +423,7 @@ void log_error(int loglevel, char *fmt, ...)
             else
             {
                /* Error */
-               sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n"
+               sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n"
                                "Format = \"%s\"\n"
                                "Exiting.", this_thread, fmt);
                /* FIXME RACE HAZARD: should start critical section error_log_use here */
@@ -619,7 +480,7 @@ void log_error(int loglevel, char *fmt, ...)
             outc += ival;
             if (outc < BUFFER_SIZE-1)
             {
-               memcpy(outbuf + oldoutc, sval, (size_t) ival);
+               memcpy(outbuf + oldoutc, sval, ival);
             }
             else
             {
@@ -631,11 +492,6 @@ void log_error(int loglevel, char *fmt, ...)
 #ifdef _WIN32
             ival = WSAGetLastError();
             sval = w32_socket_strerr(ival, tempbuf);
-#elif __OS2__
-            ival = sock_errno();
-            if (ival == 0)
-              ival = errno;
-            sval = strerror(ival);
 #else /* ifndef _WIN32 */
             ival = errno; 
 #ifdef HAVE_STRERROR
@@ -671,22 +527,11 @@ void log_error(int loglevel, char *fmt, ...)
                 */
                time_t now; 
                struct tm *tm_now; 
-               struct tm gmt;
-#ifdef HAVE_LOCALTIME_R
-               struct tm dummy;
-#endif
+               struct tm gmt; 
                int days, hrs, mins; 
                time (&now); 
-#ifdef HAVE_GMTIME_R
-               gmt = *gmtime_r(&now, &gmt);
-#else
-               gmt = *gmtime(&now);
-#endif
-#ifdef HAVE_LOCALTIME_R
-               tm_now = localtime_r(&now, &dummy);
-#else
+               gmt = *gmtime (&now); 
                tm_now = localtime (&now); 
-#endif
                days = tm_now->tm_yday - gmt.tm_yday; 
                hrs = ((days < -1 ? 24 : 1 < days ? -24 : days * 24) + tm_now->tm_hour - gmt.tm_hour); 
                mins = hrs * 60 + tm_now->tm_min - gmt.tm_min; 
@@ -705,7 +550,7 @@ void log_error(int loglevel, char *fmt, ...)
             }
             break;
          default:
-            sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n"
+            sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n"
                             "Format = \"%s\"\n"
                             "Exiting.", this_thread, fmt);
             /* FIXME RACE HAZARD: should start critical section error_log_use here */
@@ -713,9 +558,9 @@ void log_error(int loglevel, char *fmt, ...)
             {
                logfp = stderr;
             }
-            fputs(outbuf_save, logfp);
+            fputs(outbuf, logfp);
             /* FIXME RACE HAZARD: should end critical section error_log_use here */
-            fatal_error(outbuf_save);
+            fatal_error(outbuf);
             /* Never get here */
             break;
 
@@ -759,11 +604,11 @@ void log_error(int loglevel, char *fmt, ...)
       logfp = stderr;
    }
 
-   fputs(outbuf_save, logfp);
+   fputs(outbuf, logfp);
 
    if (loglevel == LOG_LEVEL_FATAL)
    {
-      fatal_error(outbuf_save);
+      fatal_error(outbuf);
       /* Never get here */
    }
 
@@ -771,7 +616,7 @@ void log_error(int loglevel, char *fmt, ...)
 
 #if defined(_WIN32) && !defined(_WIN_CONSOLE)
    /* Write to display */
-   LogPutString(outbuf_save);
+   LogPutString(outbuf);
 #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */
 
 }
@@ -795,7 +640,7 @@ void log_error(int loglevel, char *fmt, ...)
  *                tmp_buf.
  *
  *********************************************************************/
-static char *w32_socket_strerr(int errcode, char *tmp_buf)
+static char * w32_socket_strerr(int errcode, char * tmp_buf)
 {
 #define TEXT_FOR_ERROR(code,text) \
    if (errcode == code)           \
@@ -872,3 +717,4 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf)
   tab-width: 3
   end:
 */
+
index c3424dd..d5edaae 100644 (file)
--- a/errlog.h
+++ b/errlog.h
@@ -1,6 +1,6 @@
-#ifndef ERRLOG_H_INCLUDED
-#define ERRLOG_H_INCLUDED
-#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.12 2002/03/24 13:25:43 swa Exp $"
+#ifndef _ERRLOG_H
+#define _ERRLOG_H
+#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.6 2001/07/13 13:59:22 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/errlog.h,v $
@@ -9,7 +9,7 @@
  *                printf-like fashion.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: errlog.h,v $
- *    Revision 1.12  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.11  2002/03/06 23:02:57  jongfoster
- *    Removing tabs
- *
- *    Revision 1.10  2001/09/13 20:08:06  jongfoster
- *    Adding support for LOG_LEVEL_CGI
- *
- *    Revision 1.9  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.7  2001/07/19 19:02:53  haroon
- *    Added define for LOG_LEVEL_POPUPS
- *
  *    Revision 1.6  2001/07/13 13:59:22  oes
  *     - Added LOG_LEVEL_DEANIMATE
  *     - Changed LOG_LEVEL_CLF
@@ -135,21 +113,19 @@ extern "C" {
 #define LOG_LEVEL_IO         0x0004
 #define LOG_LEVEL_HEADER     0x0008
 #define LOG_LEVEL_LOG        0x0010
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
 #define LOG_LEVEL_FORCE      0x0020
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
 #define LOG_LEVEL_RE_FILTER  0x0040
-#ifdef FEATURE_FAST_REDIRECTS
+#ifdef FAST_REDIRECTS
 #define LOG_LEVEL_REDIRECTS  0x0080
-#endif /* def FEATURE_FAST_REDIRECTS */
+#endif /* def FAST_REDIRECTS */
 #define LOG_LEVEL_DEANIMATE  0x0100
 
 #define LOG_LEVEL_CLF        0x0200 /* Common Log File format */
-#ifdef FEATURE_KILL_POPUPS
-#define LOG_LEVEL_POPUPS     0x0400 /* Kill Popups */
-#endif /* def FEATURE_KILL_POPUPS */
-
-#define LOG_LEVEL_CGI   0x0800 /* CGI / templates */
+#ifdef KILLPOPUPS
+#define LOG_LEVEL_POPUPS       0x0400 /* Kill Popups */
+#endif /* def KILLPOPUPS */
 
 /* Following are always on: */
 #define LOG_LEVEL_INFO    0x1000
@@ -167,7 +143,7 @@ extern const char errlog_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef ERRLOG_H_INCLUDED */
+#endif /* ndef _ERRLOG_H */
 
 /*
   Local Variables:
index 6f16d84..cc06229 100644 (file)
--- a/filters.c
+++ b/filters.c
@@ -1,4 +1,4 @@
-const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.21 2001/07/13 13:59:53 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/filters.c,v $
@@ -6,19 +6,19 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster
  * Purpose     :  Declares functions to parse/crunch headers and pages.
  *                Functions declared include:
  *                   `acl_addr', `add_stats', `block_acl', `block_imageurl',
- *                   `block_url', `url_actions', `domain_split',
+ *                   `block_url', `url_actions', `domaincmp', `dsplit',
  *                   `filter_popups', `forward_url', 'redirect_url',
  *                   `ij_untrusted_url', `intercept_url', `pcrs_filter_respose',
- *                   'ijb_send_banner', and `trust_url'
+ *                   `show_proxy_args', 'ijb_send_banner', and `trust_url'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -38,158 +38,6 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster
  *
  * Revisions   :
  *    $Log: filters.c,v $
- *    Revision 1.52  2002/03/24 16:35:57  jongfoster
- *    Removing logo
- *
- *    Revision 1.51  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.50  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.49  2002/03/16 20:29:14  oes
- *    Cosmetics
- *
- *    Revision 1.48  2002/03/13 20:25:34  oes
- *    Better logging for content filters
- *
- *    Revision 1.47  2002/03/13 00:30:52  jongfoster
- *    Killing warnings
- *    Added option of always sending redirect for imageblock,
- *    currently disabled with #if 0.
- *
- *    Revision 1.46  2002/03/12 01:42:49  oes
- *    Introduced modular filters
- *
- *    Revision 1.45  2002/03/08 16:47:50  oes
- *    Added choice beween GIF and PNG built-in images
- *
- *    Revision 1.44  2002/03/07 03:49:31  oes
- *     - Fixed compiler warnings etc
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.43  2002/01/22 23:51:59  jongfoster
- *    Replacing strsav() with the safer string_append().
- *
- *    Adding missing html_encode() to error message generators.  Where encoded
- *    and unencoded versions of a string were provided, removing the unencoded
- *    one.
- *
- *    Revision 1.42  2002/01/17 21:00:32  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Using a single, simple url_match(pattern,url) function - rather than
- *    the 3-line match routine which was repeated all over the place.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Using parse_http_url() to parse URLs without faking a HTTP
- *    request line for parse_http_request().
- *
- *    Revision 1.41  2001/11/13 00:14:07  jongfoster
- *    Fixing stupid bug now I've figured out what || means.
- *    (It always returns 0 or 1, not one of it's paramaters.)
- *
- *    Revision 1.40  2001/10/26 17:37:55  oes
- *    - Re-enabled Netscape 200/404 bug workaround in block_url():
- *      - Removed OS/2 special case
- *      - Made block_url() independant from sed() having been run
- *    - Made trust_url independant from sed() having been run
- *    - Made is_imageurl independant from sed() having been run.
- *      It now checks User-Agent: and Accept: by itself.
- *
- *
- *    Revision 1.39  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.38  2001/10/23 21:32:33  jongfoster
- *    Adding error-checking to selected functions
- *
- *    Revision 1.37  2001/10/22 15:33:56  david__schmidt
- *    Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in
- *    filters.c.  Added a FIXME in front of the offending code.  I'll gladly
- *    put in a better/more robust fix for all parties if one is presented...
- *    It seems that just returning 200 instead of 404 would pretty much fix
- *    it for everyone, but I don't know all the history of the problem.
- *
- *    Revision 1.36  2001/10/10 16:44:16  oes
- *    Added match_portlist function
- *
- *    Revision 1.35  2001/10/07 15:41:23  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    New function remove_chunked_transfer_coding that strips chunked
- *      transfer coding to plain and is called by pcrs_filter_response
- *      and gif_deanimate_response if neccessary
- *
- *    Improved handling of zero-change re_filter runs
- *
- *    pcrs_filter_response and gif_deanimate_response now remove
- *      chunked transfer codeing before processing the body.
- *
- *    Revision 1.34  2001/09/20 15:49:36  steudten
- *
- *    Fix BUG: Change int size to size_t size in pcrs_filter_response().
- *    See cgi.c fill_template().
- *
- *    Revision 1.33  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.32  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.31  2001/09/16 11:38:02  jongfoster
- *    Splitting fill_template() into 2 functions:
- *    template_load() loads the file
- *    template_fill() performs the PCRS regexps.
- *    This is because the CGI edit interface has a "table row"
- *    template which is used many times in the page - this
- *    change means it's only loaded from disk once.
- *
- *    Revision 1.30  2001/09/16 11:00:10  jongfoster
- *    New function alloc_http_response, for symmetry with free_http_response
- *
- *    Revision 1.29  2001/09/13 23:32:40  jongfoster
- *    Moving image data to cgi.c rather than cgi.h
- *    Fixing a GPF under Win32 (and any other OS that protects global
- *    constants from being written to).
- *
- *    Revision 1.28  2001/09/10 10:18:51  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.27  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.26  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.25  2001/07/26 10:09:46  oes
- *    Made browser detection a little less naive
- *
- *    Revision 1.24  2001/07/25 17:22:51  oes
- *    Added workaround for Netscape bug that prevents display of page when loading a component fails.
- *
- *    Revision 1.23  2001/07/23 13:40:12  oes
- *    Fixed bug that caused document body to be dropped when pcrs joblist was empty.
- *
- *    Revision 1.22  2001/07/18 12:29:34  oes
- *    - Made gif_deanimate_response respect
- *      csp->action->string[ACTION_STRING_DEANIMATE]
- *    - Logging cosmetics
- *
  *    Revision 1.21  2001/07/13 13:59:53  oes
  *     - Introduced gif_deanimate_response which shares the
  *       generic content modification interface of pcrs_filter_response
@@ -386,26 +234,23 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster
 #include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
-#include <assert.h>
 
 #ifndef _WIN32
-#ifndef __OS2__
 #include <unistd.h>
-#endif /* ndef __OS2__ */
 #include <netinet/in.h>
 #else
 #include <winsock2.h>
-#endif /* ndef _WIN32 */
-
-#ifdef __OS2__
-#include <utils.h>
-#endif /* def __OS2__ */
+#endif
 
 #include "project.h"
 #include "filters.h"
 #include "encode.h"
+#include "jcc.h"
+#include "showargs.h"
 #include "parsers.h"
 #include "ssplit.h"
+#include "gateway.h"
+#include "jbsockets.h"
 #include "errlog.h"
 #include "jbsockets.h"
 #include "miscutil.h"
@@ -413,7 +258,6 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster
 #include "cgi.h"
 #include "list.h"
 #include "deanimate.h"
-#include "urlmatch.h"
 
 #ifdef _WIN32
 #include "win32.h"
@@ -431,7 +275,7 @@ const char filters_h_rcs[] = FILTERS_H_VERSION;
 #define ijb_isdigit(__X) isdigit((int)(unsigned char)(__X))
 
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
 /*********************************************************************
  *
  * Function    :  block_acl
@@ -496,7 +340,7 @@ int block_acl(struct access_control_addr *dst, struct client_state *csp)
  *
  * Function    :  acl_addr
  *
- * Description :  Called from `load_config' to parse an ACL address.
+ * Description :  Called from `load_aclfile' to parse an ACL address.
  *
  * Parameters  :
  *          1  :  aspec = String specifying ACL address.
@@ -513,7 +357,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
    masklength = 32;
    port       =  0;
 
-   if ((p = strchr(aspec, '/')) != NULL)
+   if ((p = strchr(aspec, '/')))
    {
       *p++ = '\0';
 
@@ -529,7 +373,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
       return(-1);
    }
 
-   if ((p = strchr(aspec, ':')) != NULL)
+   if ((p = strchr(aspec, ':')))
    {
       *p++ = '\0';
 
@@ -544,8 +388,9 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
 
    aca->addr = ntohl(resolve_hostname_to_ip(aspec));
 
-   if (aca->addr == INADDR_NONE)
+   if (aca->addr == -1)
    {
+      log_error(LOG_LEVEL_ERROR, "can't resolve address for %s", aspec);
       return(-1);
    }
 
@@ -564,87 +409,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
    return(0);
 
 }
-#endif /* def FEATURE_ACL */
-
-
-/*********************************************************************
- *
- * Function    :  match_portlist
- *
- * Description :  Check if a given number is covered by a comma
- *                separated list of numbers and ranges (a,b-c,d,..)
- *
- * Parameters  :
- *          1  :  portlist = String with list
- *          2  :  port = port to check
- *
- * Returns     :  0 => no match
- *                1 => match
- *
- *********************************************************************/
-int match_portlist(const char *portlist, int port)
-{
-   char *min, *max, *next, *portlist_copy;
-
-   min = next = portlist_copy = strdup(portlist);
-
-   /*
-    * Zero-terminate first item and remember offset for next
-    */
-   if (NULL != (next = strchr(portlist_copy, (int) ',')))
-   {
-      *next++ = '\0';
-   }
-
-   /*
-    * Loop through all items, checking for match
-    */
-   while(min)
-   {
-      if (NULL == (max = strchr(min, (int) '-')))
-      {
-         /*
-          * No dash, check for equality
-          */
-         if (port == atoi(min))
-         {
-            free(portlist_copy);
-            return(1);
-         }
-      }
-      else
-      {
-         /*
-          * This is a range, so check if between min and max,
-          * or, if max was omitted, between min and 65K
-          */
-         *max++ = '\0';
-         if(port >= atoi(min) && port <= (atoi(max) ? atoi(max) : 65535))
-         {
-            free(portlist_copy);
-            return(1);
-         }
-
-      }
-
-      /*
-       * Jump to next item
-       */
-      min = next;
-
-      /*
-       * Zero-terminate next item and remember offset for n+1
-       */
-      if ((NULL != next) && (NULL != (next = strchr(next, (int) ','))))
-      {
-         *next++ = '\0';
-      }
-   }
-
-   free(portlist_copy);
-   return 0;
-
-}
+#endif /* def ACL_FILES */
 
 
 /*********************************************************************
@@ -661,188 +426,90 @@ int match_portlist(const char *portlist, int port)
  *********************************************************************/
 struct http_response *block_url(struct client_state *csp)
 {
-#ifdef FEATURE_IMAGE_BLOCKING
    char *p;
-#endif /* def FEATURE_IMAGE_BLOCKING */
    struct http_response *rsp;
+   struct map *exports = NULL;
 
-   /*
+   /* 
     * If it's not blocked, don't block it ;-)
     */
    if ((csp->action->flags & ACTION_BLOCK) == 0)
    {
-      return NULL;
+      return(NULL);
    }
 
-   /*
+   /* 
     * Else, prepare a response
     */
-   if (NULL == (rsp = alloc_http_response()))
+   if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp))))
    {
-      return cgi_error_memory();
+      return NULL;
    }
 
    /*
     * If it's an image-url, send back an image or redirect
     * as specified by the relevant +image action
     */
-#ifdef FEATURE_IMAGE_BLOCKING
+#ifdef IMAGE_BLOCKING
    if (((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0)
         && is_imageurl(csp))
    {
       /* determine HOW images should be blocked */
       p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER];
 
-#if 1 /* Two alternative strategies, use this one for now: */
-
       /* and handle accordingly: */
-      if ((p == NULL) || (0 == strcmpic(p, "pattern")))
+      if ((p == NULL) || (0 == strcmpic(p, "logo")))
       {
-         rsp->body = bindup(image_pattern_data, image_pattern_length);
-         if (rsp->body == NULL)
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-         rsp->content_length = image_pattern_length;
-
-         if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE))
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
+         rsp->body = bindup(JBGIF, sizeof(JBGIF));
+         rsp->content_length = sizeof(JBGIF);
+         enlist_unique_header(rsp->headers, "Content-Type", "image/gif");
       }
 
       else if (0 == strcmpic(p, "blank"))
       {
-         rsp->body = bindup(image_blank_data, image_blank_length);
-         if (rsp->body == NULL)
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-         rsp->content_length = image_blank_length;
-
-         if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE))
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
+         rsp->body = bindup(BLANKGIF, sizeof(BLANKGIF));
+         rsp->content_length = sizeof(BLANKGIF);
+         enlist_unique_header(rsp->headers, "Content-Type", "image/gif");
       }
 
       else
       {
-         rsp->status = strdup("302 Local Redirect from Privoxy");
-         if (rsp->status == NULL)
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-
-         if (enlist_unique_header(rsp->headers, "Location", p))
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-      }
-
-#else /* Following code is disabled for now */
-
-      /* and handle accordingly: */
-      if ((p == NULL) || (0 == strcmpic(p, "pattern")))
-      {
-         p = CGI_PREFIX "send-banner?type=pattern";
-      }
-      else if (0 == strcmpic(p, "blank"))
-      {
-         p = CGI_PREFIX "send-banner?type=blank";
-      }
-      rsp->status = strdup("302 Local Redirect from Privoxy");
-      if (rsp->status == NULL)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
+         rsp->status = strdup("302 Local Redirect from Junkbuster");
+         enlist_unique_header(rsp->headers, "Location", p);
       }
-
-      if (enlist_unique_header(rsp->headers, "Location", p))
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-#endif /* Preceeding code is disabled for now */
-   }
+   }  
    else
-#endif /* def FEATURE_IMAGE_BLOCKING */
+#endif /* def IMAGE_BLOCKING */
 
-   /*
+   /* 
     * Else, generate an HTML "blocked" message:
     */
    {
-      jb_err err;
-      struct map * exports;
-
-      /*
-       * Workaround for stupid Netscape bug which prevents
-       * pages from being displayed if loading a referenced
-       * JavaScript or style sheet fails. So make it appear
-       * as if it succeeded.
-       */
-      if ( NULL != (p = get_header_value(csp->headers, "User-Agent:"))
-           && !strncmpic(p, "mozilla", 7) /* Catch Netscape but */
-           && !strstr(p, "Gecko")         /* save Mozilla, */
-           && !strstr(p, "compatible")    /* MSIE */
-           && !strstr(p, "Opera"))        /* and Opera. */
-      {
-         rsp->status = strdup("200 Request for blocked URL");
-      }
-      else
-      {
-         rsp->status = strdup("404 Request for blocked URL");
-      }
 
-      if (rsp->status == NULL)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-
-      exports = default_exports(csp, NULL);
-      if (exports == NULL)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-
-#ifdef FEATURE_FORCE_LOAD
-      err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
-      err = map_block_killer(exports, "force-support");
-#endif /* ndef FEATURE_FORCE_LOAD */
-
-      if (!err) err = map(exports, "hostport", 1, html_encode(csp->http->hostport), 0);
-      if (!err) err = map(exports, "path", 1, html_encode(csp->http->path), 0);
+      exports = default_exports(csp, NULL);       
+#ifdef FORCE_LOAD
+      exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
+#else
+      exports = map_block_killer(exports, "force-support");
+#endif /* ndef FORCE_LOAD */
 
-      if (err)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
+      exports = map(exports, "hostport", 1, csp->http->hostport, 1);
+      exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0);
+      exports = map(exports, "path", 1, csp->http->path, 1);
+      exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0);
 
-      err = template_fill_for_cgi(csp, "blocked", exports, rsp);
-      if (err)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
+      rsp->body = fill_template(csp, "blocked", exports);
+      free_map(exports);
+  
+      rsp->status = strdup("403 Request for blocked URL"); 
    }
 
-   return finish_http_response(rsp);
+   return(finish_http_response(rsp));
 
 }
 
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 /*********************************************************************
  *
  * Function    :  trust_url FIXME: I should be called distrust_url
@@ -859,12 +526,9 @@ struct http_response *block_url(struct client_state *csp)
 struct http_response *trust_url(struct client_state *csp)
 {
    struct http_response *rsp;
-   struct map * exports;
-   char buf[BUFFER_SIZE];
-   char *p;
-   struct url_spec **tl;
-   struct url_spec *t;
-   jb_err err;
+   struct map *exports = NULL;
+   char buf[BUFFER_SIZE], *p = NULL;
+   struct url_spec **tl, *t;
 
    /*
     * Don't bother to work on trusted URLs
@@ -874,120 +538,86 @@ struct http_response *trust_url(struct client_state *csp)
       return NULL;
    }
 
-   /*
+   /* 
     * Else, prepare a response:
     */
-   if (NULL == (rsp = alloc_http_response()))
+   if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp))))
    {
-      return cgi_error_memory();
+      return NULL;
    }
-
    exports = default_exports(csp, NULL);
-   if (exports == NULL)
-   {
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
 
-   /*
+   /* 
     * Export the host, port, and referrer information
     */
-   err = map(exports, "hostport", 1, csp->http->hostport, 1);
-   if (!err) err = map(exports, "path", 1, csp->http->path, 1);
+   exports = map(exports, "hostport", 1, csp->http->hostport, 1);
+   exports = map(exports, "path", 1, csp->http->path, 1);
+   exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0);
+   exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0);
 
-   if (NULL != (p = get_header_value(csp->headers, "Referer:")))
+   if (csp->referrer && strlen(csp->referrer) > 9)
    {
-      if (!err) err = map(exports, "referrer", 1, html_encode(p), 0);
+      exports = map(exports, "referrer", 1, csp->referrer + 9, 1);
+      exports = map(exports, "referrer-html", 1, html_encode(csp->referrer + 9), 0);
    }
    else
    {
-      if (!err) err = map(exports, "referrer", 1, "unknown", 1);
-   }
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
+      exports = map(exports, "referrer", 1, "unknown", 1);
+      exports = map(exports, "referrer-html", 1, "unknown", 1);
    }
 
    /*
     * Export the trust list
     */
-   p = strdup("");
-   for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++)
+   for (tl = csp->config->trust_list; (t = *tl) ; tl++)
    {
       sprintf(buf, "<li>%s</li>\n", t->spec);
-      string_append(&p, buf);
-   }
-   err = map(exports, "trusted-referrers", 1, p, 0);
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
+      p = strsav(p, buf);
    }
+   exports = map(exports, "trusted-referrers", 1, p, 0);
+   p = NULL;
 
    /*
     * Export the trust info, if available
     */
-   if (csp->config->trust_info->first)
+   if (csp->config->trust_info->next)
    {
-      struct list_entry *l;
+      struct list *l;
 
-      p = strdup("");
-      for (l = csp->config->trust_info->first; l ; l = l->next)
+      for (l = csp->config->trust_info->next; l ; l = l->next)
       {
          sprintf(buf, "<li> <a href=%s>%s</a><br>\n",l->str, l->str);
-         string_append(&p, buf);
+         p = strsav(p, buf);
       }
-      err = map(exports, "trust-info", 1, p, 0);
+      exports = map(exports, "trust-info", 1, p, 0);
    }
    else
    {
-      err = map_block_killer(exports, "have-trust-info");
-   }
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
+      exports = map_block_killer(exports, "have-trust-info");
    }
-
+   
    /*
     * Export the force prefix or the force conditional block killer
     */
-#ifdef FEATURE_FORCE_LOAD
-   err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
-   err = map_block_killer(exports, "force-support");
-#endif /* ndef FEATURE_FORCE_LOAD */
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
+#ifdef FORCE_LOAD
+   exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
+#else
+   exports = map_block_killer(exports, "force-support");
+#endif /* ndef FORCE_LOAD */
 
    /*
     * Build the response
     */
-   err = template_fill_for_cgi(csp, "untrusted", exports, rsp);
-   if (err)
-   {
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
+   rsp->body = fill_template(csp, "untrusted", exports);
+   free_map(exports);
+
+   return(finish_http_response(rsp));
 
-   return finish_http_response(rsp);
 }
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
-#ifdef FEATURE_FAST_REDIRECTS
+#ifdef FAST_REDIRECTS
 /*********************************************************************
  *
  * Function    :  redirect_url
@@ -1009,54 +639,50 @@ struct http_response *redirect_url(struct client_state *csp)
    p = q = csp->http->path;
    log_error(LOG_LEVEL_REDIRECTS, "checking path for redirects: %s", p);
 
-   /*
+   /* 
     * find the last URL encoded in the request
     */
-   while ((p = strstr(p, "http://")) != NULL)
+   while (p = strstr(p, "http://"))
    {
       q = p++;
    }
 
-   /*
+   /* 
     * if there was any, generate and return a HTTP redirect
     */
    if (q != csp->http->path)
    {
       log_error(LOG_LEVEL_REDIRECTS, "redirecting to: %s", q);
 
-      if (NULL == (rsp = alloc_http_response()))
+      if (NULL == ( rsp = zalloc(sizeof(*rsp))))
       {
-         return cgi_error_memory();
+         return NULL;
       }
 
-      if ( enlist_unique_header(rsp->headers, "Location", q)
-        || (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy"))) )
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
+      rsp->status = strdup("302 Local Redirect from Junkbuster");
+      enlist_unique_header(rsp->headers, "Location", q);
 
-      return finish_http_response(rsp);
+      return(finish_http_response(rsp));
    }
    else
    {
-      return NULL;
+      return(NULL);
    }
 
 }
-#endif /* def FEATURE_FAST_REDIRECTS */
+#endif /* def FAST_REDIRECTS */
 
 
-#ifdef FEATURE_IMAGE_BLOCKING
+#ifdef IMAGE_BLOCKING
 /*********************************************************************
  *
  * Function    :  is_imageurl
  *
  * Description :  Given a URL, decide whether it is an image or not,
  *                using either the info from a previous +image action
- *                or, #ifdef FEATURE_IMAGE_DETECT_MSIE, the info from
- *                the browser's accept header.
- *
+ *                or, #ifdef DETECT_MSIE_IMAGES, the info from the
+ *                browser's accept header.
+ *                
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
@@ -1066,34 +692,28 @@ struct http_response *redirect_url(struct client_state *csp)
  *********************************************************************/
 int is_imageurl(struct client_state *csp)
 {
-#ifdef FEATURE_IMAGE_DETECT_MSIE
-   char *tmp;
-
-   tmp = get_header_value(csp->headers, "User-Agent:");
-   if (tmp && strstr(tmp, "MSIE"))
+#ifdef DETECT_MSIE_IMAGES
+   if ((csp->accept_types 
+       & (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE|ACCEPT_TYPE_MSIE_HTML))
+       == (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE))
    {
-      tmp = get_header_value(csp->headers, "Accept:");
-      if (tmp && strstr(tmp, "image/gif"))
-      {
-         /* Client will accept HTML.  If this seems counterintuitive,
-          * blame Microsoft.
-          */
-         return(0);
-      }
-      else
-      {
-         return(1);
-      }
+      return 1;
+   }
+   else if ((csp->accept_types 
+       & (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE|ACCEPT_TYPE_MSIE_HTML))
+       == (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_HTML))
+   {
+      return 0;
    }
-#endif /* def FEATURE_IMAGE_DETECT_MSIE */
+#endif
 
    return ((csp->action->flags & ACTION_IMAGE) != 0);
 
 }
-#endif /* def FEATURE_IMAGE_BLOCKING */
+#endif /* def IMAGE_BLOCKING */
 
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef TRUST_FILES
 /*********************************************************************
  *
  * Function    :  is_untrusted_url
@@ -1115,221 +735,205 @@ int is_untrusted_url(struct client_state *csp)
 {
    struct file_list *fl;
    struct block_spec *b;
-   struct url_spec **trusted_url;
+   struct url_spec url[1], **tl, *t;
    struct http_request rhttp[1];
-   const char * referer;
-   jb_err err;
+   char *p, *h;
 
    /*
     * If we don't have a trustlist, we trust everybody
     */
    if (((fl = csp->tlist) == NULL) || ((b  = fl->f) == NULL))
    {
-      return 0;
+      return(0);
    }
 
-   memset(rhttp, '\0', sizeof(*rhttp));
 
    /*
     * Do we trust the request URL itself?
     */
+   *url = dsplit(csp->http->host);
+
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL) return(0);
+
+   memset(rhttp, '\0', sizeof(*rhttp));
+
    for (b = b->next; b ; b = b->next)
    {
-      if (url_match(b->url, csp->http))
+      if ((b->url->port == 0) || (b->url->port == csp->http->port))
       {
-         return b->reject;
+         if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0))
+         {
+            if ((b->url->path == NULL) ||
+#ifdef REGEX
+               (regexec(b->url->preg, csp->http->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(b->url->path, csp->http->path, b->url->pathlen) == 0)
+#endif
+            )
+            {
+               freez(url->dbuf);
+               freez(url->dvec);
+
+               if (b->reject == 0) return(0);
+
+               return(1);
+            }
+         }
       }
    }
 
-   if (NULL == (referer = get_header_value(csp->headers, "Referer:")))
+   freez(url->dbuf);
+   freez(url->dvec);
+
+   if ((csp->referrer == NULL)|| (strlen(csp->referrer) <= 9))
    {
       /* no referrer was supplied */
-      return 1;
+      return(1);
    }
 
-   /*
-    * If not, do we maybe trust its referrer?
+   /* forge a URL from the referrer so we can use
+    * convert_url() to parse it into its components.
     */
 
+   p = NULL;
+   p = strsav(p, "GET ");
+   p = strsav(p, csp->referrer + 9);   /* skip over "Referer: " */
+   p = strsav(p, " HTTP/1.0");
 
-   /*
-    * Parse the URL from the referrer
-    */
+   parse_http_request(p, rhttp, csp);
+   freez(p);
 
-   err = parse_http_url(referer, rhttp, csp);
-   if (err)
+   if (rhttp->cmd == NULL)
    {
-      return 1;
+      return(1);
    }
 
-   for (trusted_url = csp->config->trust_list; *trusted_url != NULL; trusted_url++)
-   {
-      if (url_match(*trusted_url, rhttp))
-      {
-         /* if the URL's referrer is from a trusted referrer, then
-          * add the target spec to the trustfile as an unblocked
-          * domain and return NULL (which means it's OK).
-          */
-
-         FILE *fp;
 
-         if (NULL != (fp = fopen(csp->config->trustfile, "a")))
-         {
-            char * path;
-            char * path_end;
-            char * new_entry = strdup("~");
+   /*
+    * If not, do we maybe trust its referrer?
+    */
+   *url = dsplit(rhttp->host);
 
-            string_append(&new_entry, csp->http->hostport);
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL) return(1);
 
-            path = csp->http->path;
-            if ( (path[0] == '/')
-              && (path[1] == '~')
-              && ((path_end = strchr(path + 2, '/')) != NULL))
+   for (tl = csp->config->trust_list; (t = *tl) ; tl++)
+   {
+      if ((t->port == 0) || (t->port == rhttp->port))
+      {
+         if ((t->domain[0] == '\0') || domaincmp(t, url) == 0)
+         {
+            if ((t->path == NULL) ||
+#ifdef REGEX
+               (regexec(t->preg, rhttp->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(t->path, rhttp->path, t->pathlen) == 0)
+#endif
+            )
             {
-               /* since this path points into a user's home space
-                * be sure to include this spec in the trustfile.
+               /* if the URL's referrer is from a trusted referrer, then
+                * add the target spec to the trustfile as an unblocked
+                * domain and return NULL (which means it's OK).
                 */
-               int path_len = path_end - path; /* save offset */
-               path = strdup(path); /* Copy string */
-               if (path != NULL)
+
+               FILE *fp;
+
+               freez(url->dbuf);
+               freez(url->dvec);
+
+               if ((fp = fopen(csp->config->trustfile, "a")))
                {
-                  path_end = path + path_len; /* regenerate ptr to new buffer */
-                  *(path_end + 1) = '\0'; /* Truncate path after '/' */
+                  h = NULL;
+
+                  h = strsav(h, "~");
+                  h = strsav(h, csp->http->hostport);
+
+                  p = csp->http->path;
+                  if ((*p++ == '/')
+                  && (*p++ == '~'))
+                  {
+                  /* since this path points into a user's home space
+                   * be sure to include this spec in the trustfile.
+                   */
+                     if ((p = strchr(p, '/')))
+                     {
+                        *p = '\0';
+                        h = strsav(h, csp->http->path); /* FIXME: p?! */
+                        h = strsav(h, "/");
+                     }
+                  }
+
+                  fprintf(fp, "%s\n", h);
+                  freez(h);
+                  fclose(fp);
                }
-               string_join(&new_entry, path);
-            }
-
-            if (new_entry != NULL)
-            {
-               fprintf(fp, "%s\n", new_entry);
-               free(new_entry);
-            }
-            else
-            {
-               /* FIXME: No way to handle out-of memory, so mostly ignoring it */
-               log_error(LOG_LEVEL_ERROR, "Out of memory adding pattern to trust file");
+               return(0);
             }
-
-            fclose(fp);
          }
-         return 0;
       }
    }
-   return 1;
+   return(1);
 }
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def TRUST_FILES */
 
 
 /*********************************************************************
  *
  * Function    :  pcrs_filter_response
  *
- * Description :  Ecexute all text substitutions from all applying
- *                +filter actions on the text buffer that's been accumulated
- *                in csp->iob->buf. If this changes the contents, set
- *                csp->content_length to the modified size and raise the
- *                CSP_FLAG_MODIFIED flag.
+ * Description :  Apply all the pcrs jobs from the joblist (re_filterfile)
+ *                to the text buffer that's been accumulated in 
+ *                csp->iob->buf and set csp->content_length to the modified
+ *                size.
  *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
  * Returns     :  a pointer to the (newly allocated) modified buffer.
- *                or NULL if there were no hits or something went wrong
- *
+ *                or NULL in case something went wrong
+ *                
  *********************************************************************/
 char *pcrs_filter_response(struct client_state *csp)
 {
    int hits=0;
-   size_t size;
+   int size = csp->iob->eod - csp->iob->cur;
 
    char *old = csp->iob->cur, *new = NULL;
    pcrs_job *job;
 
    struct file_list *fl;
    struct re_filterfile_spec *b;
-   struct list_entry *filtername;
 
-   /* 
-    * Sanity first
-    */
-   if (csp->iob->cur >= csp->iob->eod)
+   /* Sanity first ;-) */
+   if (size <= 0)
    {
       return(NULL);
    }
-   size = csp->iob->eod - csp->iob->cur;
 
-   if ( ( NULL == (fl = csp->rlist) ) || ( NULL == fl->f) )
+   if ( ( NULL == (fl = csp->rlist) ) || ( NULL == (b = fl->f) ) )
    {
       log_error(LOG_LEVEL_ERROR, "Unable to get current state of regexp filtering.");
       return(NULL);
    }
 
-   /*
-    * If the body has a "chunked" transfer-encoding,
-    * get rid of it first, adjusting size and iob->eod
-    */
-   if (csp->flags & CSP_FLAG_CHUNKED)
-   {
-      log_error(LOG_LEVEL_RE_FILTER, "Need to de-chunk first");
-      if (0 == (size = remove_chunked_transfer_coding(csp->iob->cur, size)))
-      {
-         return(NULL);
-      }
-      csp->iob->eod = csp->iob->cur + size;
-      csp->flags |= CSP_FLAG_MODIFIED;
-   }
+   log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) ...",
+              csp->http->hostport, csp->http->path, size);
 
-   /*
-    * For all applying +filter actions, look if a filter by that
-    * name exists and if yes, execute it's pcrs_joblist on the
-    * buffer.
-    */
-   for (b = fl->f; b; b = b->next)
+   /* Apply all jobs from the joblist */
+   for (job = b->joblist; NULL != job; job = job->next)
    {
-      for (filtername = csp->action->multi[ACTION_MULTI_FILTER]->first;
-           filtername ; filtername = filtername->next)
-      {
-         if (strcmp(b->name, filtername->str) == 0)
-         {
-            int current_hits = 0;
-
-            if ( NULL == b->joblist )
-            {
-               log_error(LOG_LEVEL_RE_FILTER, "Filter %s has empty joblist. Nothing to do.", b->name);
-               return(NULL);
-            }
-
-            log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) with filter %s...",
-                      csp->http->hostport, csp->http->path, size, b->name);
-
-            /* Apply all jobs from the joblist */
-            for (job = b->joblist; NULL != job; job = job->next)
-            {
-               current_hits += pcrs_execute(job, old, size, &new, &size);
-               if (old != csp->iob->cur) free(old);
-               old=new;
-            }
-
-            log_error(LOG_LEVEL_RE_FILTER, " ...produced %d hits (new size %d).", current_hits, size);
-            hits += current_hits;
-         }
-      }
+      hits += pcrs_execute(job, old, size, &new, &size);
+      if (old != csp->iob->cur) free(old);
+      old=new;
    }
 
-   /*
-    * If there were no hits, destroy our copy and let
-    * chat() use the original in csp->iob
-    */
-   if (!hits)
-   {
-      free(new);
-      return(NULL);
-   }
+   log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size);
 
-   csp->flags |= CSP_FLAG_MODIFIED;
    csp->content_length = size;
-   IOB_RESET(csp);
 
+   /* fwiw, reset the iob */
+   IOB_RESET(csp);
    return(new);
 
 }
@@ -1339,37 +943,22 @@ char *pcrs_filter_response(struct client_state *csp)
  *
  * Function    :  gif_deanimate_response
  *
- * Description :  Deanimate the GIF image that has been accumulated in
- *                csp->iob->buf, set csp->content_length to the modified
- *                size and raise the CSP_FLAG_MODIFIED flag.
+ * Description :  Deanimate the GIF image that has been accumulated in 
+ *                csp->iob->buf and set csp->content_length to the modified
+ *                size.
  *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
  * Returns     :  a pointer to the (newly allocated) modified buffer.
  *                or NULL in case something went wrong.
- *
+ *                
  *********************************************************************/
 char *gif_deanimate_response(struct client_state *csp)
 {
    struct binbuffer *in, *out;
    char *p;
-   size_t size = csp->iob->eod - csp->iob->cur;
-
-   /*
-    * If the body has a "chunked" transfer-encoding,
-    * get rid of it first, adjusting size and iob->eod
-    */
-   if (csp->flags & CSP_FLAG_CHUNKED)
-   {
-      log_error(LOG_LEVEL_DEANIMATE, "Need to de-chunk first");
-      if (0 == (size = remove_chunked_transfer_coding(csp->iob->cur, size)))
-      {
-         return(NULL);
-      }
-      csp->iob->eod = csp->iob->cur + size;
-      csp->flags |= CSP_FLAG_MODIFIED;
-   }
+   int size = csp->iob->eod - csp->iob->cur;
 
    if (  (NULL == (in =  (struct binbuffer *)zalloc(sizeof *in )))
       || (NULL == (out = (struct binbuffer *)zalloc(sizeof *out))) )
@@ -1390,80 +979,13 @@ char *gif_deanimate_response(struct client_state *csp)
    }
    else
    {
-      if ((int)size == out->offset)
-      {
-         log_error(LOG_LEVEL_DEANIMATE, "GIF not changed.");
-      }
-      else
-      {
-         log_error(LOG_LEVEL_DEANIMATE, "Success! GIF shrunk from %d bytes to %d.", size, out->offset);
-      }
+      log_error(LOG_LEVEL_DEANIMATE, "Success! GIF shrunk from %d bytes to %d.", size, out->offset);
       csp->content_length = out->offset;
-      csp->flags |= CSP_FLAG_MODIFIED;
       p = out->buffer;
       free(in);
       free(out);
       return(p);
-   }
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  remove_chunked_transfer_coding
- *
- * Description :  In-situ remove the "chunked" transfer coding as defined
- *                in rfc2616 from a buffer.
- *
- * Parameters  :
- *          1  :  buffer = Pointer to the text buffer
- *          2  :  size = Number of bytes to be processed
- *
- * Returns     :  The new size, i.e. the number of bytes from buffer which
- *                are occupied by the stripped body, or 0 in case something
- *                went wrong
- *
- *********************************************************************/
-int remove_chunked_transfer_coding(char *buffer, const size_t size)
-{
-   size_t newsize = 0;
-   unsigned int chunksize = 0;
-   char *from_p, *to_p;
-
-   assert(buffer);
-   from_p = to_p = buffer;
-
-   if (sscanf(buffer, "%x", &chunksize) != 1)
-   {
-      log_error(LOG_LEVEL_ERROR, "Invalid first chunksize while stripping \"chunked\" transfer coding");
-      return(0);
-   }
-
-   while (chunksize > 0)
-   {
-      if (NULL == (from_p = strstr(from_p, "\r\n")))
-      {
-         log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding");
-         return(0);
-      }
-      newsize += chunksize;
-      from_p += 2;
-
-      memmove(to_p, from_p, (size_t) chunksize);
-      to_p = buffer + newsize;
-      from_p += chunksize + 2;
-
-      if (sscanf(from_p, "%x", &chunksize) != 1)
-      {
-         log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding");
-         return(0);
-      }
-   }
-
-   /* FIXME: Should this get its own loglevel? */
-   log_error(LOG_LEVEL_RE_FILTER, "De-chunking successful. Shrunk from %d to %d\n", size, newsize);
-   return(newsize);
+   }  
 
 }
 
@@ -1481,7 +1003,7 @@ int remove_chunked_transfer_coding(char *buffer, const size_t size)
  * Returns     :  N/A
  *
  *********************************************************************/
-void url_actions(struct http_request *http,
+void url_actions(struct http_request *http, 
                  struct client_state *csp)
 {
    struct file_list *fl;
@@ -1513,23 +1035,48 @@ void url_actions(struct http_request *http,
  * Returns     :  N/A
  *
  *********************************************************************/
-void apply_url_actions(struct current_action_spec *action,
-                       struct http_request *http,
+void apply_url_actions(struct current_action_spec *action, 
+                       struct http_request *http, 
                        struct url_actions *b)
 {
+   struct url_spec url[1];
+
    if (b == NULL)
    {
       /* Should never happen */
       return;
    }
 
+   *url = dsplit(http->host);
+
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL)
+   {
+      return;
+   }
+
    for (b = b->next; NULL != b; b = b->next)
    {
-      if (url_match(b->url, http))
+      if ((b->url->port == 0) || (b->url->port == http->port))
       {
-         merge_current_action(action, b->action);
+         if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0))
+         {
+            if ((b->url->path == NULL) ||
+#ifdef REGEX
+               (regexec(b->url->preg, http->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(b->url->path, http->path, b->url->pathlen) == 0)
+#endif
+            )
+            {
+               merge_current_action(action, b->action);
+            }
+         }
       }
    }
+
+   freez(url->dbuf);
+   freez(url->dvec);
 }
 
 
@@ -1549,24 +1096,229 @@ void apply_url_actions(struct current_action_spec *action,
 const struct forward_spec * forward_url(struct http_request *http,
                                         struct client_state *csp)
 {
-   static const struct forward_spec fwd_default[1] = { FORWARD_SPEC_INITIALIZER };
+   static const struct forward_spec fwd_default[1] = { 0 }; /* All zeroes */
    struct forward_spec *fwd = csp->config->forward;
+   struct url_spec url[1];
 
    if (fwd == NULL)
    {
-      return fwd_default;
+      return(fwd_default);
+   }
+
+   *url = dsplit(http->host);
+
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL)
+   {
+      return(fwd_default);
    }
 
    while (fwd != NULL)
    {
-      if (url_match(fwd->url, http))
+      if ((fwd->url->port == 0) || (fwd->url->port == http->port))
       {
-         return fwd;
+         if ((fwd->url->domain[0] == '\0') || (domaincmp(fwd->url, url) == 0))
+         {
+            if ((fwd->url->path == NULL) ||
+#ifdef REGEX
+               (regexec(fwd->url->preg, http->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(fwd->url->path, http->path, fwd->url->pathlen) == 0)
+#endif
+            )
+            {
+               freez(url->dbuf);
+               freez(url->dvec);
+               return(fwd);
+            }
+         }
       }
       fwd = fwd->next;
    }
 
-   return fwd_default;
+   freez(url->dbuf);
+   freez(url->dvec);
+   return(fwd_default);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  dsplit
+ *
+ * Description :  Takes a domain and returns a pointer to a url_spec
+ *                structure populated with dbuf, dcnt and dvec.  The
+ *                other fields in the structure that is returned are zero.
+ *
+ * Parameters  :
+ *          1  :  domain = a URL address
+ *
+ * Returns     :  url_spec structure populated with dbuf, dcnt and dvec.
+ *
+ *********************************************************************/
+struct url_spec dsplit(char *domain)
+{
+   struct url_spec ret[1];
+   char *v[BUFFER_SIZE];
+   int size;
+   char *p;
+
+   memset(ret, '\0', sizeof(*ret));
+
+   if (domain[strlen(domain) - 1] == '.')
+   {
+      ret->unanchored |= ANCHOR_RIGHT;
+   }
+
+   if (domain[0] == '.')
+   {
+      ret->unanchored |= ANCHOR_LEFT;
+   }
+
+   ret->dbuf = strdup(domain);
+
+   /* map to lower case */
+   for (p = ret->dbuf; *p ; p++) *p = tolower(*p);
+
+   /* split the domain name into components */
+   ret->dcnt = ssplit(ret->dbuf, ".", v, SZ(v), 1, 1);
+
+   if (ret->dcnt <= 0)
+   {
+      memset(ret, '\0', sizeof(ret));
+      return(*ret);
+   }
+
+   /* save a copy of the pointers in dvec */
+   size = ret->dcnt * sizeof(*ret->dvec);
+
+   if ((ret->dvec = (char **)malloc(size)))
+   {
+      memcpy(ret->dvec, v, size);
+   }
+
+   return(*ret);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  simple_domaincmp
+ *
+ * Description :  Domain-wise Compare fqdn's.  The comparison is 
+ *                both left- and right-anchored.  The individual
+ *                domain names are compared with simplematch().
+ *                This is only used by domaincmp.
+ *
+ * Parameters  :
+ *          1  :  pv = array of patterns to compare
+ *          2  :  fv = array of domain components to compare
+ *          3  :  len = length of the arrays (both arrays are the
+ *                      same length - if they weren't, it couldn't
+ *                      possibly be a match).
+ *
+ * Returns     :  0 => domains are equivalent, else no match.
+ *
+ *********************************************************************/
+static int simple_domaincmp(char **pv, char **fv, int len)
+{
+   int n;
+
+   for (n = 0; n < len; n++)
+   {
+      if (simplematch(pv[n], fv[n]))
+      {
+         return 1;
+      }
+   }
+
+   return 0;
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  domaincmp
+ *
+ * Description :  Domain-wise Compare fqdn's. Governed by the bimap in
+ *                pattern->unachored, the comparison is un-, left-,
+ *                right-anchored, or both.
+ *                The individual domain names are compared with
+ *                simplematch().
+ *
+ * Parameters  :
+ *          1  :  pattern = a domain that may contain a '*' as a wildcard.
+ *          2  :  fqdn = domain name against which the patterns are compared.
+ *
+ * Returns     :  0 => domains are equivalent, else no match.
+ *
+ *********************************************************************/
+int domaincmp(struct url_spec *pattern, struct url_spec *fqdn)
+{
+   char **pv, **fv;  /* vectors  */
+   int    plen, flen;
+   int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT);
+
+   plen = pattern->dcnt;
+   flen = fqdn->dcnt;
+
+   if (flen < plen)
+   {
+      /* fqdn is too short to match this pattern */
+      return 1;
+   }
+
+   pv   = pattern->dvec;
+   fv   = fqdn->dvec;
+
+   if (unanchored == ANCHOR_LEFT)
+   {
+      /*
+       * Right anchored.
+       *
+       * Convert this into a fully anchored pattern with
+       * the fqdn and pattern the same length
+       */
+      fv += (flen - plen); /* flen - plen >= 0 due to check above */
+      return simple_domaincmp(pv, fv, plen);
+   }
+   else if (unanchored == 0)
+   {
+      /* Fully anchored, check length */
+      if (flen != plen)
+      {
+         return 1;
+      }
+      return simple_domaincmp(pv, fv, plen);
+   }
+   else if (unanchored == ANCHOR_RIGHT)
+   {
+      /* Left anchored, ignore all extra in fqdn */
+      return simple_domaincmp(pv, fv, plen);
+   }
+   else
+   {
+      /* Unanchored */
+      int n;
+      int maxn = flen - plen;
+      for (n = 0; n <= maxn; n++)
+      {
+         if (!simple_domaincmp(pv, fv, plen))
+         {
+            return 0;
+         }
+         /*
+          * Doesn't match from start of fqdn
+          * Try skipping first part of fqdn
+          */
+         fv++;
+      }
+      return 1;
+   }
+
 }
 
 
index 82b59ce..ec22e36 100644 (file)
--- a/filters.h
+++ b/filters.h
@@ -1,6 +1,6 @@
-#ifndef FILTERS_H_INCLUDED
-#define FILTERS_H_INCLUDED
-#define FILTERS_H_VERSION "$Id: filters.h,v 1.18 2002/03/25 22:12:45 oes Exp $"
+#ifndef _FILTERS_H
+#define _FILTERS_H
+#define FILTERS_H_VERSION "$Id: filters.h,v 1.10 2001/06/29 13:29:01 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/filters.h,v $
@@ -8,12 +8,13 @@
  * Purpose     :  Declares functions to parse/crunch headers and pages.
  *                Functions declared include:
  *                   `acl_addr', `add_stats', `block_acl', `block_imageurl',
- *                   `block_url', `url_actions', `filter_popups', `forward_url'
+ *                   `block_url', `url_actions', `domaincmp', `dsplit',
+ *                   `filter_popups', `forward_url'
  *                   `ij_untrusted_url', `intercept_url', `re_process_buffer',
  *                   `show_proxy_args', and `trust_url'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: filters.h,v $
- *    Revision 1.18  2002/03/25 22:12:45  oes
- *    Added fix for undefined INADDR_NONE on Solaris by Bart Schelstraete
- *
- *    Revision 1.17  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.16  2002/01/17 21:01:02  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.15  2001/10/10 16:44:16  oes
- *    Added match_portlist function
- *
- *    Revision 1.14  2001/10/07 15:41:40  oes
- *    Added prototype for remove_chunked_transfer_coding
- *
- *    Revision 1.13  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.12  2001/07/29 19:01:11  jongfoster
- *    Changed _FILENAME_H to FILENAME_H_INCLUDED.
- *    Added forward declarations for needed structures.
- *
- *    Revision 1.11  2001/07/13 14:00:18  oes
- *     - Introduced gif_deanimate_response
- *     - Renamed re_process_buffer to pcrs_filter_response
- *     - Removed all #ifdef PCRS
- *
  *    Revision 1.10  2001/06/29 13:29:01  oes
  *    Cleaned up and updated to reflect the changesin
  *    filters.c
 extern "C" {
 #endif
 
-
-struct access_control_addr;
-struct client_state;
-struct http_request;
-struct http_response;
-struct current_action_spec;
-struct url_actions;
-struct url_spec;
-
-
 /*
  * ACL checking
  */
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
 extern int block_acl(struct access_control_addr *dst, struct client_state *csp);
 extern int acl_addr(char *aspec, struct access_control_addr *aca);
-#endif /* def FEATURE_ACL */
-extern int match_portlist(const char *portlist, int port);
+#endif /* def ACL_FILES */
 
 /*
  * Interceptors
  */
 extern struct http_response *block_url(struct client_state *csp);
 extern struct http_response *redirect_url(struct client_state *csp);
-#ifdef FEATURE_COOKIE_JAR
+#ifdef TRUST_FILES
 extern struct http_response *trust_url(struct client_state *csp);
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def TRUST_FILES */
 
 /*
  * Request inspectors
  */
-#ifdef FEATURE_COOKIE_JAR
+#ifdef TRUST_FILES
 extern int is_untrusted_url(struct client_state *csp);
-#endif /* def FEATURE_COOKIE_JAR */
-#ifdef FEATURE_IMAGE_BLOCKING
+#endif /* def TRUST_FILES */
+#ifdef IMAGE_BLOCKING
 extern int is_imageurl(struct client_state *csp);
-#endif /* def FEATURE_IMAGE_BLOCKING */
+#endif /* def IMAGE_BLOCKING */
 
 /*
  * Determining applicable actions
@@ -246,19 +206,14 @@ extern void apply_url_actions(struct current_action_spec *action,
  */
 extern const struct forward_spec *forward_url(struct http_request *http, struct client_state *csp);
 
+extern struct url_spec dsplit(char *domain);
+extern int domaincmp(struct url_spec *pattern, struct url_spec *fqdn);
+
 /*
  * Content modification
  */
 extern char *pcrs_filter_response(struct client_state *csp);
 extern char *gif_deanimate_response(struct client_state *csp);
-extern int remove_chunked_transfer_coding(char *buffer, const size_t size);
-
-/*
- * Solaris fix:
- */
-#ifndef INADDR_NONE
-#define INADDR_NONE -1
-#endif     
 
 /* 
  * Revision control strings from this header and associated .c file
@@ -270,7 +225,7 @@ extern const char filters_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef FILTERS_H_INCLUDED */
+#endif /* ndef _FILTERS_H */
 
 /*
   Local Variables:
index cff7172..13273f6 100644 (file)
--- a/gateway.c
+++ b/gateway.c
@@ -1,4 +1,4 @@
-const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
+const char gateway_rcs[] = "$Id: gateway.c,v 1.2 2001/06/07 23:11:38 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/gateway.c,v $
@@ -8,13 +8,13 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
  *                proxy).
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -34,68 +34,6 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: gateway.c,v $
- *    Revision 1.14  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.13  2002/03/13 00:29:59  jongfoster
- *    Killing warnings
- *
- *    Revision 1.12  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.11  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.10  2002/03/07 03:50:19  oes
- *     - Improved handling of failed DNS lookups
- *     - Fixed compiler warnings
- *
- *    Revision 1.9  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.8  2001/09/13 20:10:12  jongfoster
- *    Fixing missing #include under Windows
- *
- *    Revision 1.7  2001/09/12 17:58:26  steudten
- *
- *    add #include <string.h>
- *
- *    Revision 1.6  2001/09/10 10:41:16  oes
- *    Added #include in.h
- *
- *    Revision 1.5  2001/07/29 18:47:57  jongfoster
- *    Adding missing #include project.h
- *
- *    Revision 1.4  2001/07/24 12:47:06  oes
- *    Applied BeOS support update by Eugenia
- *
- *    Revision 1.3  2001/06/09 10:55:28  jongfoster
- *    Changing BUFSIZ ==> BUFFER_SIZE
- *
  *    Revision 1.2  2001/06/07 23:11:38  jongfoster
  *    Removing gateways[] list - no longer used.
  *    Replacing function pointer in struct gateway with a directly
@@ -118,27 +56,12 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
 
 #include <stdio.h>
 #include <sys/types.h>
-
-#ifndef _WIN32
-#include <netinet/in.h>
-#endif
-
 #include <errno.h>
-#include <string.h>
 
 #ifdef _WIN32
 #include <winsock2.h>
 #endif /* def _WIN32 */
 
-#ifdef __BEOS__
-#include <netdb.h>
-#endif /* def __BEOS__ */
-
-#ifdef __OS2__
-#include <utils.h>
-#endif /* def __OS2__ */
-
-#include "project.h"
 #include "jcc.h"
 #include "errlog.h"
 #include "jbsockets.h"
@@ -146,10 +69,10 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
 
 const char gateway_h_rcs[] = GATEWAY_H_VERSION;
 
-static jb_socket socks4_connect(const struct forward_spec * fwd,
-                                const char * target_host,
-                                int target_port,
-                                struct client_state *csp);
+static int socks4_connect(const struct forward_spec * fwd, 
+                          const char * target_host,
+                          int target_port,
+                          struct client_state *csp);
 
 
 #define SOCKS_REQUEST_GRANTED          90
@@ -193,9 +116,9 @@ static const char socks_userid[] = "anonymous";
  * Returns     :  -1 => failure, else it is the socket file descriptor.
  *
  *********************************************************************/
-jb_socket forwarded_connect(const struct forward_spec * fwd,
-                            struct http_request *http,
-                            struct client_state *csp)
+int forwarded_connect(const struct forward_spec * fwd, 
+                      struct http_request *http, 
+                      struct client_state *csp)
 {
    const char * dest_host;
    int dest_port;
@@ -228,7 +151,7 @@ jb_socket forwarded_connect(const struct forward_spec * fwd,
          /* Should never get here */
          log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type.");
          errno = EINVAL;
-         return(JB_INVALID_SOCKET);
+         return(-1);
    }
 }
 
@@ -251,19 +174,19 @@ jb_socket forwarded_connect(const struct forward_spec * fwd,
  * Returns     :  -1 => failure, else a socket file descriptor.
  *
  *********************************************************************/
-static jb_socket socks4_connect(const struct forward_spec * fwd,
-                                const char * target_host,
-                                int target_port,
-                                struct client_state *csp)
+static int socks4_connect(const struct forward_spec * fwd, 
+                          const char * target_host,
+                          int target_port,
+                          struct client_state *csp)
 {
    int web_server_addr;
-   char cbuf[BUFFER_SIZE];
-   char sbuf[BUFFER_SIZE];
+   unsigned char cbuf[BUFFER_SIZE];
+   unsigned char sbuf[BUFFER_SIZE];
    struct socks_op    *c = (struct socks_op    *)cbuf;
    struct socks_reply *s = (struct socks_reply *)sbuf;
-   size_t n;
-   size_t csiz;
-   jb_socket sfd;
+   int n;
+   int csiz;
+   int sfd;
    int err = 0;
    char *errstr;
 
@@ -282,7 +205,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    if (err)
    {
       errno = EINVAL;
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
    /* build a socks request for connection to the web server */
@@ -295,11 +218,6 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    {
       case SOCKS_4:
          web_server_addr = htonl(resolve_hostname_to_ip(target_host));
-         if (web_server_addr == INADDR_NONE)
-         {
-            log_error(LOG_LEVEL_CONNECT, "socks4_connect: could not resolve target host %s", target_host);
-            return(JB_INVALID_SOCKET);
-         }
          break;
       case SOCKS_4A:
          web_server_addr = 0x00000001;
@@ -307,16 +225,16 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
          if (n > sizeof(cbuf))
          {
             errno = EINVAL;
-            return(JB_INVALID_SOCKET);
+            return(-1);
          }
-         strcpy(cbuf + csiz, target_host);
+         strcpy(((char *)cbuf) + csiz, target_host);
          csiz = n;
          break;
       default:
          /* Should never get here */
          log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type.");
          errno = EINVAL;
-         return(JB_INVALID_SOCKET);
+         return(-1);
    }
 
    c->vn          = 4;
@@ -331,23 +249,23 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    /* pass the request to the socks server */
    sfd = connect_to(fwd->gateway_host, fwd->gateway_port, csp);
 
-   if (sfd == JB_INVALID_SOCKET)
+   if (sfd < 0)
    {
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
-   if (write_socket(sfd, (char *)c, csiz))
+   if ((n = write_socket(sfd, (char *)c, csiz)) != csiz)
    {
       log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation write failed...");
       close_socket(sfd);
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
-   if (read_socket(sfd, sbuf, sizeof(sbuf)) != sizeof(*s))
+   if ((n = read_socket(sfd, sbuf, sizeof(sbuf))) != sizeof(*s))
    {
       log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation read failed...");
       close_socket(sfd);
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
    switch (s->cd)
@@ -371,7 +289,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
          errno = EACCES;
          break;
       default:
-         errstr = cbuf;
+         errstr = (char *) cbuf;
          errno = ENOENT;
          sprintf(errstr,
                  "SOCKS request rejected for reason code %d\n", s->cd);
@@ -380,7 +298,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s ...", errstr);
 
    close_socket(sfd);
-   return(JB_INVALID_SOCKET);
+   return(-1);
 
 }
 
index d96bc58..5f1eb82 100644 (file)
--- a/gateway.h
+++ b/gateway.h
@@ -1,6 +1,6 @@
-#ifndef GATEWAY_H_INCLUDED
-#define GATEWAY_H_INCLUDED
-#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.6 2002/03/25 22:12:45 oes Exp $"
+#ifndef _GATEWAY_H
+#define _GATEWAY_H
+#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/gateway.h,v $
@@ -10,7 +10,7 @@
  *                proxy).  Also contains the list of gateway types.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: gateway.h,v $
- *    Revision 1.6  2002/03/25 22:12:45  oes
- *    Added fix for undefined INADDR_NONE on Solaris by Bart Schelstraete
- *
- *    Revision 1.5  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.4  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.3  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.2  2001/06/07 23:12:14  jongfoster
- *    Removing gateways[] list - no longer used.
- *    Replacing function pointer in struct gateway with a directly
- *    called function forwarded_connect(), which can do the common
- *    task of deciding whether to connect to the web server or HTTP
- *    proxy.
- *    Replacing struct gateway with struct forward_spec
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:54  oes
  *    Initial import of version 2.9.3 source tree
  *
  *********************************************************************/
 \f
 
+#include "project.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-struct forward_spec;
-struct http_request;
-struct client_state;
+extern int forwarded_connect(const struct forward_spec * fwd, 
+                             struct http_request *http, 
+                             struct client_state *csp);
 
-extern jb_socket forwarded_connect(const struct forward_spec * fwd, 
-                                   struct http_request *http, 
-                                   struct client_state *csp);
-
-/*
- * Solaris fix
- */
-#ifndef INADDR_NONE
-#define INADDR_NONE -1
-#endif
-
-/*
- * Revision control strings from this header and associated .c file
- */
+/* Revision control strings from this header and associated .c file */
 extern const char gateway_rcs[];
 extern const char gateway_h_rcs[];
 
@@ -114,7 +61,7 @@ extern const char gateway_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef GATEWAY_H_INCLUDED */
+#endif /* ndef _GATEWAY_H */
 
 /*
   Local Variables:
diff --git a/icons/denyrule.ico b/icons/denyrule.ico
new file mode 100644 (file)
index 0000000..e5aa250
Binary files /dev/null and b/icons/denyrule.ico differ
diff --git a/icons/icon1.ico b/icons/icon1.ico
new file mode 100644 (file)
index 0000000..b96fe7c
Binary files /dev/null and b/icons/icon1.ico differ
index 5ef20fc..99470b5 100644 (file)
Binary files a/icons/idle.ico and b/icons/idle.ico differ
diff --git a/icons/junkbust.ico b/icons/junkbust.ico
new file mode 100644 (file)
index 0000000..41aafd0
Binary files /dev/null and b/icons/junkbust.ico differ
diff --git a/icons/os2.ico b/icons/os2.ico
deleted file mode 100644 (file)
index b5fd21f..0000000
Binary files a/icons/os2.ico and /dev/null differ
diff --git a/icons/os20.ico b/icons/os20.ico
deleted file mode 100644 (file)
index ef5995b..0000000
Binary files a/icons/os20.ico and /dev/null differ
diff --git a/icons/os21.ico b/icons/os21.ico
deleted file mode 100644 (file)
index cc61b61..0000000
Binary files a/icons/os21.ico and /dev/null differ
diff --git a/icons/os22.ico b/icons/os22.ico
deleted file mode 100644 (file)
index d357dfb..0000000
Binary files a/icons/os22.ico and /dev/null differ
diff --git a/icons/os23.ico b/icons/os23.ico
deleted file mode 100644 (file)
index 8ac037f..0000000
Binary files a/icons/os23.ico and /dev/null differ
diff --git a/icons/os24.ico b/icons/os24.ico
deleted file mode 100644 (file)
index f2b87f7..0000000
Binary files a/icons/os24.ico and /dev/null differ
diff --git a/icons/os25.ico b/icons/os25.ico
deleted file mode 100644 (file)
index 5bc68b5..0000000
Binary files a/icons/os25.ico and /dev/null differ
diff --git a/icons/os26.ico b/icons/os26.ico
deleted file mode 100644 (file)
index 408d89e..0000000
Binary files a/icons/os26.ico and /dev/null differ
diff --git a/icons/os27.ico b/icons/os27.ico
deleted file mode 100644 (file)
index 00a8814..0000000
Binary files a/icons/os27.ico and /dev/null differ
diff --git a/icons/os28.ico b/icons/os28.ico
deleted file mode 100644 (file)
index 9153636..0000000
Binary files a/icons/os28.ico and /dev/null differ
diff --git a/icons/privoxy.ico b/icons/privoxy.ico
deleted file mode 100644 (file)
index 4c96d0b..0000000
Binary files a/icons/privoxy.ico and /dev/null differ
diff --git a/install-sh b/install-sh
deleted file mode 100755 (executable)
index e9de238..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-       -c) instcmd="$cpprog"
-           shift
-           continue;;
-
-       -d) dir_arg=true
-           shift
-           continue;;
-
-       -m) chmodcmd="$chmodprog $2"
-           shift
-           shift
-           continue;;
-
-       -o) chowncmd="$chownprog $2"
-           shift
-           shift
-           continue;;
-
-       -g) chgrpcmd="$chgrpprog $2"
-           shift
-           shift
-           continue;;
-
-       -s) stripcmd="$stripprog"
-           shift
-           continue;;
-
-       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
-           shift
-           continue;;
-
-       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-           shift
-           continue;;
-
-       *)  if [ x"$src" = x ]
-           then
-               src=$1
-           else
-               # this colon is to work around a 386BSD /bin/sh bug
-               :
-               dst=$1
-           fi
-           shift
-           continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-       echo "install:  no input file specified"
-       exit 1
-else
-       true
-fi
-
-if [ x"$dir_arg" != x ]; then
-       dst=$src
-       src=""
-       
-       if [ -d $dst ]; then
-               instcmd=:
-               chmodcmd=""
-       else
-               instcmd=mkdir
-       fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-       if [ -f $src -o -d $src ]
-       then
-               true
-       else
-               echo "install:  $src does not exist"
-               exit 1
-       fi
-       
-       if [ x"$dst" = x ]
-       then
-               echo "install:  no destination specified"
-               exit 1
-       else
-               true
-       fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-       if [ -d $dst ]
-       then
-               dst="$dst"/`basename $src`
-       else
-               true
-       fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='   
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-       pathcomp="${pathcomp}${1}"
-       shift
-
-       if [ ! -d "${pathcomp}" ] ;
-        then
-               $mkdirprog "${pathcomp}"
-       else
-               true
-       fi
-
-       pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-       $doit $instcmd $dst &&
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-       if [ x"$transformarg" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               dstfile=`basename $dst $transformbasename | 
-                       sed $transformarg`$transformbasename
-       fi
-
-# don't allow the sed command to completely eliminate the filename
-
-       if [ x"$dstfile" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               true
-       fi
-
-# Make a temp file name in the proper directory.
-
-       dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-       $doit $instcmd $src $dsttmp &&
-
-       trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
-       $doit $rmcmd -f $dstdir/$dstfile &&
-       $doit $mvcmd $dsttmp $dstdir/$dstfile 
-
-fi &&
-
-
-exit 0
diff --git a/intermediate.action b/intermediate.action
deleted file mode 100644 (file)
index ab6689e..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-######################################################################\r
-# \r
-#  File        :  $Source: /cvsroot/ijbswa/current/intermediate.action,v $\r
-# \r
-#  $Id: intermediate.action,v 1.3 2002/03/26 22:29:54 swa Exp $\r
-#\r
-#  Purpose     :  More agressive actions file, see\r
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES\r
-# \r
-#  Copyright   :  Written by and Copyright\r
-#                 Privoxy team. http://www.privoxy.org/\r
-#\r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and\r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-#\r
-# We value your feedback. However, to provide you with the best support,\r
-# please note:\r
-#  \r
-#  * Use the support forum to get help:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118\r
-#  * Submit bugs only thru our bug forum:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 \r
-#    Make sure that the bug has not already been submitted. Please try\r
-#    to verify that it is a Junkbuster bug, and not a browser or site\r
-#    bug first. If you are using your own custom configuration, please\r
-#    try the stock configs to see if the problem is a configuration\r
-#    related bug. And if not using the latest development snapshot,\r
-#    please try the latest one. Or even better, CVS sources.\r
-#  * Submit feature requests only thru our feature request forum:\r
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse\r
-#      \r
-# For any other issues, feel free to use the mailing lists:\r
-# http://sourceforge.net/mail/?group_id=11118\r
-#    \r
-# Anyone interested in actively participating in development and related\r
-# discussions can join the appropriate mailing list here:\r
-# http://sourceforge.net/mail/?group_id=11118. Archives are available\r
-# here too.\r
-# \r
-######################################################################\r
-\r
-######################################################################\r
-# Aliases\r
-######################################################################\r
-\r
-######################################################################\r
-# Defaults\r
-######################################################################\r
-\r
-######################################################################\r
-# Specials\r
-######################################################################\r
-\r
-######################################################################\r
-# Imagelist:\r
-######################################################################\r
-\r
-######################################################################\r
-# Blocklist:\r
-######################################################################\r
-\r
-######################################################################\r
-# \r
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge\r
-#                 Privoxy team. http://www.privoxy.org/\r
-# \r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and \r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-# \r
-#                 This program is free software; you can redistribute it \r
-#                 and/or modify it under the terms of the GNU General\r
-#                 Public License as published by the Free Software\r
-#                 Foundation; either version 2 of the License, or (at\r
-#                 your option) any later version.\r
-# \r
-#                 This program is distributed in the hope that it will\r
-#                 be useful, but WITHOUT ANY WARRANTY; without even the\r
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A\r
-#                 PARTICULAR PURPOSE.  See the GNU General Public\r
-#                 License for more details.\r
-# \r
-#                 The GNU General Public License should be included with\r
-#                 this file.  If not, you can view it at\r
-#                 http://www.gnu.org/copyleft/gpl.html\r
-#                 or write to the Free Software Foundation, Inc., 59\r
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
-# \r
-######################################################################\r
index 8a407e2..3f54271 100644 (file)
@@ -1,4 +1,4 @@
-const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Exp $";
+const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.13 2001/07/15 13:56:57 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jbsockets.c,v $
@@ -9,7 +9,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
  *                on many platforms.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -35,86 +35,6 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
  *
  * Revisions   :
  *    $Log: jbsockets.c,v $
- *    Revision 1.29  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.28  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.27  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.26  2002/03/11 22:07:02  david__schmidt
- *    OS/2 port maintenance:
- *    - Fixed EMX build - it had decayed a little
- *    - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro.
- *      substituted a memset for now.
- *
- *    Revision 1.25  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.24  2002/03/07 03:51:36  oes
- *     - Improved handling of failed DNS lookups
- *     - Fixed compiler warnings etc
- *
- *    Revision 1.23  2002/03/05 00:36:01  jongfoster
- *    Fixing bug 514988 - unable to restart JunkBuster
- *
- *    Revision 1.22  2002/03/04 02:08:02  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.21  2002/01/09 14:32:33  oes
- *    Added support for gethostbyname_r and gethostbyaddr_r.
- *
- *    Revision 1.20  2001/11/16 00:48:48  jongfoster
- *    Enabling duplicate-socket detection for all platforms, not
- *    just Win32.
- *
- *    Revision 1.19  2001/10/25 03:40:47  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.18  2001/09/21 23:02:02  david__schmidt
- *    Cleaning up 2 compiler warnings on OS/2.
- *
- *    Revision 1.17  2001/09/13 20:11:46  jongfoster
- *    Fixing 2 compiler warnings under Win32
- *
- *    Revision 1.16  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.15  2001/07/29 17:40:43  jongfoster
- *    Fixed compiler warning by adding a cast
- *
- *    Revision 1.14  2001/07/18 13:47:59  oes
- *    Eliminated dirty hack for getsockbyname()
- *
  *    Revision 1.13  2001/07/15 13:56:57  jongfoster
  *    Removing unused local variable.
  *
@@ -179,9 +99,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
 
 #else
 
-#ifndef __OS2__
 #include <unistd.h>
-#endif
 #include <sys/time.h>
 #include <netinet/in.h>
 #include <sys/ioctl.h>
@@ -190,20 +108,11 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
 
 #ifndef __BEOS__
 #include <netinet/tcp.h>
-#ifndef __OS2__
 #include <arpa/inet.h>
-#endif
 #else
 #include <socket.h>
 #endif
 
-#if defined(__EMX__) || defined (__OS2__)
-#include <sys/select.h>  /* OS/2/EMX needs a little help with select */
-#ifdef __OS2__
-#include <nerrno.h>
-#endif
-#endif
-
 #endif
 
 #include "project.h"
@@ -227,72 +136,58 @@ const char jbsockets_h_rcs[] = JBSOCKETS_H_VERSION;
  *          3  :  csp = Current client state (buffers, headers, etc...)
  *                      Not modified, only used for source IP and ACL.
  *
- * Returns     :  JB_INVALID_SOCKET => failure, else it is the socket
- *                file descriptor.
+ * Returns     :  -1 => failure, else it is the socket file descriptor.
  *
  *********************************************************************/
-jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
+int connect_to(const char *host, int portnum, struct client_state *csp)
 {
    struct sockaddr_in inaddr;
-   jb_socket fd;
-   int addr;
+   int   fd, addr;
    fd_set wfds;
    struct timeval tv[1];
 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
    int   flags;
 #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
    struct access_control_addr dst[1];
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    memset((char *)&inaddr, 0, sizeof inaddr);
 
-   if ((addr = resolve_hostname_to_ip(host)) == INADDR_NONE)
+   if ((addr = resolve_hostname_to_ip(host)) == -1)
    {
       csp->http->host_ip_addr_str = strdup("unknown");
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
-#ifdef FEATURE_ACL
-   dst->addr = ntohl((unsigned long) addr);
+#ifdef ACL_FILES
+   dst->addr = ntohl(addr);
    dst->port = portnum;
 
    if (block_acl(dst, csp))
    {
-#ifdef __OS2__
-      errno = SOCEPERM;
-#else
       errno = EPERM;
-#endif
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    inaddr.sin_addr.s_addr = addr;
    inaddr.sin_family      = AF_INET;
    csp->http->host_ip_addr_str = strdup(inet_ntoa(inaddr.sin_addr));
 
-#ifndef _WIN32
    if (sizeof(inaddr.sin_port) == sizeof(short))
-#endif /* ndef _WIN32 */
    {
-      inaddr.sin_port = htons((unsigned short) portnum);
+      inaddr.sin_port = htons((short)portnum);
    }
-#ifndef _WIN32
    else
    {
-      inaddr.sin_port = htonl((unsigned long)portnum);
+      inaddr.sin_port = htonl(portnum);
    }
-#endif /* ndef _WIN32 */
 
-#ifdef _WIN32
-   if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) == JB_INVALID_SOCKET)
-#else
    if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) < 0)
-#endif
    {
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
 #ifdef TCP_NODELAY
@@ -302,45 +197,39 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
    }
 #endif /* def TCP_NODELAY */
 
-#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
    if ((flags = fcntl(fd, F_GETFL, 0)) != -1)
    {
       flags |= O_NDELAY;
       fcntl(fd, F_SETFL, flags);
    }
-#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
 
-   while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == JB_INVALID_SOCKET)
+   while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == -1)
    {
 #ifdef _WIN32
       if (errno == WSAEINPROGRESS)
-#elif __OS2__ 
-      if (sock_errno() == EINPROGRESS)
 #else /* ifndef _WIN32 */
       if (errno == EINPROGRESS)
-#endif /* ndef _WIN32 || __OS2__ */
+#endif /* ndef _WIN32 */
       {
          break;
       }
 
-#ifdef __OS2__ 
-      if (sock_errno() != EINTR)
-#else
       if (errno != EINTR)
-#endif /* __OS2__ */
       {
          close_socket(fd);
-         return(JB_INVALID_SOCKET);
+         return(-1);
       }
    }
 
-#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
    if (flags != -1)
    {
       flags &= ~O_NDELAY;
       fcntl(fd, F_SETFL, flags);
    }
-#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
 
    /* wait for connection to complete */
    FD_ZERO(&wfds);
@@ -349,11 +238,10 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
    tv->tv_sec  = 30;
    tv->tv_usec = 0;
 
-   /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */
-   if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0)
+   if (select(fd + 1, NULL, &wfds, NULL, tv) <= 0)
    {
       close_socket(fd);
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
    return(fd);
 
@@ -371,51 +259,24 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
  *          2  :  buf = pointer to data to be written.
  *          3  :  len = length of data to be written to the socket "fd".
  *
- * Returns     :  0 on success (entire buffer sent).
- *                nonzero on error.
+ * Returns     :  Win32 & Unix: If no error occurs, returns the total number of
+ *                bytes sent, which can be less than the number
+ *                indicated by len. Otherwise, returns (-1).
  *
  *********************************************************************/
-int write_socket(jb_socket fd, const char *buf, size_t len)
+int write_socket(int fd, const char *buf, int len)
 {
-   if (len == 0)
-   {
-      return 0;
-   }
-
-   if (len < 0)
+   if (len <= 0)
    {
-      return 1;
+      return(0);
    }
 
    log_error(LOG_LEVEL_LOG, "%N", len, buf);
 
-#if defined(_WIN32)
-   return (send(fd, buf, (int)len, 0) != (int)len);
-#elif defined(__BEOS__) || defined(AMIGA)
-   return (send(fd, buf, len, 0) != len);
-#elif defined(__OS2__)
-   /*
-    * Break the data up into SOCKET_SEND_MAX chunks for sending...
-    * OS/2 seemed to complain when the chunks were too large.
-    */
-#define SOCKET_SEND_MAX 65000
-   {
-      int write_len = 0, send_len, send_rc = 0, i = 0;
-      while ((i < len) && (send_rc != -1))
-      {
-         if ((i + SOCKET_SEND_MAX) > len)
-            send_len = len - i;
-         else
-            send_len = SOCKET_SEND_MAX;
-         send_rc = send(fd,(char*)buf + i, send_len, 0);
-         if (send_rc == -1)
-            return 1;
-         i = i + send_len;
-      }
-      return 0;
-   }
+#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA)
+   return( send(fd, buf, len, 0));
 #else
-   return (write(fd, buf, len) != len);
+   return( write(fd, buf, len));
 #endif
 
 }
@@ -439,26 +300,24 @@ int write_socket(jb_socket fd, const char *buf, size_t len)
  *                smaller than the number of bytes requested; this may hap-
  *                pen for example because fewer bytes are actually available
  *                right now (maybe because we were close to end-of-file, or
- *                because we are reading from a pipe, or from a terminal,
- *                or because read() was interrupted by a signal).  On error,
+ *                because we are reading from a pipe, or from a terminal),
+ *                or because read() was interrupted by a signal.  On error,
  *                -1 is returned, and errno is set appropriately.  In this
  *                case it is left unspecified whether the file position (if
  *                any) changes.
  *
  *********************************************************************/
-int read_socket(jb_socket fd, char *buf, int len)
+int read_socket(int fd, char *buf, int len)
 {
    if (len <= 0)
    {
       return(0);
    }
 
-#if defined(_WIN32)
-   return(recv(fd, buf, len, 0));
-#elif defined(__BEOS__) || defined(AMIGA) || defined(__OS2__)
-   return(recv(fd, buf, (size_t)len, 0));
+#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA)
+   return( recv(fd, buf, len, 0));
 #else
-   return(read(fd, buf, (size_t)len));
+   return( read(fd, buf, len));
 #endif
 }
 
@@ -475,14 +334,12 @@ int read_socket(jb_socket fd, char *buf, int len)
  * Returns     :  void
  *
  *********************************************************************/
-void close_socket(jb_socket fd)
+void close_socket(int fd)
 {
 #if defined(_WIN32) || defined(__BEOS__)
    closesocket(fd);
 #elif defined(AMIGA)
    CloseSocket(fd); 
-#elif defined(__OS2__)
-   soclose(fd);
 #else
    close(fd);
 #endif
@@ -500,69 +357,44 @@ void close_socket(jb_socket fd)
  * Parameters  :
  *          1  :  hostnam = TCP/IP address to bind/listen to
  *          2  :  portnum = port to listen on
- *          3  :  pfd = pointer used to return file descriptor.
  *
- * Returns     :  if success, returns 0 and sets *pfd.
- *                if failure, returns -3 if address is in use,
- *                                    -2 if address unresolvable,
- *                                    -1 otherwise
+ * Returns     :  if success, return file descriptor
+ *                if failure, returns -2 if address is in use, otherwise -1
+ *
  *********************************************************************/
-int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
+int bind_port(const char *hostnam, int portnum)
 {
    struct sockaddr_in inaddr;
-   jb_socket fd;
-#ifndef _WIN32
+   int fd;
    int one = 1;
-#endif /* ndef _WIN32 */
-
-   *pfd = JB_INVALID_SOCKET;
 
    memset((char *)&inaddr, '\0', sizeof inaddr);
 
    inaddr.sin_family      = AF_INET;
    inaddr.sin_addr.s_addr = resolve_hostname_to_ip(hostnam);
 
-   if (inaddr.sin_addr.s_addr == INADDR_NONE)
-   {
-      return(-2);
-   }
-
-#ifndef _WIN32
    if (sizeof(inaddr.sin_port) == sizeof(short))
-#endif /* ndef _WIN32 */
    {
-      inaddr.sin_port = htons((unsigned short) portnum);
+      inaddr.sin_port = htons((short)portnum);
    }
-#ifndef _WIN32
    else
    {
-      inaddr.sin_port = htonl((unsigned long) portnum);
+      inaddr.sin_port = htonl(portnum);
    }
-#endif /* ndef _WIN32 */
 
    fd = socket(AF_INET, SOCK_STREAM, 0);
 
-#ifdef _WIN32
-   if (fd == JB_INVALID_SOCKET)
-#else
    if (fd < 0)
-#endif
    {
       return(-1);
    }
 
 #ifndef _WIN32
    /*
-    * This is not needed for Win32 - in fact, it stops
+    * FIXME: This is not needed for Win32 - in fact, it stops
     * duplicate instances of JunkBuster from being caught.
-    *
-    * On UNIX, we assume the user is sensible enough not
-    * to start JunkBuster multiple times on the same IP.
-    * Without this, stopping and restarting JunkBuster
-    * from a script fails.
-    * Note: SO_REUSEADDR is meant to only take over
-    * sockets which are *not* in listen state in Linux,
-    * e.g. sockets in TIME_WAIT. YMMV.
+    * Is this really needed under UNIX, or should it be taked out?
+    * -- Jon
     */
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
 #endif /* ndef _WIN32 */
@@ -576,7 +408,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
       if (errno == EADDRINUSE)
 #endif
       {
-         return(-3);
+         return(-2);
       }
       else
       {
@@ -592,8 +424,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
       }
    }
 
-   *pfd = fd;
-   return 0;
+   return fd;
 
 }
 
@@ -614,45 +445,23 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
  *                On an error it returns 0 (FALSE).
  *
  *********************************************************************/
-int accept_connection(struct client_state * csp, jb_socket fd)
+int accept_connection(struct client_state * csp, int fd)
 {
    struct sockaddr_in client, server;
    struct hostent *host = NULL;
-   jb_socket afd;
-#if defined(_WIN32) || defined(__OS2__)
-   /* Wierdness - fix a warning. */
-   int c_length, s_length;
-#else
-   size_t c_length, s_length;
-#endif
-#if defined(HAVE_GETHOSTBYADDR_R_8_ARGS) ||  defined(HAVE_GETHOSTBYADDR_R_7_ARGS) || defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
-   struct hostent result;
-#if defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
-   struct hostent_data hdata;
-#else
-   char hbuf[HOSTENT_BUFFER_SIZE];
-   int thd_err;
-#endif /* def HAVE_GETHOSTBYADDR_R_5_ARGS */
-#endif /* def HAVE_GETHOSTBYADDR_R_(8|7|5)_ARGS */
+   int afd, c_length, s_length;
 
    c_length = s_length = sizeof(client);
 
-#ifdef _WIN32
-   afd = accept (fd, (struct sockaddr *) &client, &c_length);
-   if (afd == JB_INVALID_SOCKET)
-   {
-      return 0;
-   }
-#else
    do
    {
       afd = accept (fd, (struct sockaddr *) &client, &c_length);
    } while (afd < 1 && errno == EINTR);
+
    if (afd < 0)
    {
       return 0;
    }
-#endif
 
    /* 
     * Determine the IP-Adress that the client used to reach us
@@ -661,30 +470,8 @@ int accept_connection(struct client_state * csp, jb_socket fd)
    if (!getsockname(afd, (struct sockaddr *) &server, &s_length))
    {
       csp->my_ip_addr_str = strdup(inet_ntoa(server.sin_addr));
-#if defined(HAVE_GETHOSTBYADDR_R_8_ARGS)
-      gethostbyaddr_r((const char *)&server.sin_addr,
-                      sizeof(server.sin_addr), AF_INET,
-                      &result, hbuf, HOSTENT_BUFFER_SIZE,
-                      &host, &thd_err);
-#elif defined(HAVE_GETHOSTBYADDR_R_7_ARGS)
-      host = gethostbyaddr_r((const char *)&server.sin_addr,
-                      sizeof(server.sin_addr), AF_INET,
-                      &result, hbuf, HOSTENT_BUFFER_SIZE, &thd_err);
-#elif defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
-      if (0 == gethostbyaddr_r((const char *)&server.sin_addr,
-                               sizeof(server.sin_addr), AF_INET,
-                               &result, &hdata))
-      {
-         host = &result;
-      }
-      else
-      {
-         host = NULL;
-      }
-#else
-      host = gethostbyaddr((const char *)&server.sin_addr, 
-                           sizeof(server.sin_addr), AF_INET);
-#endif
+
+      host = gethostbyaddr(&server.sin_addr, sizeof(server.sin_addr), AF_INET);
       if (host == NULL)
       {
          log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %E\n");
@@ -714,22 +501,13 @@ int accept_connection(struct client_state * csp, jb_socket fd)
  * Parameters  :
  *          1  :  host = hostname to resolve
  *
- * Returns     :  INADDR_NONE => failure, INADDR_ANY or tcp/ip address if succesful.
+ * Returns     :  -1 => failure, INADDR_ANY or tcp/ip address if succesful.
  *
  *********************************************************************/
-unsigned long resolve_hostname_to_ip(const char *host)
+int resolve_hostname_to_ip(const char *host)
 {
    struct sockaddr_in inaddr;
    struct hostent *hostp;
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
-   struct hostent result;
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
-   char hbuf[HOSTENT_BUFFER_SIZE];
-   int thd_err;
-#else /* defined(HAVE_GETHOSTBYNAME_R_3_ARGS) */
-   struct hostent_data hdata;
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5)_ARGS */
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */
 
    if ((host == NULL) || (*host == '\0'))
    {
@@ -740,29 +518,10 @@ unsigned long resolve_hostname_to_ip(const char *host)
 
    if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1)
    {
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS)
-      gethostbyname_r(host, &result, hbuf,
-                      HOSTENT_BUFFER_SIZE, &hostp, &thd_err);
-#elif defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
-      hostp = gethostbyname_r(host, &result, hbuf,
-                      HOSTENT_BUFFER_SIZE, &thd_err);
-#elif defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
-      if (0 == gethostbyname_r(host, &result, &hdata))
-      {
-         hostp = &result;
-      }
-      else
-      {
-         hostp = NULL;
-      }
-#else
-      hostp = gethostbyname(host);
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */
-      if (hostp == NULL)
+      if ((hostp = gethostbyname(host)) == NULL)
       {
          errno = EINVAL;
-         log_error(LOG_LEVEL_ERROR, "could not resolve hostname %s", host);
-         return(INADDR_NONE);
+         return(-1);
       }
       if (hostp->h_addrtype != AF_INET)
       {
@@ -770,9 +529,8 @@ unsigned long resolve_hostname_to_ip(const char *host)
          errno = WSAEPROTOTYPE;
 #else
          errno = EPROTOTYPE;
-#endif 
-         log_error(LOG_LEVEL_ERROR, "hostname %s resolves to unknown address type.", host);
-         return(INADDR_NONE);
+#endif
+         return(-1);
       }
       memcpy(
          (char *) &inaddr.sin_addr,
index 3139330..7c1ee58 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef JBSOCKETS_H_INCLUDED
-#define JBSOCKETS_H_INCLUDED
-#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.7 2002/03/24 13:25:43 swa Exp $"
+#ifndef _JBSOCKETS_H
+#define _JBSOCKETS_H
+#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jbsockets.h,v $
@@ -11,7 +11,7 @@
  *                on many platforms.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: jbsockets.h,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.5  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.4  2002/03/07 03:51:36  oes
- *     - Improved handling of failed DNS lookups
- *     - Fixed compiler warnings etc
- *
- *    Revision 1.3  2001/07/29 19:01:11  jongfoster
- *    Changed _FILENAME_H to FILENAME_H_INCLUDED.
- *    Added forward declarations for needed structures.
- *
- *    Revision 1.2  2001/06/07 23:06:09  jongfoster
- *    The host parameter to connect_to() is now const.
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:54  oes
  *    Initial import of version 2.9.3 source tree
  *
  *********************************************************************/
 \f
 
-#include "project.h"
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-struct client_state;
-
-extern jb_socket connect_to(const char *host, int portnum, struct client_state *csp);
-extern int write_socket(jb_socket fd, const char *buf, size_t n);
-extern int read_socket(jb_socket fd, char *buf, int n);
-extern void close_socket(jb_socket fd);
+extern int connect_to(const char *host, int portnum, struct client_state *csp);
+extern int write_socket(int fd, const char *buf, int n);
+extern int read_socket(int fd, char *buf, int n);
+extern void close_socket(int fd);
 
-extern int bind_port(const char *hostnam, int portnum, jb_socket *pfd);
-extern int accept_connection(struct client_state * csp, jb_socket fd);
+extern int bind_port(const char *hostnam, int portnum);
+extern int accept_connection(struct client_state * csp, int fd);
 
-extern unsigned long resolve_hostname_to_ip(const char *host);
+extern int resolve_hostname_to_ip(const char *host);
 
 /* Revision control strings from this header and associated .c file */
 extern const char jbsockets_rcs[];
@@ -111,7 +66,7 @@ extern const char jbsockets_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef JBSOCKETS_H_INCLUDED */
+#endif /* ndef _JBSOCKETS_H */
 
 /*
   Local Variables:
diff --git a/jcc.c b/jcc.c
index f3cd6e9..9f3083d 100644 (file)
--- a/jcc.c
+++ b/jcc.c
@@ -1,19 +1,19 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.26 2001/07/18 12:31:36 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.c,v $
  *
- * Purpose     :  Main file.  Contains main() method, main loop, and
+ * Purpose     :  Main file.  Contains main() method, main loop, and 
  *                the main connection-handling function.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -33,280 +33,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
  *
  * Revisions   :
  *    $Log: jcc.c,v $
- *    Revision 1.87  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.86  2002/03/25 17:04:55  david__schmidt
- *    Workaround for closing the jarfile before load_config() comes around again
- *
- *    Revision 1.85  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.84  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.83  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.82  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.81  2002/03/12 01:42:50  oes
- *    Introduced modular filters
- *
- *    Revision 1.80  2002/03/11 22:07:05  david__schmidt
- *    OS/2 port maintenance:
- *    - Fixed EMX build - it had decayed a little
- *    - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro.
- *      substituted a memset for now.
- *
- *    Revision 1.79  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.78  2002/03/08 21:35:04  oes
- *    Added optional group supplement to --user option. Will now use default group of user if no group given
- *
- *    Revision 1.77  2002/03/07 03:52:06  oes
- *     - Fixed compiler warnings etc
- *     - Improved handling of failed DNS lookups
- *
- *    Revision 1.76  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.75  2002/03/06 10:02:19  oes
- *    Fixed stupid bug when --user was not given
- *
- *    Revision 1.74  2002/03/06 00:49:31  jongfoster
- *    Fixing warning on Windows
- *    Making #ifdefs that refer to the same variable consistently
- *    use #ifdef unix rather than mixing #ifdef unix & #ifndef OS2
- *
- *    Revision 1.73  2002/03/05 23:57:30  hal9
- *    Stray character 's' on line 1618 was breaking build.
- *
- *    Revision 1.72  2002/03/05 21:33:45  david__schmidt
- *    - Re-enable OS/2 building after new parms were added
- *    - Fix false out of memory report when resolving CGI templates when no IP
- *      address is available of failed attempt (a la no such domain)
- *
- *    Revision 1.71  2002/03/05 18:13:56  oes
- *    Added --user option
- *
- *    Revision 1.70  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.69  2002/03/04 23:50:00  jongfoster
- *    Splitting off bind_port() call into bind_port_helper(), with
- *    improved logging.
- *
- *    Revision 1.68  2002/03/04 20:17:32  oes
- *    Fixed usage info
- *
- *    Revision 1.67  2002/03/04 18:18:57  oes
- *    - Removed _DEBUG mode
- *    - Cleand up cmdline parsing
- *    - Introduced --no-daemon, --pidfile options
- *    - Cleaned up signal handling:
- *      - Terminate cleanly on INT, TERM and ABRT
- *      - Schedule logfile for re-opening on HUP
- *      - Ignore CHLD and PIPE
- *      - Leave the rest with their default handlers
- *      - Uniform handler registration
- *    - Added usage() function
- *    - Played styleguide police
- *
- *    Revision 1.66  2002/03/03 15:06:55  oes
- *    Re-enabled automatic config reloading
- *
- *    Revision 1.65  2002/03/03 14:49:11  oes
- *    Fixed CLF logging: Now uses client's original HTTP request
- *
- *    Revision 1.64  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.63  2002/03/02 04:14:50  david__schmidt
- *    Clean up a little CRLF unpleasantness that suddenly appeared
- *
- *    Revision 1.62  2002/02/20 23:17:23  jongfoster
- *    Detecting some out-of memory conditions and exiting with a log message.
- *
- *    Revision 1.61  2002/01/17 21:01:52  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.60  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.59  2001/12/13 14:07:18  oes
- *    Fixed Bug: 503 error page now sent OK
- *
- *    Revision 1.58  2001/11/30 23:37:24  jongfoster
- *    Renaming the Win32 config file to config.txt - this is almost the
- *    same as the corresponding UNIX name "config"
- *
- *    Revision 1.57  2001/11/16 00:47:43  jongfoster
- *    Changing the tty-disconnection code to use setsid().
- *
- *    Revision 1.56  2001/11/13 20:20:54  jongfoster
- *    Tabs->spaces, fixing a bug with missing {} around an if()
- *
- *    Revision 1.55  2001/11/13 20:14:53  jongfoster
- *    Patch for FreeBSD setpgrp() as suggested by Alexander Lazic
- *
- *    Revision 1.54  2001/11/07 00:03:14  steudten
- *    Give reliable return value if an error
- *    occurs not just 0 with new daemon mode.
- *
- *    Revision 1.53  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.52  2001/10/26 20:11:20  jongfoster
- *    Fixing type mismatch
- *
- *    Revision 1.51  2001/10/26 17:38:28  oes
- *    Cosmetics
- *
- *    Revision 1.50  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.49  2001/10/23 21:41:35  jongfoster
- *    Added call to initialize the (statically-allocated of course)
- *    "out of memory" CGI response.
- *
- *    Revision 1.48  2001/10/10 19:56:46  jongfoster
- *    Moving some code that wasn't cookie-related out of an #ifdef
- *    FEATURE_COOKIE_JAR
- *
- *    Revision 1.47  2001/10/10 16:44:36  oes
- *    Added CONNECT destination port limitation check
- *
- *    Revision 1.46  2001/10/08 15:17:41  oes
- *    Re-enabled SSL forwarding
- *
- *    Revision 1.45  2001/10/07 15:42:11  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Moved downgrading of the HTTP version from parse_http_request to
- *      chat(), since we can't decide if it is necessary before we have
- *      determined the actions for the URL. The HTTP command is now
- *      *always* re-built so the repairs need no longer be special-cased.
- *
- *    filter_popups now gets a csp pointer so it can raise the new
- *      CSP_FLAG_MODIFIED flag.
- *
- *    Bugfix
- *
- *    Added configurable size limit for the IOB. If the IOB grows so
- *      large that the next read would exceed the limit, the header
- *      is generated, and the header & unfiltered buffer are flushed
- *      to the client. Chat then continues in non-buffering,
- *      non-filtering body mode.
- *
- *    Revision 1.44  2001/10/02 18:13:57  oes
- *    Ooops
- *
- *    Revision 1.43  2001/10/02 15:32:13  oes
- *    Moved generation of hdr
- *
- *    Revision 1.42  2001/09/21 23:02:02  david__schmidt
- *    Cleaning up 2 compiler warnings on OS/2.
- *
- *    Revision 1.41  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.40  2001/09/16 15:41:45  jongfoster
- *    Fixing signed/unsigned comparison warning.
- *
- *    Revision 1.39  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.38  2001/09/16 13:01:46  jongfoster
- *    Removing redundant function call that zeroed zalloc()'d memory.
- *
- *    Revision 1.37  2001/09/10 11:12:24  oes
- *    Deleted unused variable
- *
- *    Revision 1.36  2001/09/10 10:56:15  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.35  2001/07/31 14:44:22  oes
- *    Deleted unused size parameter from filter_popups()
- *
- *    Revision 1.34  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.33  2001/07/29 19:32:00  jongfoster
- *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
- *
- *    Revision 1.32  2001/07/29 18:47:05  jongfoster
- *    Adding missing #include "loadcfg.h"
- *
- *    Revision 1.31  2001/07/29 12:17:48  oes
- *    Applied pthread fix by Paul Lieverse
- *
- *    Revision 1.30  2001/07/25 22:57:13  jongfoster
- *    __BEOS__ no longer overrides FEATURE_PTHREAD.
- *    This is because FEATURE_PTHREAD will soon be widely used, so I
- *    want to keep it simple.
- *
- *    Revision 1.29  2001/07/24 12:47:06  oes
- *    Applied BeOS support update by Eugenia
- *
- *    Revision 1.28  2001/07/23 13:26:12  oes
- *    Fixed bug in popup-killing for the first read that caused binary garbage to be sent between headers and body
- *
- *    Revision 1.27  2001/07/19 19:09:47  haroon
- *    - Added code to take care of the situation where while processing the first
- *      server response (which includes the server header), after finding the end
- *      of the headers we were not looking past the end of the headers for
- *      content modification. I enabled it for filter_popups.
- *      Someone else should look to see if other similar operations should be
- *      done to the discarded portion of the buffer.
- *
- *      Note 2001/07/20: No, the other content modification mechanisms will process
- *                       the whole iob later anyway. --oes
- *
  *    Revision 1.26  2001/07/18 12:31:36  oes
  *    cosmetics
  *
@@ -538,23 +264,10 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 
 #else /* ifndef _WIN32 */
 
-# if !defined (__OS2__)
 # include <unistd.h>
-# include <sys/wait.h>
-# endif /* ndef __OS2__ */
 # include <sys/time.h>
+# include <sys/wait.h>
 # include <sys/stat.h>
-# include <sys/ioctl.h>
-
-#ifdef sun
-#include <sys/termios.h>
-#endif /* sun */
-
-#ifdef unix
-#include <pwd.h>
-#include <grp.h>
-#endif
-
 # include <signal.h>
 
 # ifdef __BEOS__
@@ -562,15 +275,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 #  include <OS.h>      /* declarations for threads and stuff. */
 # endif
 
-# if defined(__EMX__) || defined(__OS2__)
-#  include <sys/select.h>  /* OS/2/EMX needs a little help with select */
-# endif
-# ifdef __OS2__
-#define INCL_DOS
-# include <os2.h>
-#define bzero(B,N) memset(B,0x00,n)
-# endif
-
 # ifndef FD_ZERO
 #  include <select.h>
 # endif
@@ -582,6 +286,7 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 #include "jcc.h"
 #include "filters.h"
 #include "loaders.h"
+#include "showargs.h"
 #include "parsers.h"
 #include "killpopup.h"
 #include "miscutil.h"
@@ -590,24 +295,18 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 #include "gateway.h"
 #include "actions.h"
 #include "cgi.h"
-#include "loadcfg.h"
-#include "urlmatch.h"
 
 const char jcc_h_rcs[] = JCC_H_VERSION;
 const char project_h_rcs[] = PROJECT_H_VERSION;
 
-int no_daemon = 0;
 struct client_state  clients[1];
 struct file_list     files[1];
 
-#ifdef FEATURE_STATISTICS
+#ifdef STATISTICS
 int urls_read     = 0;     /* total nr of urls read inc rejected */
 int urls_rejected = 0;     /* total nr of urls rejected */
-#endif /* def FEATURE_STATISTICS */
+#endif /* def STATISTICS */
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-int g_terminate = 0;
-#endif
 
 static void listen_loop(void);
 static void chat(struct client_state *csp);
@@ -625,15 +324,6 @@ static int32 server_thread(void *data);
 #define sleep(N)  Sleep(((N) * 1000))
 #endif
 
-#ifdef __OS2__
-#define sleep(N)  DosSleep(((N) * 100))
-#endif
-
-#if defined(unix) || defined(__EMX__)
-const char *basedir;
-const char *pidfile = NULL;
-int received_hup_signal = 0;
-#endif /* defined unix */
 
 /* The vanilla wafer. */
 static const char VANILLA_WAFER[] =
@@ -646,60 +336,13 @@ static const char VANILLA_WAFER[] =
    "(copyright_or_otherwise)_applying_to_any_cookie._";
 
 
-#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA)
-/*********************************************************************
- *
- * Function    :  sig_handler 
- *
- * Description :  Signal handler for different signals.
- *                Exit gracefully on ABRT, TERM and  INT
- *                or set a flag that will cause the errlog
- *                to be reopened by the main thread on HUP.
- *
- * Parameters  :
- *          1  :  the_signal = the signal cause this function to call
- *
- * Returns     :  - 
- *
- *********************************************************************/
-static void sig_handler(int the_signal)
-{
-   switch(the_signal)
-   {
-      case SIGABRT:
-      case SIGTERM:
-      case SIGINT:
-         log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal);
-#if defined(unix)
-         unlink(pidfile);
-#endif /* unix */
-         exit(the_signal);
-         break;
-
-      case SIGHUP:
-         received_hup_signal = 1;
-         break;         
-
-      default:
-         /* 
-          * We shouldn't be here, unless we catch signals
-          * in main() that we can't handle here!
-          */
-         log_error(LOG_LEVEL_FATAL, "sig_handler: exiting on unexpected signal %d", the_signal);
-   }
-   return;
-
-}
-#endif
-
-
 /*********************************************************************
  *
  * Function    :  chat
  *
  * Description :  Once a connection to the client has been accepted,
  *                this function is called (via serve()) to handle the
- *                main business of the communication.  When this
+ *                main business of the communication.  When this 
  *                function returns, the caller must close the client
  *                socket handle.
  *
@@ -717,47 +360,42 @@ static void sig_handler(int the_signal)
 static void chat(struct client_state *csp)
 {
 /*
- * This next lines are a little ugly, but they simplifies the if statements
- * below.  Basically if TOGGLE, then we want the if to test if the
- * CSP_FLAG_TOGGLED_ON flag ist set, else we don't.  And if FEATURE_FORCE_LOAD,
- * then we want the if to test for CSP_FLAG_FORCED , else we don't
+ * This next lines are a little ugly, but they simplifies the if statements below.
+ * Basically if TOGGLE, then we want the if to test "csp->toggled_on", else we don't
+ * And if FORCE_LOAD, then we want the if to test "csp->toggled_on", else we don't
  */
-#ifdef FEATURE_TOGGLE
-#   define IS_TOGGLED_ON_AND (csp->flags & CSP_FLAG_TOGGLED_ON) &&
-#else /* ifndef FEATURE_TOGGLE */
+#ifdef TOGGLE
+#   define IS_TOGGLED_ON_AND (csp->toggled_on) &&
+#else /* ifndef TOGGLE */
 #   define IS_TOGGLED_ON_AND
-#endif /* ndef FEATURE_TOGGLE */
-#ifdef FEATURE_FORCE_LOAD
-#   define IS_NOT_FORCED_AND !(csp->flags & CSP_FLAG_FORCED) &&
-#else /* ifndef FEATURE_FORCE_LOAD */
+#endif /* ndef TOGGLE */
+#ifdef FORCE_LOAD
+#   define IS_NOT_FORCED_AND (!csp->force) && 
+#else /* ifndef FORCE_LOAD */
 #   define IS_NOT_FORCED_AND
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
 
 #define IS_ENABLED_AND   IS_TOGGLED_ON_AND IS_NOT_FORCED_AND
 
    char buf[BUFFER_SIZE];
-   char *hdr;
-   char *p;
-   char *req;
+   char *hdr, *p, *req;
+   char *err = NULL;
    fd_set rfds;
-   int n;
-   jb_socket maxfd;
-   int server_body;
+   int n, maxfd, server_body;
    int ms_iis5_hack = 0;
    int byte_count = 0;
    const struct forward_spec * fwd;
    struct http_request *http;
-   int len; /* for buffer sizes */
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
    int block_popups;         /* bool, 1==will block popups */
    int block_popups_now = 0; /* bool, 1==currently blocking popups */
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
    int pcrs_filter;        /* bool, 1==will filter through pcrs */
    int gif_deanimate;      /* bool, 1==will deanimate gifs */
 
    /* Function that does the content filtering for the current request */
-   char *(*content_filter)() = NULL;
+   char *(*content_filter)() = NULL; 
 
    /* Skeleton for HTTP response, if we should intercept the request */
    struct http_response *rsp;
@@ -769,13 +407,13 @@ static void chat(struct client_state *csp)
     * could get blocked here if a client connected, then didn't say anything!
     */
 
-   for (;;)
+   while (FOREVER)
    {
-      len = read_socket(csp->cfd, buf, sizeof(buf));
+      n = read_socket(csp->cfd, buf, sizeof(buf));
 
-      if (len <= 0) break;      /* error! */
+      if (n <= 0) break;      /* error! */
 
-      add_to_iob(csp, buf, len);
+      add_to_iob(csp, buf, n);
 
       req = get_header(csp);
 
@@ -788,8 +426,8 @@ static void chat(struct client_state *csp)
       {
          continue;   /* more to come! */
       }
-
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
       /* If this request contains the FORCE_PREFIX,
        * better get rid of it now and set the force flag --oes
        */
@@ -798,11 +436,14 @@ static void chat(struct client_state *csp)
       {
          strclean(req, FORCE_PREFIX);
          log_error(LOG_LEVEL_FORCE, "Enforcing request \"%s\".\n", req);
-         csp->flags |= CSP_FLAG_FORCED;
+         csp->force = 1;
+      } 
+      else
+      {
+         csp->force = 0;
       }
-
-#endif /* def FEATURE_FORCE_LOAD */
-
+#endif /* def FORCE_LOAD */
+  
       parse_http_request(req, http, csp);
       freez(req);
       break;
@@ -830,171 +471,98 @@ static void chat(struct client_state *csp)
     * we have to do one of the following:
     *
     * create = use the original HTTP request to create a new
-    *          HTTP request that has either the path component
-    *          without the http://domainspec (w/path) or the
-    *          full orininal URL (w/url)
-    *          Note that the path and/or the HTTP version may
-    *          have been altered by now.
+    *          HTTP request that has only the path component
+    *          without the http://domainspec
+    * pass   = pass the original HTTP request unchanged
     *
-    * connect = Open a socket to the host:port of the server
-    *           and short-circuit server and client socket.
-    *
-    * pass =  Pass the request unchanged if forwarding a CONNECT
-    *         request to a parent proxy. Note that we'll be sending
-    *         the CFAIL message ourselves if connecting to the parent
-    *         fails, but we won't send a CSUCCEED message if it works,
-    *         since that would result in a double message (ours and the
-    *         parent's). After sending the request to the parent, we simply
-    *         tunnel.
+    * drop   = drop the HTTP request
     *
     * here's the matrix:
     *                        SSL
     *                    0        1
     *                +--------+--------+
     *                |        |        |
-    *             0  | create | connect|
-    *                | w/path |        |
+    *             0  | create | drop   |
+    *                |        |        |
     *  Forwarding    +--------+--------+
     *                |        |        |
-    *             1  | create | pass   |
-    *                | w/url  |        |
+    *             1  | pass   | pass   |
+    *                |        |        |
     *                +--------+--------+
     *
     */
 
-   /*
-    * Determine the actions for this URL
-    */
-#ifdef FEATURE_TOGGLE
-   if (!(csp->flags & CSP_FLAG_TOGGLED_ON))
+   if (fwd->forward_host)
    {
-      /* Most compatible set of actions (i.e. none) */
-      init_current_action(csp->action);
+      /* if forwarding, just pass the request as is */
+      enlist(csp->headers, http->cmd);
    }
    else
-#endif /* ndef FEATURE_TOGGLE */
-   {
-      url_actions(http, csp);
-   }
-
-
-   /*
-    * Check if a CONNECT request is allowable:
-    * In the absence of a +limit-connect action, allow only port 443.
-    * If there is an action, allow whatever matches the specificaton.
-    */
-   if(http->ssl)
    {
-      if(  ( !(csp->action->flags & ACTION_LIMIT_CONNECT) && csp->http->port != 443)
-           || (csp->action->flags & ACTION_LIMIT_CONNECT
-              && !match_portlist(csp->action->string[ACTION_STRING_LIMIT_CONNECT], csp->http->port)) )
+      if (http->ssl == 0)
       {
-         strcpy(buf, CFORBIDDEN);
-         write_socket(csp->cfd, buf, strlen(buf));
-
-         log_error(LOG_LEVEL_CONNECT, "Denying suspicious CONNECT request from %s", csp->ip_addr_str);
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \" \" 403 0", csp->ip_addr_str);
-
-         return;
+         /* otherwise elide the host information from the url */
+         p = NULL;
+         p = strsav(p, http->gpc);
+         p = strsav(p, " ");
+         p = strsav(p, http->path);
+         p = strsav(p, " ");
+         p = strsav(p, http->ver);
+         enlist(csp->headers, p);
+         freez(p);
       }
    }
 
+   /* decide what we're to do with cookies */
 
-   /*
-    * Downgrade http version from 1.1 to 1.0 if +downgrade
-    * action applies
-    */
-   if ( (http->ssl == 0)
-     && (!strcmpic(http->ver, "HTTP/1.1"))
-     && (csp->action->flags & ACTION_DOWNGRADE))
+#ifdef TOGGLE
+   if (!csp->toggled_on)
    {
-      freez(http->ver);
-      http->ver = strdup("HTTP/1.0");
-
-      if (http->ver == NULL)
-      {
-         log_error(LOG_LEVEL_FATAL, "Out of memory downgrading HTTP version");
-      }
-   }
-
-   /* 
-    * Save a copy of the original request for logging
-    */
-   http->ocmd = strdup(http->cmd);
-
-   if (http->ocmd == NULL)
-   {
-      log_error(LOG_LEVEL_FATAL, "Out of memory copying HTTP request line");
+      /* Most compatible set of actions (i.e. none) */
+      init_current_action(csp->action);
    }
-
-   /*
-    * (Re)build the HTTP request for non-SSL requests.
-    * If forwarding, use the whole URL, else, use only the path.
-    */
-   if (http->ssl == 0)
+   else
+#endif /* ndef TOGGLE */
    {
-      freez(http->cmd);
-
-      http->cmd = strdup(http->gpc);
-      string_append(&http->cmd, " ");
-
-      if (fwd->forward_host)
-      {
-         string_append(&http->cmd, http->url);
-      }
-      else
-      {
-         string_append(&http->cmd, http->path);
-      }
-
-      string_append(&http->cmd, " ");
-      string_append(&http->cmd, http->ver);
-
-      if (http->cmd == NULL)
-      {
-         log_error(LOG_LEVEL_FATAL, "Out of memory rewiting SSL command");
-      }
+      url_actions(http, csp);
    }
-   enlist(csp->headers, http->cmd);
-
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef JAR_FILES
    /*
     * If we're logging cookies in a cookie jar, and the user has not
     * supplied any wafers, and the user has not told us to suppress the
     * vanilla wafer, then send the vanilla wafer.
     */
    if ((csp->config->jarfile != NULL)
-       && list_is_empty(csp->action->multi[ACTION_MULTI_WAFER])
+       && (csp->action->multi[ACTION_MULTI_WAFER]->next == NULL)
        && ((csp->action->flags & ACTION_VANILLA_WAFER) != 0))
    {
       enlist(csp->action->multi[ACTION_MULTI_WAFER], VANILLA_WAFER);
    }
-#endif /* def FEATURE_COOKIE_JAR */
-
+#endif /* def JAR_FILES */
 
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
    block_popups               = ((csp->action->flags & ACTION_NO_POPUPS) != 0);
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
    pcrs_filter                = (csp->rlist != NULL) &&  /* There are expressions to be used */
-                                (!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER]));
+                                ((csp->action->flags & ACTION_FILTER) != 0);
 
    gif_deanimate              = ((csp->action->flags & ACTION_DEANIMATE) != 0);
 
    /* grab the rest of the client's headers */
 
-   for (;;)
+   while (FOREVER)
    {
-      if ( ( ( p = get_header(csp) ) != NULL) && ( *p == '\0' ) )
+      if ( ( p = get_header(csp) ) && ( *p == '\0' ) )
       {
-         len = read_socket(csp->cfd, buf, sizeof(buf));
-         if (len <= 0)
+         n = read_socket(csp->cfd, buf, sizeof(buf));
+         if (n <= 0)
          {
             log_error(LOG_LEVEL_ERROR, "read from client failed: %E");
             return;
          }
-         add_to_iob(csp, buf, len);
+         add_to_iob(csp, buf, n);
          continue;
       }
 
@@ -1003,52 +571,59 @@ static void chat(struct client_state *csp)
       enlist(csp->headers, p);
       freez(p);
    }
-   /*
-    * We have a request. Now, check to see if we need to
-    * intercept it, i.e. If ..
-    */
 
+   /* We have a request. */
+
+   hdr = sed(client_patterns, add_client_headers, csp);
+   destroy_list(csp->headers);
+
+   /* 
+    * Now, check to see if we need to intercept it, i.e.
+    * If
+    */
    if (
        /* a CGI call was detected and answered */
-       (NULL != (rsp = dispatch_cgi(csp)))
+        (NULL != (rsp = dispatch_cgi(csp))) 
 
        /* or we are enabled and... */
        || (IS_ENABLED_AND (
 
             /* ..the request was blocked */
-          ( NULL != (rsp = block_url(csp)))
+           ( NULL != (rsp = block_url(csp)))
 
           /* ..or untrusted */
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
           || ( NULL != (rsp = trust_url(csp)))
-#endif /* def FEATURE_TRUST */
+#endif 
 
           /* ..or a fast redirect kicked in */
-#ifdef FEATURE_FAST_REDIRECTS
-          || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) &&
-                (NULL != (rsp = redirect_url(csp))))
-#endif /* def FEATURE_FAST_REDIRECTS */
-          ))
-      )
+#ifdef FAST_REDIRECTS
+          || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) && 
+                    (NULL != (rsp = redirect_url(csp))))
+#endif /* def FAST_REDIRECTS */
+                ))
+       )
    {
       /* Write the answer to the client */
-      if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-       || write_socket(csp->cfd, rsp->body, rsp->content_length))
-      {
+      if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length)
+            || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+      { 
          log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
       }
 
-#ifdef FEATURE_STATISTICS
+#ifdef STATISTICS
       /* Count as a rejected request */
-      csp->flags |= CSP_FLAG_REJECTED;
-#endif /* def FEATURE_STATISTICS */
+      csp->rejected = 1;
+#endif /* def STATISTICS */
 
       /* Log (FIXME: All intercept reasons apprear as "crunch" with Status 200) */
       log_error(LOG_LEVEL_GPC, "%s%s crunch!", http->hostport, http->path);
-      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->ocmd);
+      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->cmd); 
 
       /* Clean up and return */
       free_http_response(rsp);
+      freez(hdr);
       return;
    }
 
@@ -1068,74 +643,67 @@ static void chat(struct client_state *csp)
 
    csp->sfd = forwarded_connect(fwd, http, csp);
 
-   if (csp->sfd == JB_INVALID_SOCKET)
+   if (csp->sfd < 0)
    {
       log_error(LOG_LEVEL_CONNECT, "connect to: %s failed: %E",
                 http->hostport);
 
       if (errno == EINVAL)
       {
-         rsp = error_response(csp, "no-such-domain", errno);
+          rsp = error_response(csp, "no-such-domain", errno);
 
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0",
-                   csp->ip_addr_str, http->ocmd);
+         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0", 
+                   csp->ip_addr_str, http->cmd);
       }
       else
       {
-         rsp = error_response(csp, "connect-failed", errno);
+          rsp = error_response(csp, "connect-failed", errno);
 
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0",
-                   csp->ip_addr_str, http->ocmd);
+         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", 
+                   csp->ip_addr_str, http->cmd);
       }
 
-
       /* Write the answer to the client */
       if(rsp)
-      {
-         if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-          || write_socket(csp->cfd, rsp->body, rsp->content_length))
-         {
+       {
+         if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length)
+               || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+         { 
             log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
          }
       }
 
       free_http_response(rsp);
+      freez(hdr);
       return;
    }
 
    log_error(LOG_LEVEL_CONNECT, "OK");
 
-   hdr = sed(client_patterns, add_client_headers, csp);
-   if (hdr == NULL)
-   {
-      /* FIXME Should handle error properly */
-      log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header");
-   }
-
-   list_remove_all(csp->headers);
-
    if (fwd->forward_host || (http->ssl == 0))
    {
       /* write the client's (modified) header to the server
        * (along with anything else that may be in the buffer)
        */
 
-      if (write_socket(csp->sfd, hdr, strlen(hdr))
-       || (flush_socket(csp->sfd, csp) <  0))
+      n = strlen(hdr);
+
+      if ((write_socket(csp->sfd, hdr, n) != n)
+          || (flush_socket(csp->sfd, csp   ) <  0))
       {
          log_error(LOG_LEVEL_CONNECT, "write header to: %s failed: %E",
                     http->hostport);
 
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0",
-                   csp->ip_addr_str, http->ocmd);
+         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", 
+                   csp->ip_addr_str, http->cmd); 
 
          rsp = error_response(csp, "connect-failed", errno);
 
          if(rsp)
          {
-            if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-             || write_socket(csp->cfd, rsp->body, rsp->content_length))
-            {
+            if ((write_socket(csp->cfd, rsp->head, n) != n)
+               || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+            { 
                log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
             }
          }
@@ -1152,10 +720,10 @@ static void chat(struct client_state *csp)
        * so just send the "connect succeeded" message to the
        * client, flush the rest, and get out of the way.
        */
-      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n",
-                csp->ip_addr_str, http->ocmd);
+      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n", 
+                csp->ip_addr_str, http->cmd); 
 
-      if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1))
+      if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1) < 0)
       {
          freez(hdr);
          return;
@@ -1174,21 +742,14 @@ static void chat(struct client_state *csp)
 
    server_body = 0;
 
-   for (;;)
+   while (FOREVER)
    {
-#ifdef __OS2__
-      /*
-       * FD_ZERO here seems to point to an errant macro which crashes.
-       * So do this by hand for now...
-       */
-      memset(&rfds,0x00,sizeof(fd_set));
-#else
       FD_ZERO(&rfds);
-#endif
+
       FD_SET(csp->cfd, &rfds);
       FD_SET(csp->sfd, &rfds);
 
-      n = select((int)maxfd+1, &rfds, NULL, NULL, NULL);
+      n = select(maxfd+1, &rfds, NULL, NULL, NULL);
 
       if (n < 0)
       {
@@ -1202,14 +763,14 @@ static void chat(struct client_state *csp)
 
       if (FD_ISSET(csp->cfd, &rfds))
       {
-         len = read_socket(csp->cfd, buf, sizeof(buf));
+         n = read_socket(csp->cfd, buf, sizeof(buf));
 
-         if (len <= 0)
+         if (n <= 0)
          {
             break; /* "game over, man" */
          }
 
-         if (write_socket(csp->sfd, buf, (size_t)len))
+         if (write_socket(csp->sfd, buf, n) != n)
          {
             log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
             return;
@@ -1227,25 +788,25 @@ static void chat(struct client_state *csp)
       if (FD_ISSET(csp->sfd, &rfds))
       {
          fflush( 0 );
-         len = read_socket(csp->sfd, buf, sizeof(buf) - 1);
+         n = read_socket(csp->sfd, buf, sizeof(buf) - 1);
 
-         if (len < 0)
+         if (n < 0)
          {
             log_error(LOG_LEVEL_ERROR, "read from: %s failed: %E", http->host);
 
-            log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0",
-                      csp->ip_addr_str, http->ocmd);
+            log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", 
+                      csp->ip_addr_str, http->cmd); 
 
             rsp = error_response(csp, "connect-failed", errno);
 
             if(rsp)
             {
-               if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-                || write_socket(csp->cfd, rsp->body, rsp->content_length))
-               {
+               if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length)
+                   || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+               { 
                   log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
-               }
-            }
+                          }
+                       }
 
             free_http_response(rsp);
             return;
@@ -1254,15 +815,15 @@ static void chat(struct client_state *csp)
          /* Add a trailing zero.  This lets filter_popups
           * use string operations.
           */
-         buf[len] = '\0';
+         buf[n] = '\0';
 
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
          /* Filter the popups on this read. */
          if (block_popups_now)
          {
-            filter_popups(buf, csp);
+            filter_popups(buf, n);
          }
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
          /* Normally, this would indicate that we've read
           * as much as the server has sent us and we can
@@ -1282,9 +843,9 @@ static void chat(struct client_state *csp)
           * doesn't generate a valid header, then we won't
           * transmit anything to the client.
           */
-         if (len == 0)
+         if (n == 0)
          {
-
+            
             if (server_body || http->ssl)
             {
                /*
@@ -1305,33 +866,27 @@ static void chat(struct client_state *csp)
                   }
 
                   hdr = sed(server_patterns, add_server_headers, csp);
-                  if (hdr == NULL)
-                  {
-                     /* FIXME Should handle error properly */
-                     log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
-                  }
+                  n = strlen(hdr);
 
-                  if (write_socket(csp->cfd, hdr, strlen(hdr))
-                   || write_socket(csp->cfd, p != NULL ? p : csp->iob->cur, csp->content_length))
+                  if ((write_socket(csp->cfd, hdr, n) != n)
+                      || (write_socket(csp->cfd, p != NULL ? p : csp->iob->cur, csp->content_length) != csp->content_length))
                   {
-                     log_error(LOG_LEVEL_ERROR, "write modified content to client failed: %E");
+                     log_error(LOG_LEVEL_CONNECT, "write modified content to client failed: %E");
                      return;
                   }
 
                   freez(hdr);
-                  if (NULL != p) {
-                     freez(p);
-                  }
+                  freez(p);
                }
 
                break; /* "game over, man" */
             }
 
             /*
-             * This is NOT the body, so
+             * This is NOT the body, so 
              * Let's pretend the server just sent us a blank line.
              */
-            len = sprintf(buf, "\r\n");
+            n = sprintf(buf, "\r\n");
 
             /*
              * Now, let the normal header parsing algorithm below do its
@@ -1351,55 +906,17 @@ static void chat(struct client_state *csp)
          {
             if (content_filter)
             {
-               add_to_iob(csp, buf, len);
-
-               /*
-                * If the buffer limit will be reached on the next read,
-                * switch to non-filtering mode, i.e. make & write the
-                * header, flush the socket and get out of the way.
-                */
-               if (((size_t)(csp->iob->eod - csp->iob->buf)) + (size_t)BUFFER_SIZE > csp->config->buffer_limit)
-               {
-                  size_t hdrlen;
-
-                  log_error(LOG_LEVEL_ERROR, "Buffer size limit reached! Flushing and stepping back.");
-
-                  hdr = sed(server_patterns, add_server_headers, csp);
-                  if (hdr == NULL)
-                  {
-                     /* FIXME Should handle error properly */
-                     log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
-                  }
-
-                  hdrlen = strlen(hdr);
-                  byte_count += hdrlen;
-
-                  if (write_socket(csp->cfd, hdr, hdrlen)
-                   || ((len = flush_socket(csp->cfd, csp)) < 0))
-                  {
-                     log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
-
-                     freez(hdr);
-                     return;
-                  }
-
-                  freez(hdr);
-                  byte_count += len;
-
-                  content_filter = NULL;
-                  server_body = 1;
-
-               }
+               add_to_iob(csp, buf, n); 
             }
             else
             {
-               if (write_socket(csp->cfd, buf, (size_t)len))
+               if (write_socket(csp->cfd, buf, n) != n)
                {
                   log_error(LOG_LEVEL_ERROR, "write to client failed: %E");
                   return;
                }
             }
-            byte_count += len;
+            byte_count += n;
             continue;
          }
          else
@@ -1410,11 +927,11 @@ static void chat(struct client_state *csp)
              */
 
             /* buffer up the data we just read */
-            add_to_iob(csp, buf, len);
+            add_to_iob(csp, buf, n);
 
             /* get header lines from the iob */
 
-            while ((p = get_header(csp)) != NULL)
+            while ((p = get_header(csp)))
             {
                if (*p == '\0')
                {
@@ -1459,13 +976,14 @@ static void chat(struct client_state *csp)
              */
 
             hdr = sed(server_patterns, add_server_headers, csp);
-            if (hdr == NULL)
-            {
-               /* FIXME Should handle error properly */
-               log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
-            }
+            n   = strlen(hdr);
+
+            /* write the server's (modified) header to
+             * the client (along with anything else that
+             * may be in the buffer)
+             */
 
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
             /* Start blocking popups if appropriate. */
 
             if ((csp->content_type & CT_TEXT) &&  /* It's a text / * MIME-Type */
@@ -1474,13 +992,14 @@ static void chat(struct client_state *csp)
             {
                block_popups_now = 1;
                /*
-                * Filter the part of the body that came in the same read
-                * as the last headers:
-                */
-               filter_popups(csp->iob->cur, csp);
+                    * even though the header has been found, don't forget about the
+                    * left over portion of the buffer which will usually contain body text
+                    */
+               n = strlen(csp->iob->cur);
+               filter_popups(csp->iob->cur, n);
             }
 
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
             /* Buffer and pcrs filter this if appropriate. */
 
@@ -1500,32 +1019,25 @@ static void chat(struct client_state *csp)
                content_filter = gif_deanimate_response;
             }
 
+
             /*
              * Only write if we're not buffering for content modification
              */
-            if (!content_filter)
+            if (!content_filter && ((write_socket(csp->cfd, hdr, n) != n)
+                || (n = flush_socket(csp->cfd, csp) < 0)))
             {
-               /* write the server's (modified) header to
-                * the client (along with anything else that
-                * may be in the buffer)
-                */
-
-               if (write_socket(csp->cfd, hdr, strlen(hdr))
-                || ((len = flush_socket(csp->cfd, csp)) < 0))
-               {
-                  log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
+               log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
 
-                  /* the write failed, so don't bother
-                   * mentioning it to the client...
-                   * it probably can't hear us anyway.
-                   */
-                  freez(hdr);
-                  return;
-               }
-
-               byte_count += len;
+               /* the write failed, so don't bother
+                * mentioning it to the client...
+                * it probably can't hear us anyway.
+                */
+               freez(hdr);
+               return;
             }
 
+            !content_filter && (byte_count += n);
+
             /* we're finished with the server's header */
 
             freez(hdr);
@@ -1547,8 +1059,8 @@ static void chat(struct client_state *csp)
       return; /* huh? we should never get here */
    }
 
-   log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d",
-             csp->ip_addr_str, http->ocmd, byte_count);
+   log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d", 
+             csp->ip_addr_str, http->cmd, byte_count); 
 }
 
 
@@ -1574,12 +1086,12 @@ static void serve(struct client_state *csp)
    chat(csp);
    close_socket(csp->cfd);
 
-   if (csp->sfd != JB_INVALID_SOCKET)
+   if (csp->sfd >= 0)
    {
       close_socket(csp->sfd);
    }
 
-   csp->flags &= ~CSP_FLAG_ACTIVE;
+   csp->active = 0;
 
 }
 
@@ -1606,28 +1118,6 @@ static int32 server_thread(void *data)
 #endif
 
 
-/*********************************************************************
- *
- * Function    :  usage
- *
- * Description :  Print usage info & exit.
- *
- * Parameters  :  Pointer to argv[0] for identifying ourselves
- *
- * Returns     :  No. ,-)
- *
- *********************************************************************/
-void usage(const char *myname)
-{
-   printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n"
-           "Usage: %s [--help] [--version] [--no-daemon] [--pidfile pidfile] [--user user[.group]] [configfile]\n"
-           "Aborting.\n", myname);
-   exit(2);
-
-}
-
-
 /*********************************************************************
  *
  * Function    :  main
@@ -1647,116 +1137,50 @@ void usage(const char *myname)
  *                any load fails, and can't bind port.
  *
  *                Else main never returns, the process must be signaled
- *                to terminate execution.  Or, on Windows, use the
+ *                to terminate execution.  Or, on Windows, use the 
  *                "File", "Exit" menu option.
  *
  *********************************************************************/
 #ifdef __MINGW32__
-int real_main(int argc, const char *argv[])
+int _main(int argc, const char *argv[])
 #else
 int main(int argc, const char *argv[])
 #endif
 {
-   int argc_pos = 0;
-#ifdef unix
-   struct passwd *pw = NULL;
-   struct group *grp = NULL;
-   char *p;
-#endif
-
-   Argc = argc;
-   Argv = argv;
-
    configfile =
-#if !defined(_WIN32)
+#ifdef AMIGA
+   "AmiTCP:db/junkbuster/config"
+#elif !defined(_WIN32)
    "config"
 #else
-   "config.txt"
+   "junkbstr.txt"
 #endif
       ;
 
-   /*
-    * Parse the command line arguments
-    */
-   while (++argc_pos < argc)
-   {
 #if !defined(_WIN32) || defined(_WIN_CONSOLE)
-
-      if (strcmp(argv[argc_pos], "--help") == 0)
-      {
-         usage(argv[0]);
-      }
-
-      else if(strcmp(argv[argc_pos], "--version") == 0)
-      {
-         printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n");
-         exit(0);
-      }
-
-      else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0)
-      {
-         no_daemon = 1;
-      }
-#if defined(unix)
-      else if (strcmp(argv[argc_pos], "--pidfile" ) == 0)
-      {
-         if (++argc_pos == argc) usage(argv[0]);
-         pidfile = strdup(argv[argc_pos]);
-      }
-
-      else if (strcmp(argv[argc_pos], "--user" ) == 0)
-      {
-         if (++argc_pos == argc) usage(argv[argc_pos]);
-
-         if ((NULL != (p = strchr(argv[argc_pos], '.'))) && *(p + 1) != '0')
-         {
-            *p++ = '\0';
-            if (NULL == (grp = getgrnam(p)))
-            {
-               log_error(LOG_LEVEL_FATAL, "Group %s not found.", p);
-            }
-         }
-
-         if (NULL == (pw = getpwnam(argv[argc_pos])))
-         {
-            log_error(LOG_LEVEL_FATAL, "User %s not found.", argv[argc_pos]);
-         }
-
-         if (p != NULL) *--p = '\0';
-      }
-#endif /* defined(unix) */
-      else
-#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */
-      {
-         configfile = argv[argc_pos];
-      }
-
-   } /* -END- while (more arguments) */
-
-#if defined(unix)
-   if ( *configfile != '/' )
+   if ((argc >= 2) && (strcmp(argv[1], "--help")==0))
+   {
+      printf("JunkBuster proxy version " VERSION ".\n\n"
+         "Usage: %s [configfile]\n\n"
+         "See " HOME_PAGE_URL " for details.\n"
+         "This program is distributed under the GNU GPL, version 2 or later.\n",
+         argv[0]);
+      exit(2);
+   }
+   if ((argc >= 2) && (strcmp(argv[1], "--version")==0))
    {
-      char *abs_file;
+      printf(VERSION "\n");
+      exit(2);
+   }
+#endif /* !defined(_WIN32) || defined(_WIN_CONSOLE) */
 
-      /* make config-filename absolute here */
-      if ( !(basedir = getcwd( NULL, 1024 )))
-      {
-         perror("get working dir failed");
-         exit( 1 );
-      }
+   Argc = argc;
+   Argv = argv;
 
-      if ( !(abs_file = malloc( strlen( basedir ) + strlen( configfile ) + 5 )))
-      {
-         perror("malloc failed");
-         exit( 1 );
-      }
-      strcpy( abs_file, basedir );
-      strcat( abs_file, "/" );
-      strcat( abs_file, configfile );
-      configfile = abs_file;
+   if (argc > 1)
+   {
+      configfile = argv[1];
    }
-#endif /* defined unix */
-
 
    files->next = NULL;
 
@@ -1766,37 +1190,11 @@ int main(int argc, const char *argv[])
    InitWin32();
 #endif
 
-   /*
-    * Unix signal handling
-    *
-    * Catch the abort, interrupt and terminate signals for a graceful exit
-    * Catch the hangup signal so the errlog can be reopened.
-    * Ignore the broken pipe and child signals
-    *  FIXME: Isn't ignoring the default for SIGCHLD anyway and why ignore SIGPIPE? 
-    */
-#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA)
-{
-   int idx;
-   const int catched_signals[] = { SIGABRT, SIGTERM, SIGINT, SIGHUP, 0 };
-   const int ignored_signals[] = { SIGPIPE, SIGCHLD, 0 };
 
-   for (idx = 0; catched_signals[idx] != 0; idx++)
-   {
-      if (signal(catched_signals[idx], sig_handler) == SIG_ERR)
-      {
-         log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal %d: %E", catched_signals[idx]);
-      }
-   }
+#ifndef _WIN32
+   signal(SIGPIPE, SIG_IGN);
+   signal(SIGCHLD, SIG_IGN);
 
-   for (idx = 0; ignored_signals[idx] != 0; idx++)
-   {
-      if (signal(ignored_signals[idx], SIG_IGN) == SIG_ERR)
-      {
-         log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for signal %d: %E", ignored_signals[idx]);
-      }
-   }
-
-}
 #else /* ifdef _WIN32 */
 # ifdef _WIN_CONSOLE
    /*
@@ -1808,96 +1206,6 @@ int main(int argc, const char *argv[])
 #endif /* def _WIN32 */
 
 
-   /* Initialize the CGI subsystem */
-   cgi_init_error_messages();
-
-   /*
-    * If runnig on unix and without the --nodaemon
-    * option, become a daemon. I.e. fork, detach
-    * from tty and get process group leadership
-    */
-#if defined(unix)
-{
-   pid_t pid = 0;
-#if 0
-   int   fd;
-#endif
-
-   if (!no_daemon)
-   {
-      pid  = fork();
-
-      if ( pid < 0 ) /* error */
-      {
-         perror("fork");
-         exit( 3 );
-      }
-      else if ( pid != 0 ) /* parent */
-      {
-         int status;
-         pid_t wpid;
-         /*
-          * must check for errors
-          * child died due to missing files aso
-          */
-         sleep( 1 );
-         wpid = waitpid( pid, &status, WNOHANG );
-         if ( wpid != 0 )
-         {
-            exit( 1 );
-         }
-         exit( 0 );
-      }
-      /* child */
-#if 1
-      /* Should be more portable, but not as well tested */
-      setsid();
-#else /* !1 */
-#ifdef __FreeBSD__
-      setpgrp(0,0);
-#else /* ndef __FreeBSD__ */
-      setpgrp();
-#endif /* ndef __FreeBSD__ */
-      fd = open("/dev/tty", O_RDONLY);
-      if ( fd )
-      {
-         /* no error check here */
-         ioctl( fd, TIOCNOTTY,0 );
-         close ( fd );
-      }
-#endif /* 1 */
-      /* FIXME: should close stderr (fd 2) here too, but the test
-       * for existence
-       * and load config file is done in listen_loop() and puts
-       * some messages on stderr there.
-       */
-
-      close( 0 );
-      close( 1 );
-      chdir("/");
-
-   } /* -END- if (!no_daemon) */
-
-   /*
-    * As soon as we have written the PID file, we can switch
-    * to the user and group ID indicated by the --user option
-    */
-   write_pid_file();
-   
-   if (NULL != pw)
-   {
-      if (((NULL != grp) && setgid(grp->gr_gid)) || (setgid(pw->pw_gid)))
-      {
-         log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions.");
-      }
-      if (setuid(pw->pw_uid))
-      {
-         log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions.");
-      }
-   }
-}
-#endif /* defined unix */
-
    listen_loop();
 
    /* NOTREACHED */
@@ -1906,78 +1214,6 @@ int main(int argc, const char *argv[])
 }
 
 
-/*********************************************************************
- *
- * Function    :  bind_port_helper
- *
- * Description :  Bind the listen port.  Handles logging, and aborts
- *                on failure.
- *
- * Parameters  :
- *          1  :  config = Privoxy configuration.  Specifies port
- *                         to bind to.
- *
- * Returns     :  Port that was opened.
- *
- *********************************************************************/
-static jb_socket bind_port_helper(struct configuration_spec * config)
-{
-   int result;
-   jb_socket bfd;
-
-   if ( (config->haddr != NULL)
-     && (config->haddr[0] == '1')
-     && (config->haddr[1] == '2')
-     && (config->haddr[2] == '7')
-     && (config->haddr[3] == '.') )
-   {
-      log_error(LOG_LEVEL_INFO, "Listening on port %d for local connections only",
-                config->hport);
-   }
-   else if (config->haddr == NULL)
-   {
-      log_error(LOG_LEVEL_INFO, "Listening on port %d on all IP addresses",
-                config->hport);
-   }
-   else
-   {
-      log_error(LOG_LEVEL_INFO, "Listening on port %d on IP address %s",
-                config->hport, config->haddr);
-   }
-
-   result = bind_port(config->haddr, config->hport, &bfd);
-
-   if (result < 0)
-   {
-      switch(result)
-      {
-         case -3 :
-            log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: "
-               "There may be another Privoxy or some other "
-               "proxy running on port %d",
-               (NULL != config->haddr) ? config->haddr : "INADDR_ANY",
-                      config->hport, config->hport);
-
-         case -2 :
-            log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " 
-               "The hostname is not resolvable",
-               (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport);
-
-         default :
-            log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: because %E",
-               (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport);
-      }
-
-      /* shouldn't get here */
-      return JB_INVALID_SOCKET;
-   }
-
-   config->need_bind = 0;
-
-   return bfd;
-}
-
-
 /*********************************************************************
  *
  * Function    :  listen_loop
@@ -1992,67 +1228,51 @@ static jb_socket bind_port_helper(struct configuration_spec * config)
 static void listen_loop(void)
 {
    struct client_state *csp = NULL;
-   jb_socket bfd;
+   int bfd;
    struct configuration_spec * config;
 
    config = load_config();
 
-   bfd = bind_port_helper(config);
+   log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)",
+             config->haddr ? config->haddr : "INADDR_ANY", config->hport);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-   while (!g_terminate)
-#else
-   for (;;)
-#endif
+   bfd = bind_port(config->haddr, config->hport);
+
+   if (bfd < 0)
+   {
+      log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E "
+         "- There may be another junkbuster or some other "
+         "proxy running on port %d", 
+         (NULL != config->haddr) ? config->haddr : "INADDR_ANY", 
+         config->hport, config->hport
+      );
+      /* shouldn't get here */
+      return;
+   }
+
+   config->need_bind = 0;
+
+
+   while (FOREVER)
    {
-#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
       while (waitpid(-1, NULL, WNOHANG) > 0)
       {
          /* zombie children */
       }
 #endif /* !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
-
-      /*
-       * Free data that was used by died threads
-       */
       sweep();
 
-#if defined(unix)
-      /*
-       * Re-open the errlog after HUP signal
-       */
-      if (received_hup_signal)
-      {
-         init_error_log(Argv[0], config->logfile, config->debug);
-         received_hup_signal = 0;
-      }
-#endif
-
-#ifdef __OS2__
-#ifdef FEATURE_COOKIE_JAR
-      /*
-       * Need a workaround here: we have to fclose() the jarfile, or we die because it's
-       * already open.  I think unload_configfile() is not being run, which should do
-       * this work.  Until that can get resolved, we'll use this workaround.
-       */
-       if (csp)
-         if(csp->config)
-           if (csp->config->jar)
-           {
-             fclose(csp->config->jar);
-             csp->config->jar = NULL;
-           }
-#endif /* FEATURE_COOKIE_JAR */
-#endif /* __OS2__ */
-
       if ( NULL == (csp = (struct client_state *) zalloc(sizeof(*csp))) )
       {
          log_error(LOG_LEVEL_FATAL, "malloc(%d) for csp failed: %E", sizeof(*csp));
          continue;
       }
 
-      csp->flags |= CSP_FLAG_ACTIVE;
-      csp->sfd    = JB_INVALID_SOCKET;
+      memset(csp, '\0', sizeof(*csp));
+
+      csp->active = 1;
+      csp->sfd    = -1;
 
       csp->config = config = load_config();
 
@@ -2073,7 +1293,23 @@ static void listen_loop(void)
 
          close_socket(bfd);
 
-         bfd = bind_port_helper(config);
+         log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)",
+                   config->haddr ? config->haddr : "INADDR_ANY", config->hport);
+         bfd = bind_port(config->haddr, config->hport);
+
+         if (bfd < 0)
+         {
+            log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E "
+               "- There may be another junkbuster or some other "
+               "proxy running on port %d", 
+               (NULL != config->haddr) ? config->haddr : "INADDR_ANY", 
+               config->hport, config->hport
+            );
+            /* shouldn't get here */
+            return;
+         }
+
+         config->need_bind = 0;
       }
 
       log_error(LOG_LEVEL_CONNECT, "accept connection ... ");
@@ -2085,7 +1321,7 @@ static void listen_loop(void)
 #ifdef AMIGA
          if(!childs)
          {
-            exit(1);
+            exit(1); 
          }
 #endif
          freez(csp);
@@ -2096,12 +1332,10 @@ static void listen_loop(void)
          log_error(LOG_LEVEL_CONNECT, "OK");
       }
 
-#ifdef FEATURE_TOGGLE
-      if (g_bToggleIJB)
-      {
-         csp->flags |= CSP_FLAG_TOGGLED_ON;
-      }
-#endif /* def FEATURE_TOGGLE */
+#if defined(TOGGLE)
+      /* by haroon - most of credit to srt19170 */
+      csp->toggled_on = g_bToggleIJB;
+#endif
 
       if (run_loader(csp))
       {
@@ -2109,7 +1343,7 @@ static void listen_loop(void)
          /* Never get here - LOG_LEVEL_FATAL causes program exit */
       }
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
       if (block_acl(NULL,csp))
       {
          log_error(LOG_LEVEL_CONNECT, "Connection dropped due to ACL");
@@ -2117,7 +1351,7 @@ static void listen_loop(void)
          freez(csp);
          continue;
       }
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
       /* add it to the list of clients */
       csp->next = clients->next;
@@ -2138,7 +1372,6 @@ static void listen_loop(void)
             pthread_attr_t attrs;
 
             pthread_attr_init(&attrs);
-            pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
             child_id = (pthread_create(&the_thread, &attrs,
                (void*)serve, csp) ? -1 : 0);
             pthread_attr_destroy(&attrs);
@@ -2148,16 +1381,7 @@ static void listen_loop(void)
 #if defined(_WIN32) && !defined(_CYGWIN) && !defined(SELECTED_ONE_OPTION)
 #define SELECTED_ONE_OPTION
          child_id = _beginthread(
-            (void (*)(void *))serve,
-            64 * 1024,
-            csp);
-#endif
-
-#if defined(__OS2__) && !defined(SELECTED_ONE_OPTION)
-#define SELECTED_ONE_OPTION
-         child_id = _beginthread(
-            (void(* _Optlink)(void*))serve,
-            NULL,
+            (void*)serve,
             64 * 1024,
             csp);
 #endif
@@ -2186,7 +1410,7 @@ static void listen_loop(void)
             NP_Entry, (ULONG)server_thread,
             NP_Output, Output(),
             NP_CloseOutput, FALSE,
-            NP_Name, (ULONG)"privoxy child",
+            NP_Name, (ULONG)"junkbuster child",
             NP_StackSize, 200*1024,
             TAG_DONE)))
          {
@@ -2221,7 +1445,7 @@ static void listen_loop(void)
             wait( NULL );
 #endif /* !defined(_WIN32) && defined(__CYGWIN__) */
             close_socket(csp->cfd);
-            csp->flags &= ~CSP_FLAG_ACTIVE;
+            csp->active = 0;
          }
 #endif
 
@@ -2238,7 +1462,7 @@ static void listen_loop(void)
 
             write_socket(csp->cfd, buf, strlen(buf));
             close_socket(csp->cfd);
-            csp->flags &= ~CSP_FLAG_ACTIVE;
+            csp->active = 0;
             sleep(5);
             continue;
          }
@@ -2248,48 +1472,7 @@ static void listen_loop(void)
          serve(csp);
       }
    }
-
-   /* NOTREACHED unless FEATURE_GRACEFUL_TERMINATION is defined */
-
-   /* Clean up.  Aim: free all memory (no leaks) */
-#ifdef FEATURE_GRACEFUL_TERMINATION
-
-   log_error(LOG_LEVEL_ERROR, "Graceful termination requested");
-
-   unload_current_config_file();
-   unload_current_actions_file();
-   unload_current_re_filterfile();
-#ifdef FEATURE_TRUST
-   unload_current_trust_file();
-#endif
-
-   if (config->multi_threaded)
-   {
-      int i = 60;
-      do
-      {
-         sleep(1);
-         sweep();
-      } while ((clients->next != NULL) && (--i > 0));
-
-      if (i <= 0)
-      {
-         log_error(LOG_LEVEL_ERROR, "Graceful termination failed - still some live clients after 1 minute wait.");
-      }
-   }
-   sweep();
-   sweep();
-
-#if defined(unix)
-   free(basedir);
-#endif
-#if defined(_WIN32) && !defined(_WIN_CONSOLE)
-   /* Cleanup - remove taskbar icon etc. */
-   TermLogWindow();
-#endif
-
-   exit(0);
-#endif /* FEATURE_GRACEFUL_TERMINATION */
+   /* NOTREACHED */
 
 }
 
diff --git a/jcc.h b/jcc.h
index 1778f1e..f2560d3 100644 (file)
--- a/jcc.h
+++ b/jcc.h
@@ -1,6 +1,6 @@
-#ifndef JCC_H_INCLUDED
-#define JCC_H_INCLUDED
-#define JCC_H_VERSION "$Id: jcc.h,v 1.11 2002/03/24 13:25:43 swa Exp $"
+#ifndef _JCC_H
+#define _JCC_H
+#define JCC_H_VERSION "$Id: jcc.h,v 1.2 2001/05/31 21:24:47 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.h,v $
@@ -9,7 +9,7 @@
  *                the main connection-handling function.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: jcc.h,v $
- *    Revision 1.11  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.10  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.9  2002/03/07 03:52:44  oes
- *    Set logging to tty for --no-daemon mode
- *
- *    Revision 1.8  2002/03/04 18:19:49  oes
- *    Added extern const char *pidfile
- *
- *    Revision 1.7  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.6  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.5  2001/07/29 19:32:00  jongfoster
- *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
- *
- *    Revision 1.4  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.3  2001/07/18 12:31:58  oes
- *    moved #define freez from jcc.h to project.h
- *
  *    Revision 1.2  2001/05/31 21:24:47  jongfoster
  *    Changed "permission" to "action" throughout.
  *    Removed DEFAULT_USER_AGENT - it must now be specified manually.
  *********************************************************************/
 \f
 
+/* Declare struct FILE for vars and funcs. */
+#include <stdio.h>
+
+/* All of our project's data types. */
+#include "project.h"
+
+#include "loadcfg.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-struct client_state;
-struct file_list;
-
 /* Global variables */
 
-#ifdef FEATURE_STATISTICS
+#ifdef STATISTICS
 extern int urls_read;
 extern int urls_rejected;
-#endif /*def FEATURE_STATISTICS*/
+#endif /*def STATISTICS*/
 
 extern struct client_state clients[];
-extern struct file_list    files[];
 
-#ifdef unix
-extern const char *pidfile;
-#endif
-extern int no_daemon;
+extern struct file_list    files[];
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-extern int g_terminate;
-#endif
 
 /* Functions */
 
 #ifdef __MINGW32__
-int real_main(int argc, const char *argv[]);
+int _main(int argc, const char *argv[]);
 #else
 int main(int argc, const char *argv[]);
 #endif
@@ -131,7 +88,7 @@ extern const char jcc_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef JCC_H_INCLUDED */
+#endif /* ndef _JCC_H */
 
 /*
   Local Variables:
diff --git a/junkbuster-rh.spec b/junkbuster-rh.spec
new file mode 100644 (file)
index 0000000..a20194f
--- /dev/null
@@ -0,0 +1,302 @@
+# $Id: junkbuster-rh.spec,v 1.10 2001/07/03 09:34:44 sarantis Exp $
+#
+# Written by and Copyright (C) 2001 the SourceForge
+# IJBSWA team.  http://ijbswa.sourceforge.net
+#
+# Based on the Internet Junkbuster originally written
+# by and Copyright (C) 1997 Anonymous Coders and 
+# Junkbusters Corporation.  http://www.junkbusters.com
+#
+# This program is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will
+# be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.  See the GNU General Public
+# License for more details.
+#
+# The GNU General Public License should be included with
+# this file.  If not, you can view it at
+# http://www.gnu.org/copyleft/gpl.html
+# or write to the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# $Log: junkbuster-rh.spec,v $
+# Revision 1.10  2001/07/03 09:34:44  sarantis
+# bumped up version number.
+#
+# Revision 1.9  2001/06/12 18:15:29  swa
+# the % in front of configure (see tag below) confused
+# the rpm build process on 7.1.
+#
+# Revision 1.8  2001/06/12 17:15:56  swa
+# fixes, because a clean build on rh6.1 was impossible.
+# GZIP confuses make, % configure confuses rpm, etc.
+#
+# Revision 1.7  2001/06/11 12:17:26  sarantis
+# fix typo in %post
+#
+# Revision 1.6  2001/06/11 11:28:25  sarantis
+# Further optimizations and adaptations in the spec file.
+#
+# Revision 1.5  2001/06/09 09:14:11  swa
+# shamelessly adapted RPM stuff from the newest rpm that
+# RedHat provided for the JB.
+#
+# Revision 1.4  2001/06/08 20:54:18  swa
+# type with status file. remove forward et. al from file list.
+#
+# Revision 1.3  2001/06/07 17:28:10  swa
+# cosmetics
+#
+# Revision 1.2  2001/06/04 18:31:58  swa
+# files are now prefixed with either `confdir' or `logdir'.
+# `make redhat-dist' replaces both entries confdir and logdir
+# with redhat values
+#
+# Revision 1.1  2001/06/04 10:44:57  swa
+# `make redhatr-dist' now works. Except for the paths
+# in the config file.
+#
+#
+#
+Summary: The Internet Junkbuster
+Vendor: http://ijbswa.sourceforge.net
+Name: junkbuster
+Version: 2.9.5
+Release: 1
+Source0: http://www.waldherr.org/junkbuster/ijbswa.tar.gz
+Copyright: GPL
+BuildRoot: %{_tmppath}/%{name}-root
+Group: Networking/Utilities
+URL: http://ijbswa.sourceforge.net/
+Packager: Stefan Waldherr <stefan@waldherr.org>
+Obsoletes: junkbuster-raw junkbuster-blank
+Prereq: /usr/sbin/useradd , /sbin/chkconfig , /sbin/service 
+Conflicts: junkbuster-raw junkbuster-blank
+
+%description
+The Internet Junkbuster stops your browser from displaying the
+advertisement images that pervade many commercial web pages.  Since
+your browser has to download fewer images, surfing the web should be
+faster.
+
+%define ijbconf %{_sysconfdir}/junkbuster
+
+%prep
+%setup -c -n ijbswa
+
+%build
+./configure
+make
+strip junkbuster
+
+%pre
+/usr/sbin/useradd -d /etc/junkbuster -u 73 -r junkbust > /dev/null 2>&1 || /bin/true
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} \
+         ${RPM_BUILD_ROOT}%{_mandir}/man8 \
+         ${RPM_BUILD_ROOT}/var/log/junkbuster \
+         ${RPM_BUILD_ROOT}%{ijbconf}/templates \
+         ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d \
+         ${RPM_BUILD_ROOT}%{_sysconfdir}/rc.d/init.d
+
+install -s -m 744 junkbuster $RPM_BUILD_ROOT%{_sbindir}/junkbuster
+cp -f junkbuster.1 $RPM_BUILD_ROOT%{_mandir}/man8/junkbuster.8
+cp -f actionsfile $RPM_BUILD_ROOT%{ijbconf}/actionsfile
+cp -f re_filterfile $RPM_BUILD_ROOT%{ijbconf}/re_filterfile
+cp -f trust $RPM_BUILD_ROOT%{ijbconf}/trust
+cp -f templates/default $RPM_BUILD_ROOT%{ijbconf}/templates/
+cp -f templates/show-status  $RPM_BUILD_ROOT%{ijbconf}/templates/
+cp -f templates/show-status-file  $RPM_BUILD_ROOT%{ijbconf}/templates/
+cp -f junkbuster.logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/junkbuster
+install -m 755 junkbuster.init $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/junkbuster
+install -m 744 -d $RPM_BUILD_ROOT/var/log/junkbuster
+
+# verify all file locations, etc. in the config file
+# don't start with ^ or commented lines are not replaced
+cat config | \
+    sed 's/^confdir.*/confdir \/etc\/junkbuster/g' | \
+#    sed 's/^permissionsfile.*/permissionsfile \/etc\/junkbuster\/permissionsfile/g' | \
+#    sed 's/^re_filterfile.*/re_filterfile \/etc\/junkbuster\/re_filterfile/g' | \
+#    sed 's/^logfile.*/logfile \/var\/log\/junkbuster\/logfile/g' | \
+#    sed 's/^jarfile.*/jarfile \/var\/log\/junkbuster\/jarfile/g' | \
+#    sed 's/^forward.*/forward \/etc\/junkbuster\/forward/g' | \
+#    sed 's/^aclfile.*/aclfile \/etc\/junkbuster\/aclfile/g' > \
+    sed 's/^logdir.*/logdir \/var\/log\/junkbuster/g' > \
+    $RPM_BUILD_ROOT%{ijbconf}/config
+
+%post
+if [ "$1" = "1" ]; then
+        /sbin/chkconfig --add junkbuster
+fi
+
+%preun
+if [ "$1" = "0" ]; then
+       /sbin/service junkbuster stop > /dev/null 2>&1 ||:
+       /sbin/chkconfig --del junkbuster
+fi
+
+%postun
+if [ "$1" -ge "1" ]; then
+       /sbin/service junkbuster condrestart > /dev/null 2>&1
+fi
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+# %doc ijbfaq.html ijbman.html README README.TOO gpl.html
+%doc junkbuster.weekly junkbuster.monthly
+%dir %{ijbconf}
+%config %{ijbconf}/*
+%attr(0744,junkbust,junkbust) %dir /var/log/junkbuster
+%config %{_sysconfdir}/logrotate.d/junkbuster
+%attr(0744,junkbust,junkbust)/usr/sbin/junkbuster
+%{_mandir}/man8/*
+%config %{_sysconfdir}/rc.d/init.d/junkbuster
+
+
+%changelog
+
+* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
+- rework of RPM
+
+* Mon Sep 25 2000 Stefan Waldherr <stefan@waldherr.org>
+- CLF Logging patch by davep@cyw.uklinux.net
+- Hal DeVore <haldevore@earthling.net> fix akamaitech in blocklist
+
+* Sun Sep 17 2000 Stefan Waldherr <stefan@waldherr.org>
+- Steve Kemp skx@tardis.ed.ac.uk's javascript popup patch.
+- Markus Breitenbach breitenb@rbg.informatik.tu-darmstadt.de supplied
+  numerous fixes and enhancements for Steve's patch.
+- adamlock@netscape.com (Adam Lock) in the windows version:
+  - Taskbar activity spinner always spins even when logging is
+  turned off (which is the default) - people who don't
+  like the spinner can turn it off from a menu option.
+  - Taskbar popup menu has a options submenu - people can now
+  open the settings files for cookies, blockers etc.
+  without opening the JB window.
+  - Logging functionality works again
+  - Buffer overflow is fixed - new code uses a bigger buffer
+  and snprintf so it shouldn't overflow anymore.
+- Fixed userid swa, group learning problem while installing.
+  root must build RPM.
+- Added patch by Benjamin Low <ben@snrc.uow.edu.au> that prevents JB to
+  core dump when there is no log file.
+- Tweaked SuSE startup with the help of mohataj@gmx.net and Doc.B@gmx.de.
+- Fixed man page to include imagefile and popupfile.
+- Sanity check for the statistics function added.
+- "Patrick D'Cruze" <pdcruze@orac.iinet.net.au>: It seems Microsoft
+ are transitioning Hotmail from FreeBSD/Apache to Windows 2000/IIS.
+ With IIS/5, it appears to omit the trailing \r\n from http header
+ only messages.  eg, when I visit http://www.hotmail.com, IIS/5
+ responds with a HTTP 302 redirect header.  However, this header
+ message is missing the trailing \r\n.  IIS/5 then closes the
+ connection.  Junkbuster, unfortunately, discards the header becomes
+ it thinks it is incomplete - and it is.  MS have transmitted an
+ incomplete header!
+- Added bug reports and patch submission forms in the docs.
+
+* Mon Mar 20 2000 Stefan Waldherr <stefan@waldherr.org>
+       Andrew <anw@tirana.freewire.co.uk> extended the JB:
+       Display of statistics of the total number of requests and the number
+       of requests filtered by junkbuster, also the percentage of requests
+       filtered. Suppression of the listing of files on the proxy-args page.
+       All stuff optional and configurable.
+
+* Sun Sep 12 1999 Stefan Waldherr <stefan@waldherr.org>
+       Jan Willamowius (jan@janhh.shnet.org) fixed a bug in the 
+       code which prevented the JB from handling URLs of the form
+       user:password@www.foo.com. Fixed.
+
+* Mon Aug  2 1999 Stefan Waldherr <stefan@waldherr.org>
+       Blank images are no longer cached, thanks to a hint from Markus 
+        Breitenbach <breitenb@rbg.informatik.tu-darmstadt.de>. The user 
+        agent is NO longer set by the Junkbuster. Sadly, many sites depend 
+        on the correct browser version nowadays. Incorporated many 
+       suggestions from Jan "Yenya" Kasprzak <kas@fi.muni.cz> for the
+        spec file. Fixed logging problem and since runlevel 2 does not 
+        use networking, I replaced /etc/rc.d/rc2.d/S84junkbuster with
+        /etc/rc.d/rc2.d/K09junkbuster thanks to Shaw Walker 
+        <walker@netgate.net>. You should now be able to build this RPM as 
+        a non-root user (mathias@weidner.sem.lipsia.de).
+
+* Sun Jan 31 1999 Stefan Waldherr <stefan@waldherr.org>
+       /var/log/junkbuster set to nobody. Added /etc/junkbuster/imagelist
+       to allow more sophisticated matching of blocked images. Logrotate
+       logfile. Added files for auto-updating the blocklist et al.
+
+* Wed Dec 16 1998 Stefan Waldherr <stefan@waldherr.org>
+       Configure blank version via config file. No separate blank
+       version anymore. Added Roland's <roland@spinnaker.rhein.de>
+       patch to show a logo instead of a blank area. Added a suggestion
+       from Alex <alex@cocoa.demon.co.uk>: /var/lock/subsys/junkbuster.
+       More regexps in the blocklist. Prepared the forwardfile for
+       squid. Extended image regexp with help from gabriel 
+       <somlo@CS.ColoState.EDU>.
+
+* Thu Nov 19 1998 Stefan Waldherr <stefan@waldherr.org>
+       All RPMs now identify themselves in the show-proxy-args page.
+       Released Windoze version. Run junkbuster as nobody instead of
+       root. 
+
+* Fri Oct 30 1998 Stefan Waldherr <stefan@waldherr.org>
+       Newest version. First release (hence the little version number
+       mixture -- 2.0.2-0 instead of 2.0-7). This version tightens 
+       security over 2.0.1; some multi-user sites will need to change 
+       the listen-address in the configuration file. The blank version of
+        the Internet Junkbuster has a more sophisticated way of replacing
+       images. All RPMs identify themselves in the show-proxy-args page.
+
+* Thu Sep 23 1998 Stefan Waldherr <stefan@waldherr.org>
+       Modified the blocking feature, so that only GIFs and JPEGs are
+       blocked and replaced but not HTML pages. Thanks to 
+       "Gerd Flender" <plgerd@informatik.uni-siegen.de> for this nice
+       idea. Added numerous stuff to the blocklist. Keep patches in
+        seperate files and no longer in diffs (easier to maintain).
+
+* Tue Jun 16 1998 Stefan Waldherr <swa@cs.cmu.edu>
+        Moved config files to /etc/junkbuster directory, moved man page,
+       added BuildRoot directive (Thanks to Alexey Nogin <ayn2@cornell.edu>)
+        Made new version junkbuster-raw (which is only a stripped version of 
+        the junkuster rpm, i.e. without my blocklist, etc.)
+
+* Tue Jun 16 1998 (2.0-1)
+       Uhm, not that much. Just a new junkbuster version that
+       fixes a couple of bugs ... and of course a bigger 
+       blocklist with the unique Now-less-ads-than-ever(SM)
+       feature.
+       Oh, one thing: I changed the default user agent to Linux -- no 
+       need anymore to support Apple.
+
+* Tue Jun 16 1998 (2.0-0)
+       Now-less-ads-than-ever (SM)
+       compiled with gcc instead of cc
+       compiled with -O3, thus it should be a little faster
+       show-proxy-args now works
+       /etc/junkbuster.init wasn't necessary
+
+* Tue Jun 16 1998 (1.4)
+       some more config files were put into /etc
+       The junkbuster-blank rpm returns a 1x1 pixel image, that gets 
+       displayed by Netscape instead of the blocked image.
+       Read http://www.waldherr.org/junkbuster/ for
+       further info.
+
+* Tue Jun 16 1998 (1.3)
+       The program has been moved to /usr/sbin (from /usr/local/bin)
+       Init- and stopscripts (/etc/rc.d/rc*) have been added so
+       that the junkbuster starts automatically during bootup.
+       The /etc/blocklist file is much more sophisticated. Theoretically
+       one should e.g. browse all major US and German newspapers without
+       seeing one annoying ad.
+       junkbuster.init was modified. It now starts junkbuster with an
+       additional "-r @" flag.
diff --git a/junkbuster-suse.spec b/junkbuster-suse.spec
new file mode 100644 (file)
index 0000000..9218a2f
--- /dev/null
@@ -0,0 +1,175 @@
+# $Id: junkbuster-suse.spec,v 1.4 2001/06/08 20:53:36 swa Exp $
+#
+# Written by and Copyright (C) 2001 the SourceForge
+# IJBSWA team.  http://ijbswa.sourceforge.net
+#
+# Based on the Internet Junkbuster originally written
+# by and Copyright (C) 1997 Anonymous Coders and 
+# Junkbusters Corporation.  http://www.junkbusters.com
+#
+# This program is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will
+# be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.  See the GNU General Public
+# License for more details.
+#
+# The GNU General Public License should be included with
+# this file.  If not, you can view it at
+# http://www.gnu.org/copyleft/gpl.html
+# or write to the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# $Log: junkbuster-suse.spec,v $
+# Revision 1.4  2001/06/08 20:53:36  swa
+# use buildroot, export init to separate file (better manageability)
+#
+# Revision 1.3  2001/06/07 17:28:10  swa
+# cosmetics
+#
+# Revision 1.2  2001/06/07 17:18:44  swa
+# header fixed
+#
+#
+# neededforbuild  -ijb
+# usedforbuild    -ijb aaa_base aaa_dir autoconf automake base bash bindutil binutils bison bzip compress cpio cracklib db devs diffutils e2fsprogs file fileutils findutils flex gawk gcc gdbm gdbm-devel gettext glibc glibc-devel gpm gppshare groff gzip kbd less libtool libz lx_suse make mktemp modutils ncurses ncurses-devel net-tools netcfg nkitb pam pam-devel patch perl pgp ps rcs rpm sendmail sh-utils shadow strace syslogd sysvinit texinfo textutils timezone unzip util-linux vim xdevel xf86 xshared
+
+Vendor:       http://ijbswa.sourceforge.net
+Distribution: defineme
+Name:         junkbuster
+Packager:     Stefan Waldherr <stefan@waldherr.org>
+
+Copyright:    GPL
+BuildRoot: /tmp/junkbuster-rpmbuild
+Group:        Networking/Utilities
+Provides:     ijb
+Obsoletes:    ijb
+Autoreqprov:  on
+Version: 2.9
+Release: 4
+Summary:      The Internet Junkbuster
+Source:  http://www.waldherr.org/junkbuster/ijbswa.tar.gz
+
+#
+# -----------------------------------------------------------------------------
+#
+%description
+The Internet Junkbuster stops your browser from displaying the
+advertisement images that pervade many commercial web pages.  Since
+your browser has to download fewer images, surfing the web should be
+faster.
+
+Authors:
+--------
+    http://ijbswa.sourceforge.net
+
+SuSE series: n
+
+#
+# -----------------------------------------------------------------------------
+#
+%prep
+%setup -c -n ijbswa
+
+#
+# -----------------------------------------------------------------------------
+#
+%build
+./configure
+make
+
+#
+# -----------------------------------------------------------------------------
+#
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/{var/log/junkbuster,usr/{sbin,share/man/man1},etc/{junkbuster,junkbuster/templates,init.d}}
+
+install -m 755 junkbuster.init.suse $RPM_BUILD_ROOT/etc/init.d/junkbuster
+ln -sf $RPM_BUILD_ROOT/etc/init.d/junkbuster $RPM_BUILD_ROOT/usr/sbin/rcjunkbuster
+
+install -m 755 junkbuster $RPM_BUILD_ROOT/usr/sbin
+install -d $RPM_BUILD_ROOT/etc/junkbuster
+install -d $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 permissionsfile $RPM_BUILD_ROOT/etc/junkbuster
+install -m 644 re_filterfile $RPM_BUILD_ROOT/etc/junkbuster
+# verify all file locations, etc. in the config file
+# don't start with ^ or commented lines are not replaced
+cat config | \
+    sed 's/^confdir.*/confdir \/etc\/junkbuster/g' | \
+#    sed 's/^permissionsfile.*/permissionsfile \/etc\/junkbuster\/permissionsfile/g' | \
+#    sed 's/^re_filterfile.*/re_filterfile \/etc\/junkbuster\/re_filterfile/g' | \
+#    sed 's/^logfile.*/logfile \/var\/log\/junkbuster\/logfile/g' | \
+#    sed 's/^jarfile.*/jarfile \/var\/log\/junkbuster\/jarfile/g' | \
+#    sed 's/^forward.*/forward \/etc\/junkbuster\/forward/g' | \
+#    sed 's/^aclfile.*/aclfile \/etc\/junkbuster\/aclfile/g' > \
+    sed 's/^logdir.*/logdir \/var\/log\/junkbuster/g' > \
+    config.tmp
+cp -f config.tmp config
+install -m 644 config $RPM_BUILD_ROOT/etc/junkbuster
+#install -m 644 forward $RPM_BUILD_ROOT/etc/junkbuster
+install -m 644 trust $RPM_BUILD_ROOT/etc/junkbuster
+install -m 644 templates/default $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 templates/show-status $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 templates/show-status-file $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 junkbuster.1 $RPM_BUILD_ROOT/usr/share/man/man1
+%{?suse_check}
+
+#
+# -----------------------------------------------------------------------------
+#
+%post
+sbin/insserv etc/init.d/junkbuster
+
+#
+# -----------------------------------------------------------------------------
+#
+%postun
+sbin/insserv etc/init.d/
+
+#
+# -----------------------------------------------------------------------------
+#
+%files
+#%doc README *.html
+/usr/sbin/junkbuster
+/usr/share/man/man1/junkbuster.1.gz
+%config(noreplace) /etc/junkbuster
+/etc/init.d/junkbuster
+/usr/sbin/rcjunkbuster
+
+#
+# -----------------------------------------------------------------------------
+#
+%changelog -n junkbuster
+* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
+- rework of RPM
+* Wed Feb 14 2001 - uli@suse.de
+- fixed init script
+* Wed Dec 06 2000 - bjacke@suse.de
+- renamed package to junkbuster
+- fixed copyright tag
+* Thu Nov 30 2000 - uli@suse.de
+- moved init script to /etc/init.d
+* Wed Feb 16 2000 - kukuk@suse.de
+- Move /usr/man -> /usr/share/man
+- Mark /etc/ijb as "config(noreplace)"
+* Mon Sep 20 1999 - uli@suse.de
+- fixed init script
+* Mon Sep 13 1999 - bs@suse.de
+- ran old prepare_spec on spec file to switch to new prepare_spec.
+* Thu Apr 01 1999 - daniel@suse.de
+- do not start ijb as root (security)
+* Tue Mar 30 1999 - daniel@suse.de
+- don´t use saclfile.ini
+* Tue Mar 30 1999 - daniel@suse.de
+- small fix to whitelist-configuration,
+  version is and was 2.0.2 WITHOUT Stefan Waldherr's patches
+  (http://www.waldherr.org/junkbuster/)
+* Mon Mar 01 1999 - daniel@suse.de
+- new package: version 2.0
diff --git a/junkbuster.1 b/junkbuster.1
new file mode 100644 (file)
index 0000000..d88294d
--- /dev/null
@@ -0,0 +1,871 @@
+.TH JUNKBUSTER 1 "http://www.junkbusters.com/ht/en/ijb2.0man.html"\r
+.SH NAME\r
+\fBjunkbuster\fP\r
+- The\r
+Internet Junkbuster\r
+Proxy\r
+\s-2(TM)\s+2\r
+.SH SYNOPSIS\r
+\fBjunkbuster\fP\r
+\fI\&configfile\fP\r
+(Version 2.0 onwards)\r
+.br\r
+\fBjunkbstr.exe\fP\r
+\fI\&configfile\fP\r
+(Windows)\r
+.br\r
+\fBjunkbuster\fP\r
+[-a]\r
+[-y]\r
+[-s]\r
+[-c]\r
+[-v]\r
+.br\r
+[-u user_agent]\r
+[-r referer]\r
+[-t from]\r
+.br\r
+[-b blockfile]\r
+[-j jarfile]\r
+[-l logfile]\r
+.br\r
+[-w NAME=VALUE]\r
+[-x Header_text]\r
+.br\r
+[-h [bind_host_address][:bind_port]]\r
+.br\r
+[-f forward_host[:port]]\r
+[-d N]\r
+.br\r
+[-g gw_protocol[:[gw_host][:gw_port]]]\r
+.br\r
+(Version 1.4 and earlier)\r
+.SH DESCRIPTION\r
+\fBjunkbuster\fP\r
+is an instrumentable proxy that filters the \r
+\s-2HTTP\s0\r
+stream between\r
+web servers and browsers.\r
+Its main purpose is to enhance privacy.\r
+.P\r
+Versions before 2.0 used command-line options;\r
+Versions from 2.0 onward use a configuration file.\r
+The following descriptions of the options first give the older\r
+command-line usage, then the new configfile line.\r
+.P\r
+In Versions 2.0.1 upwards on Windows,\r
+a start-up message is printed and the configuration is read from the file\r
+\fC\&junkbstr.ini\fP\r
+if it exists and no argument was given.\r
+.P\r
+All files except the configfile\r
+are checked for changes before each page is fetched,\r
+so they may edited without restarting the proxy.\r
+.SS OPTIONS\r
+.TP\r
+.\" anchor: o_b blockfile\r
+\fI-b blockfile\fP (Old) blockfile \fIblockfile\fP (New)\r
+Block\" ijbfaq.html#blocking\r
+requests to\r
+\s-2URL\s0s\r
+matching any pattern given in the lines of the\r
+\fI\&blockfile\fP.\r
+The\r
+\fBjunkbuster\fP\r
+instead returns status 202, indicating that the request has been accepted\r
+(though not completed),\r
+and a\r
+message identifying itself\" ijbfaq.html#show\r
+(though the browser may\r
+display only a broken image icon).\r
+(Versions before 2.0 returned an error 403 (Forbidden).)\r
+The syntax of a pattern is\r
+\fB\&[domain][:port][/path]\fP\r
+(the\r
+\fB\&http://\fP\r
+or\r
+\fB\&https://\fP\r
+protocol part is omitted).\r
+To decide if a pattern matches a target, the domains are compared first,\r
+then the paths. \r
+.P\r
+To compare the domains,\r
+the pattern domain and the target\r
+domain specified in the\r
+\s-2URL\s0\r
+are each broken into their components.\r
+(Components are separated by the\r
+\fC\&.\fP\r
+(period) character.)\r
+Next each of the target components\r
+is compared with the corresponding pattern component: last with last,\r
+next-to-last with next-to-last, and so on.\r
+(This is called\r
+\fIright-anchored\fP\r
+matching.)\r
+If all of the pattern components find their match in the target,\r
+then the domains are considered a match.\r
+Case is irrelevant when comparing domain components.\r
+.P\r
+A successfully\r
+matching pattern can be an anchored substring of a target, but\r
+not vice versa.\r
+Thus if a pattern doesn't specify a domain,\r
+it matches all domains.\r
+.\" anchor: wildcard\r
+Furthermore, when comparing two components,\r
+the components must either match in their entirety or up to a wildcard\r
+\fC\&* \fP\r
+(star character) in the pattern.  The wildcard feature\r
+implements only a "prefix" match capability ("abc*" vs. "abcdefg"),\r
+not suffix matching ("*efg" vs. "abcdefg") or\r
+infix matching ("abc*efg" vs. "abcdefg").\r
+The feature is restricted to the domain component;\r
+it is unrelated to the optional\r
+regular expression\r
+feature in the path\r
+(described below).\" ijbman.html#regex\r
+.P\r
+If a numeric port\r
+is specified in the pattern domain, then the target port must\r
+match as well.  The default port in a target is port 80.\r
+.P\r
+If the domain and port match,\r
+then the target\r
+\s-2URL\s0\r
+path is checked for\r
+a match against the path in the pattern.\r
+Paths are compared with a simple case-sensitive\r
+left-anchored substring comparison.\r
+Once again, the pattern can be an\r
+anchored substring of the target, but not vice versa.\r
+A path of\r
+\fC\&/\fP\r
+(slash) would match all paths.  Wildcards are not considered in\r
+path comparisons.\r
+.P\r
+For example, the target\r
+\s-2URL\s0\r
+.br\r
+.ti +0.25i\r
+\fB\&the.yellow-brick-road.com/TinMan/has_no_brain\fP\r
+.br\r
+would be matched (and blocked) by the following patterns\r
+.br\r
+.ti +0.25i\r
+\fB\&yellow-brick-road.com\fP\r
+.br\r
+and\r
+.br\r
+.ti +0.25i\r
+\fB\&Yellow*.COM\fP\r
+.br\r
+and\r
+.br\r
+.ti +0.25i\r
+\fB\&/TinM\fP\r
+.br\r
+but not\r
+.br\r
+.ti +0.25i\r
+\fB\&follow.the.yellow-brick-road.com\fP\r
+.br\r
+or\r
+.br\r
+.ti +0.25i\r
+\fB\&/tinman\fP\r
+.br\r
+.P\r
+Comments in a blockfile start with a\r
+\fB\&#\fP\r
+(hash) character and end at a new line.\r
+Blank lines are also ignored.\r
+.P\r
+Lines beginning with a\r
+\fC\&~\fP\r
+(tilde) character are taken to be\r
+exceptions:\" ijbfaq.html#exceptions\r
+a\r
+\s-2URL\s0\r
+blocked by previous patterns that matches the rest of\r
+the line is let through. (The last match wins.)\r
+.P\r
+Patterns\r
+may contain\r
+\s-2POSIX\s0\r
+regular expressions\" ijbfaq.html#regex\r
+provided the\r
+\fBjunkbuster\fP\r
+was compiled with this option\r
+(the default in Version 2.0 on).\r
+The idiom\r
+\fC\&/*.*/ad\fP\r
+can then be used\r
+to match any\r
+\s-2URL\s0\r
+containing\r
+\fC\&/ad\fP\r
+(such as\r
+\fC\&http://nomatterwhere.com/images/advert/g3487.gif\fP\r
+for example).\r
+These expressions\r
+don't work\" ijbman.html#substring\r
+in the domain part.\r
+.P\r
+In version 1.3 and later\r
+the blockfile and cookiefile are checked for changes before each request.\r
+.TP\r
+tinygif \fIN\fP\r
+Set appearance of blocked GIFs. You can select one of the following\r
+values:\r
+.br\r
+.br\r
+\h'-\w"0 = "u'0 = Show a ``broken icon'' in the browser\r
+.br\r
+\h'-\w"1 = "u'1 = Show a one pixel transparent GIF\r
+.br\r
+\h'-\w"2 = "u'2 = Show a GIF with the word ``JUNKBUSTER''\r
+.TP\r
+popupfile \fI\&popup\fP\r
+Sets the name of the popupfile. If uncommented, the popupfile\r
+controls on which sites Javascript popup windows are disabled.\r
+.TP\r
+.\" anchor: o_w wafer\r
+\fI-w NAME=VALUE\fP (Old) wafer \fINAME=VALUE\fP (New)\r
+Specifies a pair to be sent as a cookie with every request\r
+to the server.\" ijbfaq.html#wafers\r
+(Such boring cookies are called\r
+\fI\&wafers\fP.)\r
+This option may be called more than once to generate multiple wafers.\r
+The original\r
+Netscape specification\r
+prohibited\r
+semi-colons, commas and white space;\r
+these characters will be\r
+\s-2URL\s0-encoded\r
+if used in wafers.\r
+The Path and Domain attributes are not currently supported.\r
+.TP\r
+.\" anchor: o_c cookiefile\r
+\fI-c cookiefile\fP (Old) cookiefile \fIcookiefile\fP (New)\r
+Enforce the cookie management policy specified in the\r
+\fI\&cookiefile.\fP\r
+.\" anchor: java\r
+If this option is not used all cookies are silently crunched,\r
+so that users who never want cookies aren't bothered by browsers\r
+asking whether each cookie should be accepted.\r
+However, cookies can\r
+still get through\" ijbfaq.html#breakthrough\r
+via\r
+JavaScript\" links.html#javascript\r
+and\r
+\s-2SSL\s0,\r
+so alerts should be left on.\r
+.P\r
+In Version 1.2 and later\r
+this option must be followed by a\r
+filename\" ijbfaq.html#crumble\r
+containing instructions on which sites are allowed to\r
+receive and set cookies.\r
+.\" anchor: drop\r
+By default cookies are dropped in both the browser's request\r
+and the server's response, unless the\r
+\s-2URL\s0\r
+requested matches an entry in the\r
+\fI\&cookiefile\fP.\r
+The matching algorithm is the same as for the blockfile.\r
+A leading\r
+\fC\&>\fP\r
+character allows\r
+server-bound\" ijbfaq.html#directional\r
+cookies only;\r
+a\r
+\fC\&<\fP\r
+allows only browser-bound cookies;\r
+a\r
+\fC\&~\fP\r
+character stops cookies in\r
+both directions.\" ijbfaq.html#crumble\r
+Thus a cookiefile containing a single line with the two characters\r
+\fC\&>*\fP\r
+will pass on all cookies to servers but not give any new ones to the browser.\r
+.TP\r
+.\" anchor: o_j jarfile\r
+\fI-j jarfile\fP (Old) jarfile \fIjarfile\fP (New)\r
+All Set-cookie attempts by the server are\r
+logged\" ijbfaq.html#jar\r
+to\r
+\fI\&jarfile\fP.\r
+If no wafer is specified,\r
+one containing a\r
+canned notice\" ijbfaq.html#notice\r
+(the \r
+\fI\&vanilla wafer\fP)\r
+is added as an alert to the server\r
+unless the\r
+suppress-vanilla-wafer\" ijbman.html#suppress-vanilla-wafer\r
+option is invoked.\r
+.TP\r
+.\" anchor: o_v suppress-vanilla-wafer\r
+\fI-v\fP (Old) suppress-vanilla-wafer \fI\fP (New)\r
+Suppress the vanilla wafer.\r
+.TP\r
+.\" anchor: o_t from\r
+\fI-t from\fP (Old) from \fIfrom\fP (New)\r
+If the browser\r
+discloses an email address\" ijbfaq.html#from\r
+in the\r
+\fB\&FROM\fP\r
+header (most don't),\r
+replace it with\r
+\fI\&from.\fP\r
+If\r
+\fI\&from\fP\r
+is set to\r
+\fB\&.\fP\r
+(the period character)\r
+the\r
+\fB\&FROM\fP\r
+is passed to the server unchanged.\r
+The default is to delete the\r
+\fB\&FROM\fP\r
+header.\r
+.TP\r
+.\" anchor: o_r referer\r
+\fI-r referer\fP (Old) referer \fIreferer\fP (New)\r
+Whenever the browser discloses the\r
+\s-2URL\s0\r
+that\r
+led to\" ijbfaq.html#referer\r
+the current request,\r
+replace it with\r
+\fI\&referer.\fP\r
+If\r
+\fI\&referer\fP\r
+is set to\r
+\fB\&.\fP\r
+(period)\r
+the \r
+\s-2URL\s0\r
+is passed to the server unchanged.\r
+In \r
+Version 1.4\r
+and later, if referer is set to \r
+\fB\&@\fP\r
+(at) the\r
+\s-2URL\s0\r
+is sent in cases where the cookiefile\r
+specifies that a cookie would be sent.\r
+(No way to send bogus referers selectively is provided.)\r
+The default is to delete Referer.\r
+.P\r
+Version 2.0 also accepts the spelling\r
+\fC\&referrer\fP,\r
+which most dictionaries consider correct.\r
+.TP\r
+.\" anchor: o_u user-agent\r
+\fI-u user-agent\fP (Old) user-agent \fIuser-agent\fP (New)\r
+Information disclosed by the browser\r
+about itself\" ijbfaq.html#agent\r
+is replaced with the value\r
+\fI\&user-agent.\fP\r
+If\r
+\fI\&user-agent\fP\r
+is set to\r
+\fB\&.\fP\r
+(period)\r
+the\r
+\fB\&User-Agent\fP\r
+header is passed to the server unchanged,\r
+along with any\r
+\fB\&UA\fP\r
+headers produced by\r
+\s-2MS-IE\s0\r
+(which would otherwise be deleted).\r
+In \r
+Version 1.4\r
+and later, if\r
+\fI\&user-agent\fP\r
+is set to\r
+\fB\&@\fP\r
+(at) these headers are sent unchanged in cases where the cookiefile\r
+specifies that a cookie would be sent,\r
+otherwise only default\r
+\fB\&User-Agent\fP\r
+header is sent.\r
+That default\r
+is Mozilla/3.0 (Netscape)\r
+with an unremarkable\r
+Macintosh\" ijbfaq.html#infer\r
+configuration.\r
+If used with a browser less advanced than Mozilla/3.0 or IE-3, the default\r
+may encourage pages containing extensions that confuse the browser.\r
+.TP\r
+.\" anchor: o_h listen-address\r
+\fI-h [host][:port]\fP (Old) listen-address \fI[host][:port]\fP (New)\r
+If\r
+\fI\&host\fP\r
+is specified,\r
+bind the\r
+\fBjunkbuster\fP\r
+to that\r
+\s-2IP\s0\r
+address.\r
+If a\r
+\fI\&port\fP\r
+is specified, use it.\r
+The default\r
+port\r
+is 8000;\r
+the default host is\r
+\fC\&localhost\fP.\r
+Before Version 2.0.2,\r
+the default was to bind to all \r
+\s-2IP\s0\r
+addresses\r
+(\fB\&INADDR_ANY\fP);\r
+but this has been restricted to\r
+\fB\&localhost\fP\r
+to avoid unintended security breaches.\r
+(To open the proxy to all, use the line\r
+.br\r
+.ti +0.25i\r
+\fB\&listen-address :8000\fP\r
+.br\r
+in the configuration file.)\r
+.TP\r
+.\" anchor: o_f forwardfile\r
+\fI-f forward_host[:port]\fP (Old) forwardfile \fIforwardfile\fP (New)\r
+Version 1.X required all\r
+\s-2HTTP\s0\r
+requests from the client to be forwarded to the same destination.\r
+Version 2.0 takes its routing specification from a\r
+\fI\&forwardfile\fP,\r
+allowing selection of the proxy (a.k.a. forwarding host) and gateway\r
+according to the\r
+\s-2URL\s0.\r
+Here is a typical line.\r
+.br\r
+.ft CW\r
+.S 8\r
+.nf\r
+.sp\r
+*         lpwa.com:8000      .      .\r
+.S\r
+.ft\r
+.fi\r
+.sp\r
+\r
+.P\r
+Each line contains four fields:\r
+\fB\&target\fP,\r
+\fB\&forward_to\fP,\r
+\fB\&via_gateway_type\fP\r
+and\r
+\fB\&gateway\fP.\r
+As usual, the\r
+last\" ijbman.html#compare\r
+\fB\&target\fP\r
+domain that matches the requested\r
+\s-2URL\s0\r
+wins,\r
+and the\r
+\fC\&*\fP\r
+character alone matches any domain.\r
+The target domain need not be a fully qualified\r
+hostname; it can be a general domain such as\r
+\fC\&com\fP\r
+or\r
+\fC\&co.uk\fP\r
+or even just a port number.\r
+.\" anchor: nose\r
+For example, because\r
+<a href="http://lpwa.com">LPWA</a>\r
+does not handle\r
+SSL,\" ijbfaq.html#encrypt\r
+the line above will typically be followed by a line such as\r
+.br\r
+.ft CW\r
+.S 8\r
+.nf\r
+.sp\r
+:443  .      .      .\r
+.S\r
+.ft\r
+.fi\r
+.sp\r
+\r
+to allow SSL transactions to proceed directly.\r
+The cautious would also\r
+add an entry in their blockfile to stop transactions\r
+to port 443 for all but specified trusted sites.\r
+.P\r
+If the winning\r
+\fB\&forward_to\fP\r
+field is\r
+\fC\&.\fP\r
+(the dot character) the proxy connects \r
+directly to the server given in the\r
+\s-2URL\s0,\r
+otherwise it forwards to the host and port number specified.\r
+The default port is 8000.\r
+The\r
+\fC\&via_gateway_type\fP\r
+and\r
+\fC\&gateway\fP\r
+fields also use a dot to indicate no gateway protocol.\r
+The gateway protocols are explained\r
+below.\" ijbman.html#o_g\r
+.P\r
+The example line above in a forwardfile alone\r
+would send everything through port 8000 at\r
+\fC\&lpwa.com\fP\r
+with no gateway protocol,\r
+and is equivalent to the old\r
+\fC\&-f lpwa.com:8000\fP\r
+with no\r
+\fC\&-g\fP\r
+option.\r
+For more information see the example file provided with the distribution.\r
+.P\r
+Configure with care: no loop detection is performed.\r
+When setting up chains of proxies that might loop back, try adding\r
+Squid.\" ijbman.html#squid\r
+.TP\r
+.\" anchor: o_g \r
+\fI-g gw_protocol[:[gw_host][:gw_port]]\fP (Old) \r
+Use\r
+\fI\&gw_protocol\fP\r
+as the gateway protocol.\r
+This option was introduced in Version 1.4,\r
+but was folded into the\r
+forwardfile\" ijbman.html#forwardfile\r
+option in Version 2.0.\r
+The default is to use no gateway protocol;\r
+this may be explicitly specified as\r
+\fB\&direct\fP\r
+on the command line\r
+or the dot character in the forwardfile.\r
+The\r
+\fC\&SOCKS4\fP\r
+protocol may be specified as\r
+\fB\&socks\fP\r
+or\r
+\fB\&socks4\fP.\r
+The\r
+\fC\&SOCKS4A\fP\r
+protocol is specified as\r
+\fB\&socks4a\fP.\r
+The\r
+\fC\&SOCKS5\fP\r
+protocol is not currently supported.\r
+The default\r
+\s-2SOCKS\s0\r
+\fI\&gw_port\fP\r
+is 1080.\r
+.P\r
+The user's browser should\r
+\fInot\fP\r
+be\r
+configured\" ijbfaq.html#socks\r
+to use\r
+\fC\&SOCKS\fP;\r
+the proxy conducts the negotiations, not the browser.\r
+.P\r
+The user identification capabilities of\r
+\fC\&SOCKS4\fP\r
+are deliberately not used;\r
+the user is always identified to the\r
+\fC\&SOCKS\fP\r
+server as\r
+\fC\&userid=anonymous\fP.\r
+If the server's policy is to reject requests from\r
+\fC\&anonymous\fP,\r
+the proxy will not work.\r
+Use a\r
+debug\" ijbman.html#o_d\r
+value of 3\r
+to see the status returned by the server.\r
+.TP\r
+.\" anchor: o_d debug\r
+\fI-d N\fP (Old) debug \fIN\fP (New)\r
+Set debug mode.\r
+The most common value is 1,\r
+to\r
+pinpoint\" ijbfaq.html#pinpoint\r
+offensive\r
+\s-2URL\s0s,\r
+so they can be added to the blockfile.\r
+The value of\r
+\fB\&N\fP\r
+is a bitwise\r
+logical-\s-2OR\s0\r
+of the following values:\r
+.br\r
+.br\r
+\h'-\w"1 = "u'1 = URLs (show each URL requested by the browser);\r
+.br\r
+\h'-\w"2 = "u'2 = Connections (show each connection to or from the proxy);\r
+.br\r
+\h'-\w"4 = "u'4 = I/O (log I/O errors);\r
+.br\r
+\h'-\w"8 = "u'8 = Headers (as each header is scanned, show the header and what is done to it);\r
+.br\r
+\h'-\w"16 = "u'16 = Log everything (including debugging traces and the contents of the pages).\r
+.\" anchor: or\r
+Multiple\r
+\fB\&debug\fP\r
+lines are permitted; they are logical OR-ed together.\r
+.P\r
+Because most browsers send several requests in parallel\r
+the debugging output may appear intermingled, so the\r
+single-threaded\" ijbman.html#single-threaded\r
+option is recommended when using\r
+debug\" ijbman.html#debug\r
+with\r
+\fB\&N\fP\r
+greater than 1.\r
+.TP\r
+.\" anchor: o_y add-forwarded-header\r
+\fI-y\fP (Old) add-forwarded-header \fI\fP (New)\r
+Add \r
+\fB\&X-Forwarded-For\fP\r
+headers to the server-bound \r
+\s-2HTTP\s0\r
+stream\r
+indicating the client \r
+\s-2IP\s0\r
+address\r
+to the server,\" ijbfaq.html#detect\r
+in the new style of\r
+Squid 1.1.4.\" ijbman.html#squid\r
+If you want the traditional\r
+\fC\&HTTP_FORWARDED\fP\r
+response header, add it manually with the\r
+-x\" ijbman.html#o_x\r
+option.\r
+.TP\r
+.\" anchor: o_x add-header\r
+\fI-x HeaderText\fP (Old) add-header \fIHeaderText\fP (New)\r
+Add the\r
+\fI\&HeaderText\fP\r
+verbatim to requests to the server.\r
+Typical uses include\r
+adding old-style forwarding notices such as\r
+\fB\&Forwarded: by http://pro-privacy-isp.net\fP\r
+and reinstating the\r
+\fB\&Proxy-Connection: Keep-Alive\fP\r
+header\r
+(which the\r
+\fBjunkbuster\fP\r
+deletes so as\r
+not\" ijbfaq.html#detect\r
+to reveal its existence).\r
+No checking is done for correctness or plausibility,\r
+so it can be used to throw any old trash into the server-bound \r
+\s-2HTTP\s0\r
+stream.\r
+Please don't litter.\r
+.TP\r
+.\" anchor: o_s single-threaded\r
+\fI-s\fP (Old) single-threaded \fI\fP (New)\r
+Doesn't\r
+\fB\&fork()\fP\r
+a separate process\r
+(or create a separate thread)\r
+to handle each connection.\r
+Useful when debugging to keep the process single threaded.\r
+.TP\r
+.\" anchor: o_l logfile\r
+\fI-l logfile\fP (Old) logfile \fIlogfile\fP (New)\r
+Write all debugging data into\r
+\fI\&logfile.\fP\r
+The default\r
+\fI\&logfile\fP\r
+is the standard output.\r
+.TP\r
+.\" anchor: o_acl aclfile\r
+aclfile \fIaclfile\fP (New)\r
+Unless this option is used, the proxy talks to anyone who can connect to it,\r
+and everyone who can has equal permissions on where they can go.\r
+An access file allows restrictions to be placed on these two policies,\r
+by distinguishing some\r
+\fIsource\fP\r
+\s-2IP\s0\r
+addresses and/or\r
+some\r
+\fIdestination\fP\r
+addresses.\r
+(If a\r
+forwarder or a gateway\" ijbman.html#forwardfile\r
+is being used, its address is considered the destination address,\r
+not the ultimate\r
+\s-2IP\s0\r
+address of the\r
+\s-2URL\s0\r
+requested.)\r
+.P\r
+Each line of the access file begins with\r
+either the word\r
+\fB\&permit\fP\r
+or\r
+\fB\&deny\fP\r
+followed by source and (optionally) destination addresses \r
+to be matched against those of the\r
+\s-2HTTP\s0\r
+request.\r
+The last matching line specifies the result: if it was a\r
+\fB\&deny\fP\r
+line or if no line matched,\r
+the request will be refused.\r
+.P\r
+A source or destination\r
+can be specified as a single numeric\r
+\s-2IP\s0\r
+address,\r
+or with a hostname, provided that the host's name\r
+can be resolved to a numeric address: this cannot be used to block all\r
+\fB\&.mil \fP\r
+domains for example,\r
+because there is no single address associated with that domain name.\r
+Either form may be followed by a slash and an integer\r
+\fB\&N\fP,\r
+specifying a subnet mask of\r
+\fB\&N\fP\r
+bits.\r
+For example,\r
+\fB\&permit 207.153.200.72/24\fP\r
+matches the entire Class-C subnet from\r
+207.153.200.0\r
+through 207.153.200.255.\r
+(A netmask of 255.255.255.0 corresponds to 24 bits of\r
+ones in the netmask, as with\r
+\fC\&*_MASKLEN=24\fP.)\r
+A value of 16 would be used for a Class-B subnet.\r
+A value of zero for\r
+\fB\&N\fP\r
+in the subnet mask length will cause any address to match;\r
+this can be used to express a default rule.\r
+For more information see the example file provided with the distribution.\r
+.P\r
+If you like these access controls\r
+you should probably have\r
+firewall;\" ijbfaq.html#firewall\r
+they are not intended to replace one.\r
+.TP\r
+.\" anchor: o_tf trustfile\r
+trustfile \fItrustfile\fP (New)\r
+This feature is experimental, has not been fully documented and is\r
+very subject to change.\r
+The goal is for parents to be able to choose a page or site whose\r
+links they regard suitable for their\r
+young children\" ijbfaq.html#children\r
+and for the proxy to allow access only to sites mentioned there.\r
+To do this the proxy examines the\r
+referer\" ijbman.html#o_r\r
+variable on each page request to check they resulted from\r
+a click on the ``trusted referer'' site: if so the referred site\r
+is added to a list of trusted sites, so that the child can\r
+then move around that site.\r
+There are several uncertainties in this scheme that experience may be\r
+able to iron out; check back in the months ahead.\r
+.TP\r
+.\" anchor: o_ti trust_info_url\r
+trust_info_url \fItrust_info_url\fP (New)\r
+When access is denied due to lack of a trusted referer, this\r
+\s-2URL\s0\r
+is displayed with a message pointing the user to it for further information.\r
+.TP\r
+.\" anchor: o_hc hide-console\r
+hide-console \fI\fP (New)\r
+In the Windows version only, instructs the program\r
+to disconnect from and hide the command console after starting.\r
+.TP\r
+.\" anchor: o_a \r
+\fI-a\fP (Old) \r
+(Obsolete) Accept the server's\r
+\fB\&Set-cookie\fP\r
+headers, passing them through to the browser.\r
+.\" anchor: obsolete\r
+This option was removed in Version 1.2\r
+and replaced by an improvement to the\r
+-c\" ijbman.html#o_c\r
+option.\r
+.LE\r
+.SH INSTALLATION AND USE\r
+Browsers must be told where to find the\r
+\fBjunkbuster\fP\r
+(e.g.\r
+\fB\&localhost\fP\r
+port 8000).\r
+To set the \r
+\s-2HTTP\s0\r
+proxy in Netscape 3.0,\r
+go through:\r
+\fB\&Options\fP;\r
+\fB\&Network Preferences\fP;\r
+\fB\&Proxies\fP;\r
+\fB\&Manual Proxy Configuration\fP;\r
+\fB\&View\fP.\r
+See the\r
+\s-2FAQ\s0\r
+for other browsers.\r
+The\r
+Security Proxy\" ijbfaq.html#security\r
+should also be set to the same values,\r
+otherwise\r
+\fB\&shttp:\fP\r
+\s-2URL\s0s\r
+won't work.\r
+.P\r
+Note the limitations\r
+explained in the\r
+\s-2FAQ\s0.\r
+.SH CHECKING OPTIONS\r
+To allow users to\r
+check\" ijbfaq.html#show\r
+that a\r
+\fBjunkbuster\fP\r
+is running and how it is configured,\r
+it intercepts requests for any\r
+\s-2URL\s0\r
+ending in\r
+\fB\&/show-proxy-args\fP\r
+and blocks it,\r
+returning instead returns information on its\r
+version number and\r
+current configuration\r
+including the contents of its blockfile.\r
+To get an explicit warning that no\r
+\fBjunkbuster\fP\r
+intervened if the proxy was not configured,\r
+it's best to point it to a\r
+\s-2URL\s0\r
+that does this, such as\r
+http://internet.junkbuster.com/cgi-bin/show-proxy-args\r
+on Junkbusters's website.\r
+.SH SEE ALSO\r
+http://www.waldherr.org/junkbuster/\" waldherr.org#\r
+.br\r
+http://www.junkbusters.com/ht/en/ijbfaq.html\" ijbfaq.html#\r
+.br\r
+http://www.junkbusters.com/ht/en/cookies.html\" cookies.html#\r
+.br\r
+http://internet.junkbuster.com/cgi-bin/show-proxy-args\r
+.br\r
+http://www.cis.ohio-state.edu/htbin/rfc/rfc2109.html\r
+.br\r
+http://squid.nlanr.net/Squid/\r
+.br\r
+http://www-math.uni-paderborn.de/~axel/\r
+.SH COPYRIGHT AND GPL\r
+Written and copyright by the Anonymous Coders and Junkbusters Corporation\r
+and made available under the\r
+GNU General Public License (GPL).\" gpl.html#\r
+This software comes with\r
+NO WARRANTY.\" gpl.html#nowarr\r
+Internet Junkbuster\r
+Proxy\r
+is a\r
+trademark\" legal.html#marks\r
+of Junkbusters Corporation.\r
diff --git a/junkbuster.init b/junkbuster.init
new file mode 100644 (file)
index 0000000..f35001a
--- /dev/null
@@ -0,0 +1,133 @@
+#!/bin/sh
+#  ********************************************************************
+# 
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.init,v $
+# 
+#  Purpose     :  This shell script takes care of starting and stopping
+#                 junkbuster.
+#                 This works only correctly if the user `nobody' is allowed
+#                 to be in the directory where this file is called 
+#                 (for example: /root is NOT ok)
+# 
+#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
+# 
+#                 Based on the Internet Junkbuster originally written
+#                 by and Copyright (C) 1997 Anonymous Coders and
+#                 Junkbusters Corporation.  http://www.junkbusters.com
+# 
+#                 This program is free software; you can redistribute it
+#                 and/or modify it under the terms of the GNU General
+#                 Public License as published by the Free Software
+#                 Foundation; either version 2 of the License, or (at
+#                 your option) any later version.
+# 
+#                 This program is distributed in the hope that it will
+#                 be useful, but WITHOUT ANY WARRANTY; without even the
+#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
+#                 PARTICULAR PURPOSE.  See the GNU General Public
+#                 License for more details.
+# 
+#                 The GNU General Public License should be included with
+#                 this file.  If not, you can view it at
+#                 http://www.gnu.org/copyleft/gpl.html
+#                 or write to the Free Software Foundation, Inc., 59
+#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+# 
+#  Revisions   :
+#     $Log: junkbuster.init,v $
+#     Revision 1.7  2001/06/28 13:40:26  sarantis
+#     remove single quotes from $JB; it was not expanded.
+#
+#     Revision 1.6  2001/06/28 13:38:42  sarantis
+#     formatting changes; individual return values are returned from the init script.
+#
+#     Revision 1.5  2001/06/11 11:37:40  sarantis
+#     Minor editing changes.
+#
+#     Revision 1.4  2001/06/09 09:14:11  swa
+#     shamelessly adapted RPM stuff from the newest rpm that
+#     RedHat provided for the JB.
+#
+#     Revision 1.3  2001/05/25 10:12:44  oes
+#     Fixed default case in switch statement (# -> *)
+#
+#     Revision 1.2  2001/05/24 07:52:24  swa
+#     added header. removed ^M.
+#
+# 
+# ********************************************************************/
+
+# This is file /etc/rc.d/init.d/junkbuster and was put here 
+# by the junkbuster rpm
+#
+# chkconfig: 235 84 09
+#
+# description: This shell script takes care of starting and stopping \
+#             junkbuster.
+#
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+. /etc/sysconfig/network
+
+#  Check that networking is up.
+[ ${NETWORKING} = "no" ] && exit 0
+[ -f /usr/sbin/junkbuster ] || exit 0
+
+[ -f /etc/junkbuster/config ] || exit 0
+
+# See how we were called.
+
+JB="/usr/sbin/junkbuster /etc/junkbuster/config & "
+start () {
+       # start daemon
+       [ -f /var/lock/subsys/junkbuster ] && exit 0
+       echo -n $"Starting junkbuster: "
+       daemon --user junkbust $JB 
+       RETVAL=$?
+       echo
+       [ $RETVAL = 0 ] && touch /var/lock/subsys/junkbuster
+       return $RETVAL
+}
+
+stop () {
+       # stop daemon
+       echo -n $"Stopping junkbuster: "
+       killproc junkbuster && rm -f /var/lock/subsys/junkbuster
+       RETVAL=$?
+       echo
+       return $RETVAL
+}
+
+case "$1" in
+  start)
+       start   
+       ;;
+  stop)
+       stop    
+       ;;
+  reload|restart)
+       stop
+       start
+       RETVAL=$?
+       ;;
+  condrestart)
+       # restart only if already running
+       if [ -f /var/lock/subsys/junkbuster ] ; then
+               stop
+               start
+               RETVAL=$?
+       fi 
+       ;;
+  status)
+       status junkbuster
+       RETVAL=$?
+       ;;
+  *)
+       echo $"Usage: junkbuster {start|stop|reload|restart|condrestart|status}"
+       exit 1
+esac
+
+exit $RETVAL
diff --git a/junkbuster.init.suse b/junkbuster.init.suse
new file mode 100644 (file)
index 0000000..e49579e
--- /dev/null
@@ -0,0 +1,76 @@
+#! /bin/sh
+#  ********************************************************************
+# 
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.init,v $
+# 
+#  Purpose     :  This shell script takes care of starting and stopping
+#                 junkbuster.
+# 
+#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
+# 
+#                 Based on the Internet Junkbuster originally written
+#                 by and Copyright (C) 1997 Anonymous Coders and
+#                 Junkbusters Corporation.  http://www.junkbusters.com
+# 
+#                 This program is free software; you can redistribute it
+#                 and/or modify it under the terms of the GNU General
+#                 Public License as published by the Free Software
+#                 Foundation; either version 2 of the License, or (at
+#                 your option) any later version.
+# 
+#                 This program is distributed in the hope that it will
+#                 be useful, but WITHOUT ANY WARRANTY; without even the
+#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
+#                 PARTICULAR PURPOSE.  See the GNU General Public
+#                 License for more details.
+# 
+#                 The GNU General Public License should be included with
+#                 this file.  If not, you can view it at
+#                 http://www.gnu.org/copyleft/gpl.html
+#                 or write to the Free Software Foundation, Inc., 59
+#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+# 
+#  Revisions   :
+#     $Log: junkbuster.init,v $
+#
+# 
+# ********************************************************************/
+### BEGIN INIT INFO
+# Provides:       junkbuster ijb
+# Required-Start: $network syslog
+# Required-Stop:
+# Default-Start:  3 5
+# Default-Stop:
+# Description:    Starts the Internet Junkbuster
+### END INIT INFO
+. /etc/rc.config
+base=\${0##*/}
+link=\${base#*[SK][0-9][0-9]}
+#test \$link = \$base && START_IJB=yes
+#test "\$START_IJB" = "yes" || exit 0
+return=\$rc_done
+case "\$1" in
+    start)
+        echo -n "Starting The Internet Junkbuster"
+        su - nobody -c 'nohup /usr/sbin/junkbuster /etc/junkbuster/config < /dev/null > /dev/null &'
+        sleep 1
+        echo -e "\$return"
+        ;;
+    stop)
+        echo -n "Shutting down The Internet Junkbuster"
+        killproc -TERM /usr/sbin/junkbuster || return=\$rc_failed
+        echo -e "\$return"
+        ;;
+    restart|reload)
+        \$0 stop && \$0 start || return=\$rc_failed
+        ;;
+    status)
+        checkproc /usr/sbin/junkbuster && echo OK || echo No process
+        ;;
+    *)
+        echo "Usage: \$0 {start|restart|status|stop}"
+        exit 1
+esac
+test "\$return" = "\$rc_done" || exit 1
+exit 0
similarity index 56%
rename from privoxy.logrotate
rename to junkbuster.logrotate
index 035112a..e13ee1d 100644 (file)
@@ -1,15 +1,15 @@
 #
-# Logrotate file for Privoxy RPM
+# Logrotate file for Junkbuster RPM
 #
 # ********************************************************************
 # 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.logrotate,v $
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.logrotate,v $
 # 
-#  Purpose     :  Rotates all potential Privoxy logfiles
+#  Purpose     :  Rotates all potential Junkbuster logfiles
 #                 
 # 
 #  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
 # 
 #                 Based on the Internet Junkbuster originally written
 #                 by and Copyright (C) 1997 Anonymous Coders and 
 #                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 # 
 #  Revisions   :
-#     $Log: privoxy.logrotate,v $
-#     Revision 1.3  2002/03/24 15:19:57  swa
-#     name change related issue.
-#
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.7  2001/12/30 14:07:32  steudten
-#     - Add signal handling (unix)
-#     - Add SIGHUP handler (unix)
-#     - Add creation of pidfile (unix)
-#     - Add action 'top' in rc file (RH)
-#     - Add entry 'SIGNALS' to manpage
-#     - Add exit message to logfile (unix)
-#
-#     Revision 1.6  2001/12/13 23:19:43  steudten
-#     Add 'restart' of junkbuster service after rotate logfiles.
-#     Better we could use the well known 'kill -HUP', but the handler
-#     isn't there at this time.
-#
-#     Revision 1.5  2001/11/05 21:31:51  steudten
-#     Change switch mode from weekly to size 1M
-#
-#     Revision 1.4  2001/06/28 13:30:22  sarantis
-#     add missingok for the jarfile entry
-#
+#     $Log: junkbuster.logrotate,v $
 #     Revision 1.3  2001/06/04 18:31:58  swa
 #     files are now prefixed with either `confdir' or `logdir'.
 #     `make redhat-dist' replaces both entries confdir and logdir
 # 
 # ********************************************************************/
 
-/var/log/privoxy/logfile {
+/var/log/junkbuster/logfile {
    compress
-   size 1M
-   postrotate
-        /sbin/service privoxy reload  2> /dev/null || true
-   endscript
+   weekly
 }
 
-/var/log/privoxy/jarfile {
-   missingok
-   compress
-   size 1M
-   postrotate
-        /sbin/service privoxy reload  2> /dev/null || true
-   endscript
+/var/log/junkbuster/jarfile {
+  missingok
+  compress
+  weekly
 }
similarity index 87%
rename from privoxy.monthly
rename to junkbuster.monthly
index 15734dd..89dac65 100644 (file)
@@ -2,13 +2,13 @@
 
 # ********************************************************************
 # 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.monthly,v $
+#  File        :  $Source: /cvsroot/ijbswa/current/gateway.h,v $
 # 
 #  Purpose     :  Downloads updated configuration (blocklists, ...)
 #                 to the machine.
 # 
 #  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
 # 
 #                 Based on the Internet Junkbuster originally written
 #                 by and Copyright (C) 1997 Anonymous Coders and 
 #                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 # 
 #  Revisions   :
-#     $Log: privoxy.monthly,v $
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.3  2001/05/24 07:41:33  swa
-#     added header
-#
+#     $Log: gateway.h,v $
 # 
 # 
 # ********************************************************************/
similarity index 84%
rename from privoxy.weekly
rename to junkbuster.weekly
index 81424f8..fdd5bf1 100644 (file)
@@ -2,13 +2,13 @@
 
 # ********************************************************************
 # 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.weekly,v $
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.monthly,v $
 # 
 #  Purpose     :  Downloads updated configuration (blocklists, ...)
 #                 to the machine.
 # 
 #  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
 # 
 #                 Based on the Internet Junkbuster originally written
 #                 by and Copyright (C) 1997 Anonymous Coders and 
 #                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 # 
 #  Revisions   :
-#     $Log: privoxy.weekly,v $
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.2  2001/05/24 07:52:24  swa
-#     added header. removed ^M.
-#
+#     $Log: junkbuster.monthly,v $
 #     Revision 1.3  2001/05/24 07:41:33  swa
 #     added header
 #
index 3465373..f191b08 100644 (file)
@@ -1,4 +1,4 @@
-const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Exp $";
+const char killpopup_rcs[] = "$Id: killpopup.c,v 1.6 2001/07/19 19:11:35 haroon Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/killpopup.c,v $
@@ -6,13 +6,13 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex
  * Purpose     :  Handles the filtering of popups.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -32,44 +32,6 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex
  *
  * Revisions   :
  *    $Log: killpopup.c,v $
- *    Revision 1.15  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.14  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.13  2001/11/13 00:16:40  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.12  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.11  2001/10/07 15:42:41  oes
- *    filter_popups now gets a csp pointer so it can raise the new
- *      CSP_FLAG_MODIFIED flag.
- *
- *    Revision 1.10  2001/09/22 16:34:44  jongfoster
- *    Removing unneeded #includes
- *
- *    Revision 1.9  2001/07/31 14:44:22  oes
- *    Deleted unused size parameter from filter_popups()
- *
- *    Revision 1.8  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.7  2001/07/20 19:29:25  haroon
- *    - In v1.5 forgot to add that I implemented LOG_LEVEL_POPUPS in errlog.c,
- *      errlog.h and killpopup.c. In that case, it is superfluous to have define for
- *      POPUP_VERBOSE, so I removed the defines and logging is now done
- *      via log_error(LOG_LEVEL_POPUPS, ....)
- *
  *    Revision 1.6  2001/07/19 19:11:35  haroon
  *    - Implemented Guy's idea of replacing window.open( with 1;''.concat(
  *    - Implemented Guy's idea of replacing .resizeTo( with .scrollTo(
@@ -109,102 +71,99 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex
 #include <stdlib.h>
 #include <sys/types.h>
 #include <string.h>
+#include <malloc.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <ctype.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
 #include "project.h"
 #include "killpopup.h"
+#include "jcc.h"
 #include "errlog.h"
 
 const char killpopup_h_rcs[] = KILLPOPUP_H_VERSION;
 
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
 
 /*********************************************************************
  *
  * Function    :  filter_popups
  *
- * Description :  Filter the block of data that's been read from the server
- *                for javascript popup code and replace by syntactically
- *                neutral code of the same size.
- *                Raise the CSP_FLAG_MODIFIED flag on success.
+ * Description :  Filter the block of data that's been read from the server.
+ *                Caller is responsible for checking permissons list
+ *                to determine if this function should be called.
+ *                Remember not to change the content length (substitute char by char)
  *
  * Parameters  :
  *          1  :  buff = Buffer to scan and modify.  Null terminated.
- *          2  :  csp = Client state pointer
+ *          2  :  size = Buffer size, excluding null terminator.
  *
  * Returns     :  void
  *
  *********************************************************************/
-void filter_popups(char *buff, struct client_state *csp)
+void filter_popups(char *buff, int size)
 {
-   char *start_p = NULL;
-   char *close_p = NULL;
+   char *popup = NULL;
+   char *close = NULL;
    char *p     = NULL;
 
-   /*
-    * replace the window.open( with a harmless JavaScript replacement
-    * (notice the two single quotes)
-    */
-   while ((start_p = strstr(buff, "window.open(")) != NULL)
+   while ((popup = strstr( buff, "window.open(" )) != NULL)
    {
-      if (start_p)
+      if ( popup )
       {
-         strncpy(start_p, "1;''.concat(", 12);
+         /*
+          * replace the window.open( with a harmless JavaScript replacement (notice the two single quotes)
+          * Guy's idea (thanks)
+          */
+         strncpy(popup, "1;''.concat(", 12);
          log_error(LOG_LEVEL_POPUPS, "Blocked popup window open");
-         csp->flags |= CSP_FLAG_MODIFIED;
       }
    }
-
-   /*
-    * replace the .resizeTo( with a harmless JavaScript replacement
-    */
-   while ((start_p = strstr(buff, ".resizeTo(")) != NULL)
+   
+   while ((popup = strstr( buff, ".resizeTo(" )) != NULL)
    {
-      if (start_p)
+      if ( popup )
       {
-         strncpy(start_p, ".scrollTo(", 10);
+         /*
+          * replace the .resizeTo( with a harmless JavaScript replacement
+          * Guy's idea (thanks)
+          */
+         strncpy(popup, ".scrollTo(", 10);
          log_error(LOG_LEVEL_POPUPS, "Blocked popup window resize");
-         csp->flags |= CSP_FLAG_MODIFIED;
       }
    }
 
-   /* 
-    * Filter onUnload and onExit
-    */
-   start_p = strstr(buff, "<body");
-   if (!start_p) start_p = strstr(buff, "<BODY");
-   if (!start_p) start_p = strstr(buff, "<Body");
-   if (!start_p) start_p = strstr(buff, "<BOdy");
-   if (start_p)
+   /* Filter all other crap like onUnload onExit etc.  (by BREITENB) NEW!*/
+   popup=strstr( buff, "<body");
+   if (!popup) popup=strstr( buff, "<BODY");
+   if (!popup) popup=strstr( buff, "<Body");
+   if (!popup) popup=strstr( buff, "<BOdy");
+   if (popup)
    {
-      close_p = strchr(start_p, '>');
-      if (close_p)
+      close=strchr(popup,'>');
+      if (close)
       {
-         /* we are now between <body and the ending > */
-         p = strstr(start_p, "onUnload");
+         /* we are now between <body and the ending > FIXME: No, we're anywhere! --oes*/
+         p=strstr(popup, "onUnload");
          if (p)
          {
-            strncpy(p, "_nU_", 4);
-            csp->flags |= CSP_FLAG_MODIFIED;
+            strncpy(p,"_nU_",4);
          }
-         p = strstr(start_p, "onExit");
+         p=strstr(popup, "onExit");
          if (p)
          {
-            strncpy(p, "_nE_", 4);
-            csp->flags |= CSP_FLAG_MODIFIED;
+            strncpy(p,"_nE_",4);
          }
       }
    }
 
 }
 
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
 /*
   Local Variables:
index 7d2eadf..23bd7d7 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef KILLPOPUP_H_INCLUDED
-#define KILLPOPUP_H_INCLUDED
-#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.7 2002/03/24 13:25:43 swa Exp $"
+#ifndef _KILLPOPUP_H
+#define _KILLPOPUP_H
+#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.1.1.1 2001/05/15 13:58:58 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/killpopup.h,v $
@@ -8,7 +8,7 @@
  * Purpose     :  Handles the filtering of popups.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: killpopup.h,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2001/10/07 15:42:41  oes
- *    filter_popups now gets a csp pointer so it can raise the new
- *      CSP_FLAG_MODIFIED flag.
- *
- *    Revision 1.5  2001/07/31 14:44:22  oes
- *    Deleted unused size parameter from filter_popups()
- *
- *    Revision 1.4  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.3  2001/07/29 18:59:21  jongfoster
- *    - Changing #define _KILLPOPUP_H to KILLPOPUP_H_INCLUDED
- *    - Adding extern "C" {}
- *
- *    Revision 1.2  2001/05/20 01:21:20  jongfoster
- *    Version 2.9.4 checkin.
- *    - Merged popupfile and cookiefile, and added control over PCRS
- *      filtering, in new "permissionsfile".
- *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
- *      file error you now get a message box (in the Win32 GUI) rather
- *      than the program exiting with no explanation.
- *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
- *      skipping.
- *    - Removed tabs from "config"
- *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
- *    - Bumped up version number.
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:58  oes
  *    Initial import of version 2.9.3 source tree
  *
 
 #include "project.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+#ifdef KILLPOPUPS
 
-#ifdef FEATURE_KILL_POPUPS
+extern void filter_popups(char *buff, int size);
 
-extern void filter_popups(char *buff, struct client_state *csp);
-
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
 /* Revision control strings from this header and associated .c file */
 extern const char killpopup_rcs[];
 extern const char killpopup_h_rcs[];
 
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef KILLPOPUP_H_INCLUDED */
+#endif /* ndef _KILLPOPUP_H */
 
 /*
   Local Variables:
diff --git a/list.c b/list.c
index 6cd7f89..18e5da7 100644 (file)
--- a/list.c
+++ b/list.c
@@ -1,4 +1,4 @@
-const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
+const char list_rcs[] = "$Id: list.c,v 1.4 2001/06/29 13:30:22 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/list.c,v $
@@ -8,13 +8,13 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
  *                   `destroy_list', `enlist' and `list_to_text'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -34,47 +34,6 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
  *
  * Revisions   :
  *    $Log: list.c,v $
- *    Revision 1.14  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.13  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.12  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.11  2001/10/23 21:21:03  jongfoster
- *    New error handling - error codes are now jb_errs, not ints.
- *    Changed the way map() handles out-of-memory, to dramatically
- *    reduce the amount of error-checking clutter needed.
- *
- *    Revision 1.10  2001/09/16 17:30:24  jongfoster
- *    Fixing a compiler warning.
- *
- *    Revision 1.9  2001/09/16 13:20:29  jongfoster
- *    Rewrite of list library.  Now has seperate header and list_entry
- *    structures.  Also added a large sprinking of assert()s to the list
- *    code.
- *
- *    Revision 1.8  2001/08/07 14:00:20  oes
- *    Fixed comment
- *
- *    Revision 1.7  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.6  2001/07/31 14:44:51  oes
- *    list_to_text() now appends empty line at end
- *
- *    Revision 1.5  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.4  2001/06/29 13:30:22  oes
  *    - Added Convenience function enlist_unique_header(),
  *      which takes the Header name and value as separate
@@ -111,174 +70,23 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
 
 #include "config.h"
 
-#ifndef _WIN32
-/* FIXME: The following headers are not needed for Win32.  Are they
- * needed on other platforms?
- */
 #include <stdio.h>
 #include <sys/types.h>
 #include <stdlib.h>
 #include <ctype.h>
-#endif
 #include <string.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
-#include <assert.h>
-
 #include "project.h"
+#include "jcc.h"
 #include "list.h"
 #include "miscutil.h"
 
 const char list_h_rcs[] = LIST_H_VERSION;
 
-
-static int list_is_valid (const struct list *the_list);
-
-
-/*********************************************************************
- *
- * Function    :  list_init
- *
- * Description :  Create a new, empty list in user-allocated memory.
- *                Caller should allocate a "struct list" variable,
- *                then pass it to this function.
- *                (Implementation note:  Rather than calling this
- *                function, you can also just memset the memory to
- *                zero, e.g. if you have a larger structure you
- *                want to initialize quickly.  However, that isn't
- *                really good design.)
- *
- * Parameters  :
- *          1  :  the_list = pointer to list
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void init_list(struct list *the_list)
-{
-   memset(the_list, '\0', sizeof(*the_list));
-}
-
-
-/*********************************************************************
- *
- * Function    :  destroy_list
- *
- * Description :  Destroy a string list (opposite of list_init).
- *                On return, the memory used by the list entries has
- *                been freed, but not the memory used by the_list
- *                itself.  You should not re-use the_list without
- *                calling list_init().
- *
- *                (Implementation note:  You *can* reuse the_list
- *                without calling list_init(), but please don't.
- *                If you want to remove all entries from a list
- *                and still have a usable list, then use
- *                list_remove_all().)
- *
- * Parameters  :
- *          1  :  the_list = pointer to list
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void destroy_list (struct list *the_list)
-{
-   struct list_entry *cur_entry, *next_entry;
-
-   assert(the_list);
-
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry)
-   {
-      next_entry = cur_entry->next;
-      freez(cur_entry->str);
-      free(cur_entry);
-   }
-
-   the_list->first = NULL;
-   the_list->last = NULL;
-}
-
-
-/*********************************************************************
- *
- * Function    :  list_is_valid
- *
- * Description :  Check that a string list is valid.  The intended
- *                usage is "assert(list_is_valid(the_list))".
- *                Currently this checks that "the_list->last"
- *                is correct, and that the list dosn't contain
- *                circular references.  It is likely to crash if
- *                it's passed complete garbage.
- *
- * Parameters  :
- *          1  :  the_list = pointer to list.  Must be non-null.
- *
- * Returns     :  1 if list is valid, 0 otherwise.
- *
- *********************************************************************/
-static int list_is_valid (const struct list *the_list)
-{
-   /*
-    * If you don't want this check, just change the line below
-    * from "#if 1" to "#if 0".
-    */
-#if 1
-   const struct list_entry *cur_entry;
-   const struct list_entry *last_entry = NULL;
-   int length = 0;
-
-   assert(the_list);
-
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next)
-   {
-      last_entry = cur_entry;
-
-      if (cur_entry->str)
-      {
-         /*
-          * Just check that this string can be accessed - i.e. it's a valid
-          * pointer.
-          */
-         strlen(cur_entry->str);
-      }
-
-      /*
-       * Check for looping back to first
-       */
-      if ((length != 0) && (cur_entry == the_list->first))
-      {
-         return 0;
-      }
-
-      /*
-       * Arbitrarily limit length to prevent infinite loops.
-       */
-      if (++length > 1000)
-      {
-         return 0;
-      }
-
-      /*
-       * Check this isn't marked as the last entry, unless of course it's
-       * *really* the last entry.
-       */
-      if ((the_list->last == cur_entry) && (cur_entry->next != NULL))
-      {
-         /* This is the last entry, but there's data after it !!?? */
-         return 0;
-      }
-   }
-
-   return (the_list->last == last_entry);
-#else
-   return 1;
-#endif
-}
-
 /*********************************************************************
  *
  * Function    :  enlist
@@ -286,51 +94,32 @@ static int list_is_valid (const struct list *the_list)
  * Description :  Append a string into a specified string list.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  header = pointer to list 'dummy' header
  *          2  :  str = string to add to the list (maybe NULL)
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist(struct list *the_list, const char *str)
+void enlist(struct list *header, const char *str)
 {
-   struct list_entry *cur;
-
-   assert(the_list);
-   assert(list_is_valid(the_list));
+   struct list *cur = (struct list *)malloc(sizeof(*cur));
+   struct list *last;
 
-   if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur))))
+   if (cur)
    {
-      return JB_ERR_MEMORY;
-   }
+      cur->str  = (str ? strdup(str) : NULL);
+      cur->next = NULL;
 
-   if (str)
-   {
-      if (NULL == (cur->str = strdup(str)))
+      last = header->last;
+      if (last == NULL)
       {
-         free(cur);
-         return JB_ERR_MEMORY;
+         last = header;
       }
-   }
-   /* else { cur->str = NULL; }  - implied by zalloc */
-
-   /* cur->next = NULL;  - implied by zalloc */
 
-   if (the_list->last)
-   {
-      the_list->last->next = cur;
-      the_list->last = cur;
-   }
-   else
-   {
-      the_list->first = cur;
-      the_list->last = cur;
+      last->next   = cur;
+      header->last = cur;
    }
 
-   assert(list_is_valid(the_list));
-   return JB_ERR_OK;
 }
 
 
@@ -342,46 +131,28 @@ jb_err enlist(struct list *the_list, const char *str)
  *                string list.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  header = pointer to list 'dummy' header
  *          2  :  str = string to add to the list (maybe NULL)
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist_first(struct list *the_list, const char *str)
+void enlist_first(struct list *header, const char *str)
 {
-   struct list_entry *cur;
-
-   assert(the_list);
-   assert(list_is_valid(the_list));
+   struct list *cur = (struct list *)malloc(sizeof(*cur));
 
-   if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur))))
+   if (cur)
    {
-      return JB_ERR_MEMORY;
-   }
+      cur->str  = (str ? strdup(str) : NULL);
+      cur->next = header->next;
 
-   if (str)
-   {
-      if (NULL == (cur->str = strdup(str)))
+      header->next = cur;
+      if (header->last == NULL)
       {
-         free(cur);
-         return JB_ERR_MEMORY;
+         header->last = cur;
       }
    }
-   /* else { cur->str = NULL; }  - implied by zalloc */
-
-   cur->next = the_list->first;
 
-   the_list->first = cur;
-   if (the_list->last == NULL)
-   {
-      the_list->last = cur;
-   }
-
-   assert(list_is_valid(the_list));
-   return JB_ERR_OK;
 }
 
 
@@ -391,59 +162,49 @@ jb_err enlist_first(struct list *the_list, const char *str)
  *
  * Description :  Append a string into a specified string list,
  *                if & only if it's not there already.
- *                If the num_significant_chars argument is nonzero,
- *                only compare up to the nth character.
+ *                If the n argument is nonzero, only compare up to
+ *                the nth character. 
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
- *          2  :  str = string to add to the list
- *          3  :  num_significant_chars = number of chars to use
- *                for uniqueness test, or 0 to require an exact match.
+ *          1  :  header = pointer to list 'dummy' header
+ *          2  :  str = string to add to the list (maybe NULL)
+ *          3  :  n = number of chars to use for uniqueness test
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
- *                "Success" does not indicate whether or not the
- *                item was already in the list.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist_unique(struct list *the_list, const char *str,
-                     size_t num_significant_chars)
+void enlist_unique(struct list *header, const char *str, int n)
 {
-   struct list_entry *cur_entry;
-
-   assert(the_list);
-   assert(list_is_valid(the_list));
-   assert(str);
-   assert(num_significant_chars >= 0);
-   assert(num_significant_chars <= strlen(str));
+   struct list *last;
+   struct list *cur = header->next;
 
-   if (num_significant_chars > 0)
+   while (cur != NULL)
    {
-      for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next)
+      if ((cur->str != NULL) && (
+         (n && (0 == strncmp(str, cur->str, n))) || 
+         (!n && (0 == strcmp(str, cur->str)))))
       {
-         if ( (cur_entry->str != NULL)
-           && (0 == strncmp(str, cur_entry->str, num_significant_chars)))
-         {
-            /* Already there */
-            return JB_ERR_OK;
-         }
+         /* Already there */
+         return;
       }
+      cur = cur->next;
    }
-   else
+
+   cur = (struct list *)malloc(sizeof(*cur));
+
+   if (cur != NULL)
    {
-      /* Test whole string */
-      for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next)
+      cur->str  = (str ? strdup(str) : NULL); /* FIXME check retval */
+      cur->next = NULL;
+
+      last = header->last;
+      if (last == NULL)
       {
-         if ( (cur_entry->str != NULL) && (0 == strcmp(str, cur_entry->str)))
-         {
-            /* Already there */
-            return JB_ERR_OK;
-         }
+         last = header;
       }
+      last->next   = cur;
+      header->last = cur;
    }
-
-   return enlist(the_list, str);
 }
 
 
@@ -456,84 +217,80 @@ jb_err enlist_unique(struct list *the_list, const char *str,
  *                if & only if there isn't already a header with that name.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
- *          2  :  name = HTTP header name (e.g. "Content-type")
- *          3  :  value = HTTP header value (e.g. "text/html")
+ *          1  :  header = pointer to list 'dummy' header
+ *          2  :  first = first string to add to the list (maybe NULL)
+ *          3  :  second = number of chars to use for uniqueness test
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
- *                "Success" does not indicate whether or not the
- *                header was already in the list.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist_unique_header(struct list *the_list, const char *name,
-                            const char *value)
+void enlist_unique_header(struct list *header, const char *name, const char *value)
 {
-   size_t length;
-   jb_err result;
-   char *str;
+   struct list *last;
+   struct list *cur = header->next;
+   int length;
+   char *dummy;
+
+   if (name == NULL || value == NULL) return;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
-   assert(name);
-   assert(value);
+   dummy = strdup(name);
+   dummy = strsav(dummy, ": ");
+   length = strlen(dummy);
 
-   length = strlen(name) + 2;
-   if (NULL == (str = (char *)malloc(length + strlen(value) + 1)))
+   while (cur != NULL)
    {
-      return JB_ERR_MEMORY;
+      if ((cur->str != NULL) && 
+               (0 == strncmp(dummy, cur->str, length)))
+      {
+         /* Already there */
+         return;
+      }
+      cur = cur->next;
    }
-   strcpy(str, name);
-   str[length - 2] = ':';
-   str[length - 1] = ' ';
-   strcpy(str + length, value);
 
-   result = enlist_unique(the_list, str, length);
+   cur = (struct list *)malloc(sizeof(*cur));
 
-   free(str);
-
-   assert(list_is_valid(the_list));
-
-   return result;
+   if (cur != NULL)
+   {
+      cur->str  = strsav(dummy, value);
+      cur->next = NULL;
 
+      last = header->last;
+      if (last == NULL)
+      {
+         last = header;
+      }
+      last->next   = cur;
+      header->last = cur;
+   }
 }
 
 
 /*********************************************************************
  *
- * Function    :  list_remove_all
+ * Function    :  destroy_list
  *
- * Description :  Remove all entries from a list.  On return, the_list
- *                is a valid, empty list.  Note that this is similar
- *                to destroy_list(), but the difference is that this
- *                function guarantees that the list structure is still
- *                valid after the call.
+ * Description :  Destroy a string list (opposite of enlist)
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  header = pointer to list 'dummy' header
  *
  * Returns     :  N/A
  *
  *********************************************************************/
-void list_remove_all(struct list *the_list)
+void destroy_list(struct list *header)
 {
-   struct list_entry *cur_entry;
-   struct list_entry *next_entry;
+   struct list *p, *n;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
-
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry)
+   for (p = header->next; p ; p = n)
    {
-      next_entry = cur_entry->next;
-      freez(cur_entry->str);
-      free(cur_entry);
+      n = p->next;
+      freez(p->str);
+      free(p);
    }
 
-   the_list->first = the_list->last = NULL;
+   memset(header, '\0', sizeof(*header));
 
-   assert(list_is_valid(the_list));
 }
 
 
@@ -541,56 +298,52 @@ void list_remove_all(struct list *the_list)
  *
  * Function    :  list_to_text
  *
- * Description :  "Flatten" a string list into 1 long \r\n delimited string,
- *                adding an empty line at the end.  NULL entries are ignored.
- *                This function does not change the_list.
+ * Description :  "Flaten" a string list into 1 long \r\n delimited string.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  h = pointer to list 'dummy' header
  *
  * Returns     :  NULL on malloc error, else new long string.
- *                Caller must free() it.
  *
  *********************************************************************/
-char *list_to_text(const struct list *the_list)
+char *list_to_text(struct list *h)
 {
-   struct list_entry *cur_entry;
+   struct list *p;
    char *ret = NULL;
    char *s;
-   size_t size = 2;
+   int size;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
+   size = 0;
 
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next)
+   for (p = h->next; p ; p = p->next)
    {
-      if (cur_entry->str)
+      if (p->str)
       {
-         size += strlen(cur_entry->str) + 2;
+         size += strlen(p->str) + 2;
       }
    }
 
    if ((ret = (char *)malloc(size + 1)) == NULL)
    {
-      return NULL;
+      return(NULL);
    }
 
    ret[size] = '\0';
 
    s = ret;
 
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next)
+   for (p = h->next; p ; p = p->next)
    {
-      if (cur_entry->str)
+      if (p->str)
       {
-         strcpy(s, cur_entry->str);
+         strcpy(s, p->str);
          s += strlen(s);
          *s++ = '\r'; *s++ = '\n';
       }
    }
-   *s++ = '\r'; *s++ = '\n';
 
-   return ret;
+   return(ret);
+
 }
 
 
@@ -601,54 +354,36 @@ char *list_to_text(const struct list *the_list)
  * Description :  Remove a string from a specified string list.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
- *          2  :  str = string to remove from the list - non-NULL
+ *          1  :  header = pointer to list 'dummy' header
+ *          2  :  str = string to remove from the list
  *
  * Returns     :  Number of times it was removed.
  *
  *********************************************************************/
-int list_remove_item(struct list *the_list, const char *str)
+int list_remove_item(struct list *header, const char *str)
 {
-   struct list_entry *prev = NULL;
-   struct list_entry *cur;
-   struct list_entry *next;
+   struct list *prev = header;
+   struct list *cur = prev->next;
    int count = 0;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
-   assert(str);
-
-   cur = the_list->first;
-
    while (cur != NULL)
    {
-      next = cur->next;
-
       if ((cur->str != NULL) && (0 == strcmp(str, cur->str)))
       {
          count++;
 
-         if (prev != NULL)
-         {
-            prev->next = next;
-         }
-         else
-         {
-            the_list->first = next;
-         }
-         free((char *)cur->str);
+         prev->next = cur->next;
+         free(cur->str);
          free(cur);
       }
       else
       {
          prev = cur;
       }
-      cur = next;
+      cur = prev->next;
    }
 
-   the_list->last = prev;
-
-   assert(list_is_valid(the_list));
+   header->last = prev;
 
    return count;
 }
@@ -671,25 +406,18 @@ int list_remove_item(struct list *the_list, const char *str)
  *********************************************************************/
 int list_remove_list(struct list *dest, const struct list *src)
 {
-   struct list_entry *cur;
+   struct list *cur = src->next;
    int count = 0;
 
-   assert(src);
-   assert(dest);
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
-
-   for (cur = src->first; cur != NULL; cur = cur->next)
+   while (cur != NULL)
    {
       if (cur->str != NULL)
       {
          count += list_remove_item(dest, cur->str);
       }
+      cur = cur->next;
    }
 
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
-
    return count;
 }
 
@@ -698,96 +426,35 @@ int list_remove_list(struct list *dest, const struct list *src)
  *
  * Function    :  list_duplicate
  *
- * Description :  Copy a string list
+ * Description :  Duplicate a string list
  *
  * Parameters  :
- *          1  :  dest = Destination list.  Must be a valid list.
- *                       All existing entries will be removed.
- *          1  :  src = pointer to source list for copy.
+ *          1  :  dest = pointer to destination for copy.  Caller allocs.
+ *          2  :  src = pointer to source for copy.
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, dest will be empty.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err list_duplicate(struct list *dest, const struct list *src)
+void list_duplicate(struct list *dest, const struct list *src)
 {
-   struct list_entry * cur_src;
-   struct list_entry * cur_dest;
+   struct list * cur_src = src->next;
+   struct list * cur_dest = dest;
 
-   assert(src);
-   assert(dest);
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
+   memset(dest, '\0', sizeof(*dest));
 
-   list_remove_all(dest);
-
-   /* Need to process first entry specially so we can set dest->first */
-   cur_src = src->first;
-   if (cur_src)
+   while (cur_src)
    {
-      cur_dest = dest->first = (struct list_entry *)zalloc(sizeof(*cur_dest));
+      cur_dest = cur_dest->next = (struct list *)zalloc(sizeof(*cur_dest));
       if (cur_dest == NULL)
       {
-         destroy_list(dest);
-
-         assert(list_is_valid(src));
-         assert(list_is_valid(dest));
-
-         return JB_ERR_MEMORY;
+         return;
       }
-
-      if (cur_src->str)
-      {
-         cur_dest->str = strdup(cur_src->str);
-         if (cur_dest->str == NULL)
-         {
-            destroy_list(dest);
-
-            assert(list_is_valid(src));
-            assert(list_is_valid(dest));
-
-            return JB_ERR_MEMORY;
-         }
-      }
-      /* else { cur_dest->str = NULL; }  - implied by zalloc */
-
-      /* Now process the rest */
-      for (cur_src = cur_src->next; cur_src; cur_src = cur_src->next)
-      {
-         cur_dest = cur_dest->next = (struct list_entry *)zalloc(sizeof(*cur_dest));
-         if (cur_dest == NULL)
-         {
-            destroy_list(dest);
-
-            assert(list_is_valid(src));
-            assert(list_is_valid(dest));
-
-            return JB_ERR_MEMORY;
-         }
-         if (cur_src->str)
-         {
-            cur_dest->str = strdup(cur_src->str);
-            if (cur_dest->str == NULL)
-            {
-               destroy_list(dest);
-
-               assert(list_is_valid(src));
-               assert(list_is_valid(dest));
-
-               return JB_ERR_MEMORY;
-            }
-         }
-         /* else { cur_dest->str = NULL; }  - implied by zalloc */
-      }
-
-      dest->last = cur_dest;
+      cur_dest->str = strdup(cur_src->str);
+      cur_src = cur_src->next;
    }
 
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
+   dest->last = cur_dest;
 
-   return JB_ERR_OK;
 }
 
 
@@ -799,261 +466,120 @@ jb_err list_duplicate(struct list *dest, const struct list *src)
  *                Duplicate items are not added.
  *
  * Parameters  :
- *          1  :  dest = pointer to destination list for merge.
+ *          1  :  dest = pointer to destination for merge.  Caller allocs.
  *          2  :  src = pointer to source for merge.
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, some (but not all) of src might have
- *                been copied into dest.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err list_append_list_unique(struct list *dest, const struct list *src)
+void list_append_list_unique(struct list *dest, const struct list *src)
 {
-   struct list_entry * cur;
-
-   assert(src);
-   assert(dest);
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
+   struct list * cur = src->next;
 
-   for (cur = src->first; cur; cur = cur->next)
+   while (cur)
    {
-      if (cur->str)
-      {
-         if (enlist_unique(dest, cur->str, 0))
-         {
-            assert(list_is_valid(src));
-            assert(list_is_valid(dest));
-
-            return JB_ERR_MEMORY;
-         }
-      }
+      enlist_unique(dest, cur->str, 0);
+      cur = cur->next;
    }
-
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
-
-   return JB_ERR_OK;
 }
 
 
 /*********************************************************************
  *
- * Function    :  list_is_empty
- *
- * Description :  Test whether a list is empty.  Does not change the list.
- *
- * Parameters  :
- *          1  :  the_list = pointer to list to test.
- *
- * Returns     :  Nonzero iff the list contains no entries.
- *
- *********************************************************************/
-int list_is_empty(const struct list *the_list)
-{
-   assert(the_list);
-   assert(list_is_valid(the_list));
-
-   return (the_list->first == NULL);
-}
-
-
-/*********************************************************************
- *
- * Function    :  new_map
- *
- * Description :  Create a new, empty map.
- *
- * Parameters  :  N/A
- *
- * Returns     :  A new, empty map, or NULL if out of memory.
- *
- *********************************************************************/
-struct map *new_map(void)
-{
-   return (struct map *) zalloc(sizeof(struct map));
-}
-
-
-/*********************************************************************
+ * Function    :  map
  *
- * Function    :  free_map
+ * Description :  Add a mapping from given name to given value to a
+ *                given map.
  *
- * Description :  Free the memory occupied by a map and its
- *                depandant strings
+ *                Note: Since all strings will be free()d in free_map()
+ *                      later, use the copy flags for constants or
+ *                      strings that will be independantly free()d.
  *
  * Parameters  :
- *          1  :  the_map = map to be freed.  May be NULL.
+ *          1  :  map = map to add to
+ *          2  :  name = name to add
+ *          3  :  nc = flag set if a copy of name should be used
+ *          4  :  value = value to add
+ *          5  :  vc = flag set if a copy of value should be used
  *
- * Returns     :  N/A
+ * Returns     :  pointer to extended map, or NULL if failiure
  *
  *********************************************************************/
-void free_map(struct map *the_map)
+struct map *map(struct map *map, char *name, int nc, char *value, int vc)
 {
-   struct map_entry *cur_entry;
-   struct map_entry *next_entry;
+   struct map *cur;
 
-   if (the_map == NULL)
+   if (NULL == (cur = zalloc(sizeof(*cur))))
    {
-      return;
+      return(NULL);
    }
 
-   for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = next_entry)
-   {
-      freez(cur_entry->name);
-      freez(cur_entry->value);
-
-      next_entry = cur_entry->next;
-      free(cur_entry);
-   }
+   cur->name  = nc ? strdup(name) : name;
+   cur->value = vc ? strdup(value) : value;
+   cur->next = map;
 
-   the_map->first = the_map->last = NULL;
+   return(cur);
 
-   free(the_map);
 }
 
 
 /*********************************************************************
  *
- * Function    :  map
- *
- * Description :  Add a mapping from given name to given value to a
- *                given map.
- *
- *                Note: Since all strings will be free()d in free_map()
- *                      later, set the copy flags for constants or
- *                      strings that will be independantly free()d.
- *
- *                Note2: This function allows NULL parameters - it
- *                       returns JB_ERR_MEMORY in that case.
- *
- *                Note3: If this function returns JB_ERR_MEMORY,
- *                       it will free(name) unless you specify
- *                       name_needs_copying, and similarly it will
- *                       free(value) unless you specify
- *                       value_needs_copying.
- *
- *                Due to Note2 and Note3 above, the following code
- *                is legal, and will never crash or leak memory even
- *                if the system runs out of memory:
- *
- *                    err = map(mymap, "xyz", 1, html_encode(somestring), 0);
+ * Function    :  lookup
  *
- *                err will be set to JB_ERR_MEMORY if either call runs
- *                out-of-memory.  Without these features, you would
- *                need to check the return value of html_encode in the
- *                above example for NULL, which (at least) doubles the
- *                amount of error-checking code needed.
+ * Description :  Look up an item with a given name in a map, and
+ *                return its value
  *
  * Parameters  :
- *          1  :  the_map = map to add to
- *          2  :  name = name to add
- *          3  :  name_needs_copying = flag set if a copy of name should be used
- *          4  :  value = value to add
- *          5  :  value_needs_copying = flag set if a copy of value should be used
+ *          1  :  name = name parameter to look for
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  the value if found, else the empty string
  *
  *********************************************************************/
-jb_err map(struct map *the_map,
-           const char *name, int name_needs_copying,
-           const char *value, int value_needs_copying)
+char *lookup(struct map *map, char *name)
 {
-   struct map_entry *new_entry;
+   struct map *p = map;
 
-   assert(the_map);
-
-   if ( (NULL == value)
-     || (NULL == name)
-     || (NULL == (new_entry = zalloc(sizeof(*new_entry)))) )
+   while (p)
    {
-      if ((name != NULL) && (!name_needs_copying))
+      if (!strcmp(name, p->name))
       {
-          free((char *)name);
+         return p->value;
       }
-      if ((value != NULL) && (!value_needs_copying))
-      {
-          free((char *)value);
-      }
-      return JB_ERR_MEMORY;
-   }
-
-   if (name_needs_copying)
-   {
-      if (NULL == (name = strdup(name)))
-      {
-         free(new_entry);
-         if (!value_needs_copying)
-         {
-             free((char *)value);
-         }
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   if (value_needs_copying)
-   {
-      if (NULL == (value = strdup(value)))
-      {
-         free((char *)name);
-         free(new_entry);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   new_entry->name = name;
-   new_entry->value = value;
-   /* new_entry->next = NULL;  - implied by zalloc */
-
-   if (the_map->last)
-   {
-      the_map->last->next = new_entry;
-      the_map->last = new_entry;
-   }
-   else
-   {
-      the_map->first = new_entry;
-      the_map->last = new_entry;
+      p = p->next;
    }
+   return "";
 
-   return JB_ERR_OK;
 }
 
 
 /*********************************************************************
  *
- * Function    :  lookup
+ * Function    :  free_map
  *
- * Description :  Look up an item with a given name in a map, and
- *                return its value
+ * Description :  Free the memory occupied by a map and its
+ *                depandant strings
  *
  * Parameters  :
- *          1  :  the_map = map to look in
- *          2  :  name = name parameter to look for
+ *          1  :  list = list to bee freed
  *
- * Returns     :  the value if found, else the empty string.
- *                Return value is alloced as part of the map, so
- *                it is freed when the map is destroyed.  Caller
- *                must not free or modify it.
+ * Returns     :  N/A
  *
  *********************************************************************/
-const char *lookup(const struct map *the_map, const char *name)
+void free_map(struct map *map)
 {
-   const struct map_entry *cur_entry;
-
-   assert(the_map);
-   assert(name);
+   struct map *p = map;
 
-   for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = cur_entry->next)
+   while (p)
    {
-      if (!strcmp(name, cur_entry->name))
-      {
-         return cur_entry->value;
-      }
+      free(p->name);
+      free(p->value);
+
+      map = p->next;
+      free(p);
+      p = map;
    }
-   return "";
+
 }
 
 
diff --git a/list.h b/list.h
index afa4423..bbaa5aa 100644 (file)
--- a/list.h
+++ b/list.h
@@ -1,6 +1,6 @@
-#ifndef LIST_H_INCLUDED
-#define LIST_H_INCLUDED
-#define LIST_H_VERSION "$Id: list.h,v 1.11 2002/03/24 13:25:43 swa Exp $"
+#ifndef _LIST_H
+#define _LIST_H
+#define LIST_H_VERSION "$Id: list.h,v 1.3 2001/06/03 11:03:48 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/list.h,v $
@@ -10,7 +10,7 @@
  *                   `destroy_list', `enlist' and `list_to_text'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: list.h,v $
- *    Revision 1.11  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.10  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.9  2001/10/23 21:21:03  jongfoster
- *    New error handling - error codes are now jb_errs, not ints.
- *    Changed the way map() handles out-of-memory, to dramatically
- *    reduce the amount of error-checking clutter needed.
- *
- *    Revision 1.8  2001/09/16 17:30:24  jongfoster
- *    Fixing a compiler warning.
- *
- *    Revision 1.7  2001/09/16 13:20:29  jongfoster
- *    Rewrite of list library.  Now has seperate header and list_entry
- *    structures.  Also added a large sprinking of assert()s to the list
- *    code.
- *
- *    Revision 1.6  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.5  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.4  2001/06/29 13:30:37  oes
- *    - Introduced enlist_unique_header()
- *    - Removed logentry from cancelled commit
- *
  *    Revision 1.3  2001/06/03 11:03:48  oes
  *    introduced functions for new list type "map": map(), lookup(),
  *    free_map(), and extended enlist_unique
@@ -104,48 +70,25 @@ extern "C" {
 #endif
 
 
-/*
- * struct list
- *
- * A linked list class.
- */
-
-extern void init_list    (struct list *the_list);
-extern void destroy_list (struct list *the_list);
-
-extern jb_err enlist                 (struct list *the_list, const char *str);
-extern jb_err enlist_unique          (struct list *the_list, const char *str, size_t num_significant_chars);
-extern jb_err enlist_unique_header   (struct list *the_list, const char *name, const char *value);
-extern jb_err enlist_first           (struct list *the_list, const char *str);
-extern jb_err list_append_list_unique(struct list *dest,     const struct list *src);
-extern jb_err list_duplicate         (struct list *dest,     const struct list *src);
-
-extern int    list_remove_item(struct list *the_list, const char *str);
-extern int    list_remove_list(struct list *dest,     const struct list *src);
-extern void   list_remove_all (struct list *the_list);
-
-extern int    list_is_empty(const struct list *the_list);
+extern void enlist(struct list *h, const char *s);
+extern void enlist_unique(struct list *header, const char *str, int n);
+extern void enlist_unique_header(struct list *header, const char *name, const char *value);
+extern void enlist_first(struct list *header, const char *str);
 
-extern char * list_to_text(const struct list *the_list);
+extern int   list_remove_item(struct list *header, const char *str);
 
+extern void  list_append_list_unique(struct list *dest, const struct list *src);
+extern void  list_append_list_unique(struct list *dest, const struct list *src);
+extern int   list_remove_list(struct list *header, const struct list *to_remove);
 
-/*
- * struct map
- *
- * A class which maps names to values.
- *
- * Note: You must allocate this through new_map() and free it
- * through free_map().
- */
-
-extern struct map * new_map  (void);
-extern void         free_map (struct map * the_map);
+extern void  list_duplicate(struct list *dest, const struct list *src);
 
-extern int          map      (struct map * the_map,
-                              const char * name, int name_needs_copying,
-                              const char * value, int value_needs_copying);
-extern const char * lookup   (const struct map * the_map, const char * name);
+extern void  destroy_list(struct list *h);
+extern char *list_to_text(struct list *h);
 
+extern struct map* map(struct map* map, char *name, int nc, char *value, int vc);
+extern char *lookup(struct map *list, char *name);
+extern void free_map(struct map *list);
 
 /* Revision control strings from this header and associated .c file */
 extern const char list_rcs[];
@@ -155,7 +98,7 @@ extern const char list_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef LIST_H_INCLUDED */
+#endif /* ndef _LIST_H */
 
 /*
   Local Variables:
index 10bba47..d999b02 100644 (file)
--- a/loadcfg.c
+++ b/loadcfg.c
@@ -1,21 +1,21 @@
-const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $";
+const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.18 2001/07/13 14:01:14 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loadcfg.c,v $
  *
  * Purpose     :  Loads settings from the configuration file into
- *                global variables.  This file contains both the
+ *                global variables.  This file contains both the 
  *                routine to load the configuration and the global
  *                variables it writes to.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -35,96 +35,6 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: loadcfg.c,v $
- *    Revision 1.39  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.38  2002/03/24 13:05:48  jongfoster
- *    Renaming re_filterfile to filterfile
- *
- *    Revision 1.37  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.36  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.35  2002/03/07 03:52:44  oes
- *    Set logging to tty for --no-daemon mode
- *
- *    Revision 1.34  2002/03/06 23:14:35  jongfoster
- *    Trivial cosmetic changes to make function comments easier to find.
- *
- *    Revision 1.33  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.32  2002/03/04 18:24:53  oes
- *    Re-enabled output of unknown config directive hash
- *
- *    Revision 1.31  2002/03/03 15:07:20  oes
- *    Re-enabled automatic config reloading
- *
- *    Revision 1.30  2002/01/22 23:31:43  jongfoster
- *    Replacing strsav() with string_append()
- *
- *    Revision 1.29  2002/01/17 21:02:30  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.28  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.27  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.26  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.25  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.24  2001/10/23 21:40:30  jongfoster
- *    Added support for enable-edit-actions and enable-remote-toggle config
- *    file options.
- *
- *    Revision 1.23  2001/10/07 15:36:00  oes
- *    Introduced new config option "buffer-limit"
- *
- *    Revision 1.22  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.21  2001/09/16 17:10:43  jongfoster
- *    Moving function savearg() here, since it was the only thing left in
- *    showargs.c.
- *
- *    Revision 1.20  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.19  2001/07/15 17:45:16  jongfoster
- *    Removing some unused #includes
- *
  *    Revision 1.18  2001/07/13 14:01:14  oes
  *     - Removed all #ifdef PCRS
  *     - Removed vim-settings
@@ -285,7 +195,6 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
 #include <fcntl.h>
 #include <errno.h>
 #include <ctype.h>
-#include <assert.h>
 
 #ifdef _WIN32
 
@@ -301,11 +210,9 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
 
 #else /* ifndef _WIN32 */
 
-#ifndef __OS2__
 # include <unistd.h>
-# include <sys/wait.h>
-#endif
 # include <sys/time.h>
+# include <sys/wait.h>
 # include <sys/stat.h>
 # include <signal.h>
 
@@ -316,11 +223,14 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
 #include "jcc.h"
 #include "filters.h"
 #include "loaders.h"
+#include "showargs.h"
+#include "parsers.h"
+#include "killpopup.h"
 #include "miscutil.h"
 #include "errlog.h"
+#include "jbsockets.h"
+#include "gateway.h"
 #include "ssplit.h"
-#include "encode.h"
-#include "urlmatch.h"
 
 const char loadcfg_h_rcs[] = LOADCFG_H_VERSION;
 
@@ -335,10 +245,10 @@ const char loadcfg_h_rcs[] = LOADCFG_H_VERSION;
 #define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
 #define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
 /* by haroon - indicates if ijb is enabled */
 int g_bToggleIJB        = 1;   /* JunkBusters is enabled by default. */
-#endif /* def FEATURE_TOGGLE */
+#endif
 
 /* The filename of the configfile */
 const char *configfile  = NULL;
@@ -367,13 +277,9 @@ static struct file_list *current_configfile = NULL;
 
 #define hash_actions_file              1196306641ul /* "actionsfile" */
 #define hash_admin_address             4112573064ul /* "admin-address" */
-#define hash_buffer_limit              1881726070ul /* "buffer-limit */
 #define hash_confdir                      1978389ul /* "confdir" */
 #define hash_debug                          78263ul /* "debug" */
 #define hash_deny_access               1227333715ul /* "deny-access" */
-#define hash_enable_edit_actions       2517097536ul /* "enable-edit-actions" */
-#define hash_enable_remote_toggle      2979744683ul /* "enable-remote-toggle" */
-#define hash_filterfile                 250887266ul /* "filterfile" */
 #define hash_forward                      2029845ul /* "forward" */
 #define hash_forward_socks4            3963965521ul /* "forward-socks4" */
 #define hash_forward_socks4a           2639958518ul /* "forward-socks4a" */
@@ -383,6 +289,7 @@ static struct file_list *current_configfile = NULL;
 #define hash_logfile                      2114766ul /* "logfile" */
 #define hash_permit_access             3587953268ul /* "permit-access" */
 #define hash_proxy_info_url            3903079059ul /* "proxy-info-url" */
+#define hash_re_filterfile             3877522444ul /* "re_filterfile" */
 #define hash_single_threaded           4250084780ul /* "single-threaded" */
 #define hash_suppress_blocklists       1948693308ul /* "suppress-blocklists" */
 #define hash_toggle                        447966ul /* "toggle" */
@@ -401,7 +308,6 @@ static struct file_list *current_configfile = NULL;
 #define hash_show_on_task_bar           215410365ul /* "show-on-task-bar" */
 
 
-static void savearg(char *command, char *argument, struct configuration_spec * config);
 
 /*********************************************************************
  *
@@ -419,7 +325,7 @@ void unload_configfile (void * data)
 {
    struct configuration_spec * config = (struct configuration_spec *)data;
    struct forward_spec *cur_fwd = config->forward;
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
    struct access_control_list *cur_acl = config->acl;
 
    while (cur_acl != NULL)
@@ -429,12 +335,12 @@ void unload_configfile (void * data)
       cur_acl = next_acl;
    }
    config->acl = NULL;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    while (cur_fwd != NULL)
    {
       struct forward_spec * next_fwd = cur_fwd->next;
-      free_url_spec(cur_fwd->url);
+      free_url(cur_fwd->url);
 
       freez(cur_fwd->gateway_host);
       freez(cur_fwd->forward_host);
@@ -442,57 +348,37 @@ void unload_configfile (void * data)
       cur_fwd = next_fwd;
    }
    config->forward = NULL;
-
-#ifdef FEATURE_COOKIE_JAR
+   
+#ifdef JAR_FILES
    if ( NULL != config->jar )
    {
       fclose( config->jar );
       config->jar = NULL;
    }
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
-   freez(config->confdir);
-   freez(config->logdir);
+   freez((char *)config->confdir);
+   freez((char *)config->logdir);
 
-   freez(config->haddr);
-   freez(config->logfile);
+   freez((char *)config->haddr);
+   freez((char *)config->logfile);
 
-   freez(config->actions_file);
-   freez(config->admin_address);
-   freez(config->proxy_info_url);
-   freez(config->proxy_args);
+   freez((char *)config->actions_file);
+   freez((char *)config->admin_address);
+   freez((char *)config->proxy_info_url);
+   freez((char *)config->proxy_args);
 
-#ifdef FEATURE_COOKIE_JAR
-   freez(config->jarfile);
-#endif /* def FEATURE_COOKIE_JAR */
+#ifdef JAR_FILES
+   freez((char *)config->jarfile);
+#endif /* def JAR_FILES */
 
-   freez(config->re_filterfile);
+#ifndef SPLIT_PROXY_ARGS
+   freez((char *)config->suppress_message);
+#endif /* ndef SPLIT_PROXY_ARGS */
 
-}
+   freez((char *)config->re_filterfile);
 
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_config_file
- *
- * Description :  Unloads current config file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_config_file(void)
-{
-   if (current_configfile)
-   {
-      current_configfile->unloader = unload_configfile;
-      current_configfile = NULL;
-   }
 }
-#endif
 
 
 /*********************************************************************
@@ -502,7 +388,7 @@ void unload_current_config_file(void)
  * Description :  Load the config file and all parameters.
  *
  * Parameters  :
- *          1  :  csp = Client state (the config member will be
+ *          1  :  csp = Client state (the config member will be 
  *                filled in by this function).
  *
  * Returns     :  0 => Ok, everything else is an error.
@@ -516,9 +402,8 @@ struct configuration_spec * load_config(void)
    struct configuration_spec * config = NULL;
    struct client_state * fake_csp;
    struct file_list *fs;
-   unsigned long linenum = 0;
 
-   if ( !check_file_changed(current_configfile, configfile, &fs))
+   if (!check_file_changed(current_configfile, configfile, &fs))
    {
       /* No need to load */
       return ((struct configuration_spec *)current_configfile->f);
@@ -531,9 +416,9 @@ struct configuration_spec * load_config(void)
 
    log_error(LOG_LEVEL_INFO, "loading configuration file '%s':", configfile);
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
    g_bToggleIJB      = 1;
-#endif /* def FEATURE_TOGGLE */
+#endif
 
    fs->f = config = (struct configuration_spec *)zalloc(sizeof(*config));
 
@@ -547,9 +432,9 @@ struct configuration_spec * load_config(void)
 
    /*
     * This is backwards from how it's usually done.
-    * Following the usual pattern, "fs" would be stored in a member
+    * Following the usual pattern, "fs" would be stored in a member 
     * variable in "csp", and then we'd access "config" from "fs->f",
-    * using a cast.  However, "config" is used so often that a
+    * using a cast.  However, "config" is used so often that a 
     * cast each time would be very ugly, and the extra indirection
     * would waste CPU cycles.  Therefore we store "config" in
     * "csp->config", and "fs" in "csp->config->config_file_list".
@@ -562,8 +447,6 @@ struct configuration_spec * load_config(void)
 
    config->multi_threaded    = 1;
    config->hport             = HADDR_PORT;
-   config->buffer_limit      = 4096 * 1024;
-   config->proxy_args        = strdup("");
 
    if ((configfp = fopen(configfile, "r")) == NULL)
    {
@@ -572,14 +455,14 @@ struct configuration_spec * load_config(void)
       /* Never get here - LOG_LEVEL_FATAL causes program exit */
    }
 
-   while (read_config_line(buf, sizeof(buf), configfp, &linenum) != NULL)
+   while (read_config_line(buf, sizeof(buf), configfp, fs) != NULL)
    {
       char cmd[BUFFER_SIZE];
       char arg[BUFFER_SIZE];
       char tmp[BUFFER_SIZE];
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
       struct access_control_list *cur_acl;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
       struct forward_spec *cur_fwd;
       int vec_count;
       char *vec[3];
@@ -625,50 +508,43 @@ struct configuration_spec * load_config(void)
 
       switch( hash_string( cmd ) )
       {
-/* *************************************************************************
+/****************************************************************************
  * actionsfile actions-file-name
  * In confdir by default
- * *************************************************************************/
+ ****************************************************************************/
          case hash_actions_file :
-            freez(config->actions_file);
+            freez((char *)config->actions_file);
             config->actions_file = make_path(config->confdir, arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * admin-address email-address
- * *************************************************************************/
+ ****************************************************************************/
          case hash_admin_address :
-            freez(config->admin_address);
+            freez((char *)config->admin_address);
             config->admin_address = strdup(arg);
-            continue;
+            continue;       
 
-/* *************************************************************************
- * buffer-limit n
- * *************************************************************************/
-         case hash_buffer_limit :
-            config->buffer_limit = (size_t) 1024 * atoi(arg);
-            continue;
-
-/* *************************************************************************
+/****************************************************************************
  * confdir directory-name
- * *************************************************************************/
+ ****************************************************************************/
          case hash_confdir :
-            freez(config->confdir);
-            config->confdir = make_path( NULL, arg);
-            continue;
+            freez((char *)config->confdir);
+            config->confdir = strdup(arg);
+            continue;            
 
-/* *************************************************************************
+/****************************************************************************
  * debug n
  * Specifies debug level, multiple values are ORed together.
- * *************************************************************************/
+ ****************************************************************************/
          case hash_debug :
             config->debug |= atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * deny-access source-ip[/significant-bits] [dest-ip[/significant-bits]]
- * *************************************************************************/
-#ifdef FEATURE_ACL
+ ****************************************************************************/
+#ifdef ACL_FILES
          case hash_deny_access:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -676,7 +552,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "deny-access directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "deny-access directive in configuration file.<br><br>\n");
                continue;
@@ -697,12 +573,12 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Invalid source IP for deny-access "
                      "directive in configuration file: \"%s\"", vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Invalid source IP for deny-access directive"
                   " in configuration file: \"");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "\"<br><br>\n");
                freez(cur_acl);
                continue;
@@ -713,12 +589,12 @@ struct configuration_spec * load_config(void)
                {
                   log_error(LOG_LEVEL_ERROR, "Invalid destination IP for deny-access "
                         "directive in configuration file: \"%s\"", vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "<br>\nWARNING: Invalid destination IP for deny-access directive"
                      " in configuration file: \"");
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "\"<br><br>\n");
                   freez(cur_acl);
                   continue;
@@ -731,50 +607,18 @@ struct configuration_spec * load_config(void)
              * actions file, the last match wins.  However, the internal
              * implementations are different:  The actions file is stored
              * in the same order as the file, and scanned completely.
-             * With the ACL, we reverse the order as we load it, then
+             * With the ACL, we reverse the order as we load it, then 
              * when we scan it we stop as soon as we get a match.
              */
             cur_acl->next  = config->acl;
             config->acl = cur_acl;
 
             continue;
-#endif /* def FEATURE_ACL */
-
-/* *************************************************************************
- * enable-edit-actions 0|1
- * *************************************************************************/
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-         case hash_enable_edit_actions:
-            if ((*arg != '\0') && (0 != atoi(arg)))
-            {
-               config->feature_flags |= RUNTIME_FEATURE_CGI_EDIT_ACTIONS;
-            }
-            else
-            {
-               config->feature_flags &= ~RUNTIME_FEATURE_CGI_EDIT_ACTIONS;
-            }
-            continue;
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-/* *************************************************************************
- * enable-remote-toggle 0|1
- * *************************************************************************/
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-         case hash_enable_remote_toggle:
-            if ((*arg != '\0') && (0 != atoi(arg)))
-            {
-               config->feature_flags |= RUNTIME_FEATURE_CGI_TOGGLE;
-            }
-            else
-            {
-               config->feature_flags &= ~RUNTIME_FEATURE_CGI_TOGGLE;
-            }
-            continue;
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
+#endif /* def ACL_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * forward url-pattern (.|http-proxy-host[:port])
- * *************************************************************************/
+ ****************************************************************************/
          case hash_forward:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -782,7 +626,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for forward "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "forward directive in configuration file.");
                continue;
@@ -804,7 +648,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Bad URL specifier for "
                   "forward directive in configuration file.");
                continue;
@@ -817,7 +661,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->forward_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->forward_host, ':')))
+               if ((p = strchr(cur_fwd->forward_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->forward_port = atoi(p);
@@ -835,9 +679,9 @@ struct configuration_spec * load_config(void)
 
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * forward-socks4 url-pattern socks-proxy[:port] (.|http-proxy[:port])
- * *************************************************************************/
+ ****************************************************************************/
          case hash_forward_socks4:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -845,7 +689,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "forward-socks4 directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "forward-socks4 directive in configuration file.");
                continue;
@@ -867,7 +711,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4 "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Bad URL specifier for "
                   "forward-socks4 directive in configuration file.");
                continue;
@@ -880,7 +724,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->gateway_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->gateway_host, ':')))
+               if ((p = strchr(cur_fwd->gateway_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->gateway_port = atoi(p);
@@ -898,7 +742,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->forward_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->forward_host, ':')))
+               if ((p = strchr(cur_fwd->forward_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->forward_port = atoi(p);
@@ -913,12 +757,12 @@ struct configuration_spec * load_config(void)
             /* Add to list. */
             cur_fwd->next = config->forward;
             config->forward = cur_fwd;
-
+            
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * forward-socks4a url-pattern socks-proxy[:port] (.|http-proxy[:port])
- * *************************************************************************/
+ ****************************************************************************/
          case hash_forward_socks4a:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -926,7 +770,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "forward-socks4a directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "forward-socks4a directive in configuration file.");
                continue;
@@ -948,7 +792,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4a "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Bad URL specifier for "
                   "forward-socks4a directive in configuration file.");
                continue;
@@ -959,7 +803,7 @@ struct configuration_spec * load_config(void)
 
             cur_fwd->gateway_host = strdup(p);
 
-            if (NULL != (p = strchr(cur_fwd->gateway_host, ':')))
+            if ((p = strchr(cur_fwd->gateway_host, ':')))
             {
                *p++ = '\0';
                cur_fwd->gateway_port = atoi(p);
@@ -976,7 +820,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->forward_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->forward_host, ':')))
+               if ((p = strchr(cur_fwd->forward_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->forward_port = atoi(p);
@@ -991,49 +835,49 @@ struct configuration_spec * load_config(void)
             /* Add to list. */
             cur_fwd->next = config->forward;
             config->forward = cur_fwd;
-
+            
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * jarfile jar-file-name
  * In logdir by default
- * *************************************************************************/
-#ifdef FEATURE_COOKIE_JAR
+ ****************************************************************************/
+#ifdef JAR_FILES
          case hash_jarfile :
-            freez(config->jarfile);
+            freez((char *)config->jarfile);
             config->jarfile = make_path(config->logdir, arg);
             continue;
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * listen-address [ip][:port]
- * *************************************************************************/
+ ****************************************************************************/
          case hash_listen_address :
-            freez(config->haddr);
+            freez((char *)config->haddr);
             config->haddr = strdup(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * logdir directory-name
- * *************************************************************************/
+ ****************************************************************************/
          case hash_logdir :
-            freez(config->logdir);
-            config->logdir = make_path(NULL, arg);
-            continue;
+            freez((char *)config->logdir);
+            config->logdir = strdup(arg);
+            continue;            
 
-/* *************************************************************************
+/****************************************************************************
  * logfile log-file-name
  * In logdir by default
- * *************************************************************************/
+ ****************************************************************************/
          case hash_logfile :
-            freez(config->logfile);
-            config->logfile = no_daemon ? NULL : make_path(config->logdir, arg);
+            freez((char *)config->logfile);
+            config->logfile = make_path(config->logdir, arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * permit-access source-ip[/significant-bits] [dest-ip[/significant-bits]]
- * *************************************************************************/
-#ifdef FEATURE_ACL
+ ****************************************************************************/
+#ifdef ACL_FILES
          case hash_permit_access:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -1041,7 +885,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "permit-access directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "permit-access directive in configuration file.<br><br>\n");
 
@@ -1063,12 +907,12 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Invalid source IP for permit-access "
                      "directive in configuration file: \"%s\"", vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Invalid source IP for permit-access directive"
                   " in configuration file: \"");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "\"<br><br>\n");
                freez(cur_acl);
                continue;
@@ -1080,12 +924,12 @@ struct configuration_spec * load_config(void)
                   log_error(LOG_LEVEL_ERROR, "Invalid destination IP for "
                         "permit-access directive in configuration file: \"%s\"",
                         vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "<br>\nWARNING: Invalid destination IP for permit-access directive"
                      " in configuration file: \"");
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "\"<br><br>\n");
                   freez(cur_acl);
                   continue;
@@ -1098,76 +942,95 @@ struct configuration_spec * load_config(void)
              * actions file, the last match wins.  However, the internal
              * implementations are different:  The actions file is stored
              * in the same order as the file, and scanned completely.
-             * With the ACL, we reverse the order as we load it, then
+             * With the ACL, we reverse the order as we load it, then 
              * when we scan it we stop as soon as we get a match.
              */
             cur_acl->next  = config->acl;
             config->acl = cur_acl;
 
             continue;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * proxy-info-url url
- * *************************************************************************/
+ ****************************************************************************/
          case hash_proxy_info_url :
-            freez(config->proxy_info_url);
+            freez((char *)config->proxy_info_url);
             config->proxy_info_url = strdup(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * re_filterfile file-name
  * In confdir by default.
- * *************************************************************************/
-         case hash_filterfile :
-            freez(config->re_filterfile);
+ ****************************************************************************/
+         case hash_re_filterfile :
+            freez((char *)config->re_filterfile);
             config->re_filterfile = make_path(config->confdir, arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * single-threaded
- * *************************************************************************/
+ ****************************************************************************/
          case hash_single_threaded :
             config->multi_threaded = 0;
             continue;
 
-/* *************************************************************************
+/****************************************************************************
+ * FIXME: Document this FIXME2: Shouldn't we throw this out? --oes
+ ****************************************************************************/
+#ifndef SPLIT_PROXY_ARGS
+         case hash_suppress_blocklists :
+            if (arg[0] != '\0')
+            {
+               config->suppress_message = strdup(arg);
+            }
+            else
+            {
+               /* There will be NO reference in proxy-args. */
+               config->suppress_message = NULL;
+            }
+
+            config->suppress_blocklists = 1;
+            continue;
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+/****************************************************************************
  * toggle (0|1)
- * *************************************************************************/
-#ifdef FEATURE_TOGGLE
+ ****************************************************************************/
+#ifdef TOGGLE
          case hash_toggle :
             g_bToggleIJB = atoi(arg);
             continue;
-#endif /* def FEATURE_TOGGLE */
+#endif /* def TOGGLE */
 
-/* *************************************************************************
+/****************************************************************************
  * trust-info-url url
- * *************************************************************************/
-#ifdef FEATURE_TRUST
+ ****************************************************************************/
+#ifdef TRUST_FILES
          case hash_trust_info_url :
             enlist(config->trust_info, arg);
             continue;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * trustfile filename
  * (In confdir by default.)
- * *************************************************************************/
-#ifdef FEATURE_TRUST
+ ****************************************************************************/
+#ifdef TRUST_FILES
          case hash_trustfile :
-            freez(config->trustfile);
+            freez((char *)config->trustfile);
             config->trustfile = make_path(config->confdir, arg);
             continue;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
-/* *************************************************************************
+/****************************************************************************
  * Win32 Console options:
- * *************************************************************************/
+ ****************************************************************************/
 
-/* *************************************************************************
+/****************************************************************************
  * hide-console
- * *************************************************************************/
+ ****************************************************************************/
 #ifdef _WIN_CONSOLE
          case hash_hide_console :
             hideConsole = 1;
@@ -1175,70 +1038,70 @@ struct configuration_spec * load_config(void)
 #endif /*def _WIN_CONSOLE*/
 
 
-/* *************************************************************************
+/****************************************************************************
  * Win32 GUI options:
- * *************************************************************************/
+ ****************************************************************************/
 
 #if defined(_WIN32) && ! defined(_WIN_CONSOLE)
-/* *************************************************************************
+/****************************************************************************
  * activity-animation (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_activity_animation :
             g_bShowActivityAnimation = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  *  close-button-minimizes (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_close_button_minimizes :
             g_bCloseHidesWindow = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-buffer-size (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_buffer_size :
             g_bLimitBufferSize = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-font-name fontnane
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_font_name :
             strcpy( g_szFontFaceName, arg );
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-font-size n
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_font_size :
             g_nFontSize = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-highlight-messages (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_highlight_messages :
             g_bHighlightMessages = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-max-lines n
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_max_lines :
             g_nMaxBufferLines = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-messages (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_messages :
             g_bLogMessages = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * show-on-task-bar (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_show_on_task_bar :
             g_bShowOnTaskBar = atoi(arg);
             continue;
@@ -1246,29 +1109,28 @@ struct configuration_spec * load_config(void)
 #endif /* defined(_WIN32) && ! defined(_WIN_CONSOLE) */
 
 
-/* *************************************************************************
- * Warnings about unsupported features
- * *************************************************************************/
-#ifndef FEATURE_ACL
+/****************************************************************************/
+/* Warnings about unsupported features                                      */
+/****************************************************************************/
+#ifndef ACL_FILES
          case hash_deny_access:
-#endif /* ndef FEATURE_ACL */
-#ifndef FEATURE_CGI_EDIT_ACTIONS
-         case hash_enable_edit_actions:
-         case hash_enable_remote_toggle:
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-#ifndef FEATURE_COOKIE_JAR
+#endif /* ndef ACL_FILES */
+#ifndef JAR_FILES
          case hash_jarfile :
-#endif /* ndef FEATURE_COOKIE_JAR */
-#ifndef FEATURE_ACL
+#endif /* ndef JAR_FILES */
+#ifndef ACL_FILES
          case hash_permit_access:
-#endif /* ndef FEATURE_ACL */
-#ifndef FEATURE_TOGGLE
+#endif /* ndef ACL_FILES */
+#ifdef SPLIT_PROXY_ARGS
+         case hash_suppress_blocklists :
+#endif /* def SPLIT_PROXY_ARGS */
+#ifndef TOGGLE
          case hash_toggle :
-#endif /* ndef FEATURE_TOGGLE */
-#ifndef FEATURE_TRUST
+#endif /* ndef TOGGLE */
+#ifndef TRUST_FILES
          case hash_trustfile :
          case hash_trust_info_url :
-#endif /* ndef FEATURE_TRUST */
+#endif /* ndef TRUST_FILES */
 
 #ifndef _WIN_CONSOLE
          case hash_hide_console :
@@ -1289,32 +1151,27 @@ struct configuration_spec * load_config(void)
             /* log_error(LOG_LEVEL_INFO, "Unsupported directive \"%s\" ignored.", cmd); */
             continue;
 
-/* *************************************************************************/
+/****************************************************************************/
          default :
-/* *************************************************************************/
+/****************************************************************************/
             /*
              * I decided that I liked this better as a warning than an
              * error.  To change back to an error, just change log level
              * to LOG_LEVEL_FATAL.
              */
-            log_error(LOG_LEVEL_ERROR, "Unrecognized directive '%s' (%luul) in line %lu in "
-                  "configuration file (%s).",  buf, hash_string(cmd), linenum, configfile);
-            string_append(&config->proxy_args, "<br>\nWARNING: unrecognized directive : ");
-            string_append(&config->proxy_args, buf);
-            string_append(&config->proxy_args, "<br><br>\n");
+            log_error(LOG_LEVEL_ERROR, "Unrecognized directive (%luul) in "
+                  "configuration file: \"%s\"", hash_string( cmd ), buf);
+            config->proxy_args = strsav( config->proxy_args, "<br>\nWARNING: unrecognized directive : ");
+            config->proxy_args = strsav( config->proxy_args, buf);
+            config->proxy_args = strsav( config->proxy_args, "<br><br>\n");
             continue;
 
-/* *************************************************************************/
+/****************************************************************************/
       } /* end switch( hash_string(cmd) ) */
    } /* end while ( read_config_line(...) ) */
 
    fclose(configfp);
 
-   if (NULL == config->proxy_args)
-   {
-      log_error(LOG_LEVEL_FATAL, "Out of memory loading config - insufficient memory for config->proxy_args");
-   }
-
    init_error_log(Argv[0], config->logfile, config->debug);
 
    if (config->actions_file)
@@ -1327,14 +1184,14 @@ struct configuration_spec * load_config(void)
       add_loader(load_re_filterfile, config);
    }
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
    if (config->trustfile)
    {
       add_loader(load_trustfile, config);
    }
-#endif /* def FEATURE_TRUST */
+#endif
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef JAR_FILES
    if ( NULL != config->jarfile )
    {
       if ( NULL == (config->jar = fopen(config->jarfile, "a")) )
@@ -1344,7 +1201,7 @@ struct configuration_spec * load_config(void)
       }
       setbuf(config->jar, NULL);
    }
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
    if ( NULL == config->haddr )
    {
@@ -1353,7 +1210,7 @@ struct configuration_spec * load_config(void)
 
    if ( NULL != config->haddr )
    {
-      if (NULL != (p = strchr(config->haddr, ':')))
+      if ((p = strchr(config->haddr, ':')))
       {
          *p++ = '\0';
          if (*p)
@@ -1390,16 +1247,23 @@ struct configuration_spec * load_config(void)
    }
    freez(fake_csp);
 
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
+
 /* FIXME: this is a kludge for win32 */
 #if defined(_WIN32) && !defined (_WIN_CONSOLE)
 
    g_actions_file     = config->actions_file;
    g_re_filterfile    = config->re_filterfile;
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
    g_trustfile        = config->trustfile;
-#endif /* def FEATURE_TRUST */
-
+#endif
+   
 
 #endif /* defined(_WIN32) && !defined (_WIN_CONSOLE) */
 /* FIXME: end kludge */
@@ -1450,77 +1314,6 @@ struct configuration_spec * load_config(void)
 }
 
 
-/*********************************************************************
- *
- * Function    :  savearg
- *
- * Description :  Called from `load_config'.  It saves each non-empty
- *                and non-comment line from config into
- *                config->proxy_args.  This is used to create the
- *                show-proxy-args page.  On error, frees
- *                config->proxy_args and sets it to NULL
- *
- * Parameters  :
- *          1  :  command = config setting that was found
- *          2  :  argument = the setting's argument (if any)
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-static void savearg(char *command, char *argument, struct configuration_spec * config)
-{
-   char * buf;
-   char * s;
-
-   assert(command);
-   assert(*command);
-   assert(argument);
-
-   buf = strdup("");
-
-   s = html_encode(command);
-   if (NULL == s)
-   {
-      freez(buf);
-      freez(config->proxy_args);
-      return;
-   }
-   string_append(&buf, "<a href=\"" REDIRECT_URL "option#");
-   string_append(&buf, s);
-   string_append(&buf, "\">");
-   string_join  (&buf, s);
-   string_append(&buf, "</a> ");
-
-   if ( (NULL != argument) && ('\0' != *argument) )
-   {
-      s = html_encode(argument);
-      if (NULL == s)
-      {
-         freez(buf);
-         freez(config->proxy_args);
-         return;
-      }
-
-      if (strncmpic(argument, "http://", 7) == 0)
-      {
-         string_append(&buf, "<a href=\"");
-         string_append(&buf, s);
-         string_append(&buf, "\">");
-         string_join  (&buf, s);
-         string_append(&buf, "</a>");
-      }
-      else
-      {
-         string_join  (&buf, s);
-      }
-   }
-
-   string_append(&buf, "<br>\n");
-
-   string_join(&config->proxy_args, buf);
-}
-
-
 /*
   Local Variables:
   tab-width: 3
index 3e71b75..ea13f48 100644 (file)
--- a/loadcfg.h
+++ b/loadcfg.h
@@ -1,6 +1,6 @@
-#ifndef LOADCFG_H_INCLUDED
-#define LOADCFG_H_INCLUDED
-#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.10 2002/03/24 13:25:43 swa Exp $"
+#ifndef _LOADCFG_H
+#define _LOADCFG_H
+#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.4 2001/05/22 18:46:04 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loadcfg.h,v $
@@ -11,7 +11,7 @@
  *                variables it writes to.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: loadcfg.h,v $
- *    Revision 1.10  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.9  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.8  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.7  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.6  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.5  2001/05/26 00:28:36  jongfoster
- *    Automatic reloading of config file.
- *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
- *    Most of the global variables have been moved to a new
- *    struct configuration_spec, accessed through csp->config->globalname
- *    Most of the globals remaining are used by the Win32 GUI.
- *
  *    Revision 1.4  2001/05/22 18:46:04  oes
  *
  *    - Enabled filtering banners by size rather than URL
  *********************************************************************/
 \f
 
+/* Declare struct FILE for vars and funcs. */
+#include <stdio.h>
+
+/* All of our project's data types. */
+#include "project.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/* Don't need project.h, only this: */
-struct configuration_spec;
-
 /* Global variables */
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
 /* indicates if ijb is enabled */
 extern int g_bToggleIJB;
-#endif /* def FEATURE_TOGGLE */
+#endif
 
 extern const char *configfile;
 
@@ -163,14 +131,10 @@ extern const char *configfile;
  */
 extern int Argc;
 extern const char **Argv;
-extern short int MustReload;
 
 
 extern struct configuration_spec * load_config(void);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-void unload_current_config_file(void);
-#endif
 
 /* Revision control strings from this header and associated .c file */
 extern const char loadcfg_rcs[];
@@ -180,7 +144,7 @@ extern const char loadcfg_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef LOADCFG_H_INCLUDED */
+#endif /* ndef _JCC_H */
 
 /*
   Local Variables:
index f63b916..577a653 100644 (file)
--- a/loaders.c
+++ b/loaders.c
@@ -1,21 +1,21 @@
-const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $";
+const char loaders_rcs[] = "$Id: loaders.c,v 1.22 2001/07/20 15:16:17 haroon Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loaders.c,v $
  *
  * Purpose     :  Functions to load and unload the various
  *                configuration files.  Also contains code to manage
- *                the list of active loaders, and to automatically
+ *                the list of active loaders, and to automatically 
  *                unload files that are no longer in use.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -35,108 +35,6 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: loaders.c,v $
- *    Revision 1.46  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.45  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.44  2002/03/16 21:51:00  jongfoster
- *    Fixing free(NULL).
- *
- *    Revision 1.43  2002/03/16 20:28:34  oes
- *    Added descriptions to the filters so users will know what they select in the cgi editor
- *
- *    Revision 1.42  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.41  2002/03/12 01:42:50  oes
- *    Introduced modular filters
- *
- *    Revision 1.40  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.39  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.38  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.37  2002/03/03 15:07:49  oes
- *    Re-enabled automatic config reloading
- *
- *    Revision 1.36  2002/01/22 23:46:18  jongfoster
- *    Moving edit_read_line() and simple_read_line() to loaders.c, and
- *    extending them to support reading MS-DOS, Mac and UNIX style files
- *    on all platforms.
- *
- *    Modifying read_config_line() (without changing it's prototype) to
- *    be a trivial wrapper for edit_read_line().  This means that we have
- *    one function to read a line and handle comments, which is common
- *    between the initialization code and the edit interface.
- *
- *    Revision 1.35  2002/01/17 21:03:08  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.34  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.33  2001/11/13 00:16:38  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.32  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.31  2001/10/26 17:39:01  oes
- *    Removed csp->referrer
- *    Moved ijb_isspace and ijb_tolower to project.h
- *
- *    Revision 1.30  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.29  2001/10/23 21:38:53  jongfoster
- *    Adding error-checking to create_url_spec()
- *
- *    Revision 1.28  2001/10/07 15:40:39  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Revision 1.27  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.26  2001/09/22 14:05:22  jongfoster
- *    Bugfix: Multiple escaped "#" characters in a configuration
- *    file are now permitted.
- *    Also removing 3 unused headers.
- *
- *    Revision 1.25  2001/09/13 22:44:03  jongfoster
- *    Adding {} to an if statement
- *
- *    Revision 1.24  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.23  2001/07/20 15:51:54  oes
- *    Fixed indentation of prepocessor commands
- *
  *    Revision 1.22  2001/07/20 15:16:17  haroon
  *    - per Guy's suggestion, added a while loop in sweep() to catch not just
  *      the last inactive CSP but all other consecutive inactive CSPs after that
@@ -262,36 +160,48 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $"
 #include <stdlib.h>
 #include <sys/types.h>
 #include <string.h>
+#include <malloc.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <ctype.h>
-#include <assert.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
 #include "project.h"
 #include "list.h"
 #include "loaders.h"
+#include "encode.h"
 #include "filters.h"
 #include "parsers.h"
 #include "jcc.h"
+#include "ssplit.h"
 #include "miscutil.h"
 #include "errlog.h"
+#include "gateway.h"
 #include "actions.h"
-#include "urlmatch.h"
 
 const char loaders_h_rcs[] = LOADERS_H_VERSION;
 
+/* Fix a problem with Solaris.  There should be no effect on other
+ * platforms.
+ * Solaris's isspace() is a macro which uses it's argument directly
+ * as an array index.  Therefore we need to make sure that high-bit
+ * characters generate +ve values, and ideally we also want to make
+ * the argument match the declared parameter type of "int".
+ */
+#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))
+
+
 /*
  * Currently active files.
  * These are also entered in the main linked list of files.
  */
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 static struct file_list *current_trustfile      = NULL;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 static struct file_list *current_re_filterfile  = NULL;
 
@@ -332,9 +242,9 @@ void sweep(void)
       fl->active = 0;
    }
 
-   for (csp = clients; csp && (NULL != (ncsp = csp->next)) ; csp = csp->next)
+   for (csp = clients; csp && (ncsp = csp->next) ; csp = csp->next)
    {
-      if (ncsp->flags & CSP_FLAG_ACTIVE)
+      if (ncsp->active)
       {
          /* mark this client's files as active */
 
@@ -355,56 +265,60 @@ void sweep(void)
             ncsp->rlist->active = 1;
          }
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
          if (ncsp->tlist)     /* trust files */
          {
             ncsp->tlist->active = 1;
          }
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
       }
       else
-      /*
-       * this client is not active, release its resources
+      /* 
+       * this client is not active, release its resources 
        * and the ones of all inactive clients that might
        * follow it
        */
       {
-         while (!(ncsp->flags & CSP_FLAG_ACTIVE))
+         while( !ncsp->active )
          {
             csp->next = ncsp->next;
-
+   
             freez(ncsp->ip_addr_str);
             freez(ncsp->my_ip_addr_str);
             freez(ncsp->my_hostname);
+   
+#ifdef TRUST_FILES
+            freez(ncsp->referrer);
+#endif /* def TRUST_FILES */
             freez(ncsp->x_forwarded);
             freez(ncsp->iob->buf);
-
+   
             free_http_request(ncsp->http);
-
+   
             destroy_list(ncsp->headers);
             destroy_list(ncsp->cookie_list);
-
+   
             free_current_action(ncsp->action);
-
-#ifdef FEATURE_STATISTICS
+   
+#ifdef STATISTICS
             urls_read++;
-            if (ncsp->flags & CSP_FLAG_REJECTED)
+            if (ncsp->rejected)
             {
                urls_rejected++;
             }
-#endif /* def FEATURE_STATISTICS */
-
+#endif /* def STATISTICS */
+   
             freez(ncsp);
-
+            
             /* are there any more in sequence after it? */
-            if( (ncsp = csp->next) == NULL)
+            if( !(ncsp = csp->next) )
                break;
          }
       }
    }
 
-   for (fl = files; fl && ((nfl = fl->next) != NULL) ; fl = fl->next)
+   for (fl = files; fl && (nfl = fl->next) ; fl = fl->next)
    {
       if ( ( 0 == nfl->active ) && ( NULL != nfl->unloader ) )
       {
@@ -412,6 +326,10 @@ void sweep(void)
 
          (nfl->unloader)(nfl->f);
 
+#ifndef SPLIT_PROXY_ARGS
+         freez(nfl->proxy_args);
+#endif /* ndef SPLIT_PROXY_ARGS */
+
          freez(nfl->filename);
 
          freez(nfl);
@@ -421,18 +339,171 @@ void sweep(void)
 }
 
 
+/*********************************************************************
+ *
+ * Function    :  create_url_spec
+ *
+ * Description :  Creates a "url_spec" structure from a string.
+ *                When finished, free with unload_url().
+ *
+ * Parameters  :
+ *          1  :  url = Target url_spec to be filled in.  Must be
+ *                      zeroed out before the call (e.g. using zalloc).
+ *          2  :  buf = Source pattern, null terminated.  NOTE: The
+ *                      contents of this buffer are destroyed by this
+ *                      function.  If this function succeeds, the
+ *                      buffer is copied to url->spec.  If this
+ *                      function fails, the contents of the buffer
+ *                      are lost forever.
+ *
+ * Returns     :  0 => Ok, everything else is an error.
+ *
+ *********************************************************************/
+int create_url_spec(struct url_spec * url, char * buf)
+{
+   char *p;
+   struct url_spec tmp_url[1];
+
+   /* paranoia - should never happen. */
+   if ((url == NULL) || (buf == NULL))
+   {
+      return 1;
+   }
+
+   /* save a copy of the orignal specification */
+   if ((url->spec = strdup(buf)) == NULL)
+   {
+      return 1;
+   }
+
+   if ((p = strchr(buf, '/')))
+   {
+      if (NULL == (url->path = strdup(p)))
+      {
+         freez(url->spec);
+         return 1;
+      }
+      url->pathlen = strlen(url->path);
+      *p = '\0';
+   }
+   else
+   {
+      url->path    = NULL;
+      url->pathlen = 0;
+   }
+#ifdef REGEX
+   if (url->path)
+   {
+      int errcode;
+      char rebuf[BUFFER_SIZE];
+
+      if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
+      {
+         freez(url->spec);
+         freez(url->path);
+         return 1;
+      }
+
+      sprintf(rebuf, "^(%s)", url->path);
+
+      errcode = regcomp(url->preg, rebuf,
+            (REG_EXTENDED|REG_NOSUB|REG_ICASE));
+      if (errcode)
+      {
+         size_t errlen = regerror(errcode,
+            url->preg, buf, sizeof(buf));
+
+         buf[errlen] = '\0';
+
+         log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",
+            url->spec, buf);
+
+         freez(url->spec);
+         freez(url->path);
+         freez(url->preg);
+
+         return 1;
+      }
+   }
+#endif
+   if ((p = strchr(buf, ':')) == NULL)
+   {
+      url->port = 0;
+   }
+   else
+   {
+      *p++ = '\0';
+      url->port = atoi(p);
+   }
+
+   if ((url->domain = strdup(buf)) == NULL)
+   {
+      freez(url->spec);
+      freez(url->path);
+#ifdef REGEX
+      freez(url->preg);
+#endif /* def REGEX */
+      return 1;
+   }
+
+   /* split domain into components */
+
+   *tmp_url = dsplit(url->domain);
+   url->dbuf = tmp_url->dbuf;
+   url->dcnt = tmp_url->dcnt;
+   url->dvec = tmp_url->dvec;
+   url->unanchored = tmp_url->unanchored;
+
+   return 0; /* OK */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  free_url
+ *
+ * Description :  Called from the "unloaders".  Freez the url
+ *                structure elements.
+ *
+ * Parameters  :
+ *          1  :  url = pointer to a url_spec structure.
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void free_url(struct url_spec *url)
+{
+   if (url == NULL) return;
+
+   freez(url->spec);
+   freez(url->domain);
+   freez(url->dbuf);
+   freez(url->dvec);
+   freez(url->path);
+#ifdef REGEX
+   if (url->preg)
+   {
+      regfree(url->preg);
+      freez(url->preg);
+   }
+#endif
+
+}
+
+
 /*********************************************************************
  *
  * Function    :  check_file_changed
  *
  * Description :  Helper function to check if a file needs reloading.
  *                If "current" is still current, return it.  Otherwise
- *                allocates a new (zeroed) "struct file_list", fills
+ *                allocates a new (zeroed) "struct file_list", fills 
  *                in the disk file name and timestamp, and returns it.
  *
  * Parameters  :
  *          1  :  current = The file_list currently being used - will
- *                          be checked to see if it is out of date.
+ *                          be checked to see if it is out of date. 
  *                          May be NULL (which is treated as out of
  *                          date).
  *          2  :  filename = Name of file to check.
@@ -440,7 +511,10 @@ void sweep(void)
  *                           This will be set to NULL, OR a struct
  *                           file_list newly allocated on the
  *                           heap, with the filename and lastmodified
- *                           fields filled, and all others zeroed.
+ *                           fields filled, standard header giving file
+ *                           name in proxy_args, and all others zeroed.
+ *                           (proxy_args is only filled in if !defined
+ *                           SPLIT_PROXY_ARGS and !suppress_blocklists).
  *
  * Returns     :  If file unchanged: 0 (and sets newfl == NULL)
  *                If file changed: 1 and sets newfl != NULL
@@ -470,6 +544,7 @@ int check_file_changed(const struct file_list * current,
    }
 
    fs = (struct file_list *)zalloc(sizeof(struct file_list));
+
    if (fs == NULL)
    {
       /* Out of memory error */
@@ -485,468 +560,134 @@ int check_file_changed(const struct file_list * current,
       freez (fs);
       return 1;
    }
-   *newfl = fs;
-   return 1;
-}
-
-
-/*********************************************************************
- *
- * Function    :  simple_read_line
- *
- * Description :  Read a single line from a file and return it.
- *                This is basically a version of fgets() that malloc()s
- *                it's own line buffer.  Note that the buffer will
- *                always be a multiple of BUFFER_SIZE bytes long.
- *                Therefore if you are going to keep the string for
- *                an extended period of time, you should probably
- *                strdup() it and free() the original, to save memory.
- *
- *
- * Parameters  :
- *          1  :  dest = destination for newly malloc'd pointer to
- *                line data.  Will be set to NULL on error.
- *          2  :  fp = File to read from
- *          3  :  newline = Standard for newlines in the file.
- *                Will be unchanged if it's value on input is not
- *                NEWLINE_UNKNOWN.
- *                On output, may be changed from NEWLINE_UNKNOWN to
- *                actual convention in file.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_FILE   on EOF.
- *
- *********************************************************************/
-jb_err simple_read_line(FILE *fp, char **dest, int *newline)
-{
-   size_t len = 0;
-   size_t buflen = BUFFER_SIZE;
-   char * buf;
-   char * p;
-   int ch;
-   int realnewline = NEWLINE_UNKNOWN;
-
-   if (NULL == (buf = malloc(buflen)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   p = buf;
 
-/*
- * Character codes.  If you have a wierd compiler and the following are
- * incorrect, you also need to fix NEWLINE() in loaders.h
- */
-#define CHAR_CR '\r' /* ASCII 13 */
-#define CHAR_LF '\n' /* ASCII 10 */
-
-   for (;;)
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
    {
-      ch = fgetc(fp);
-      if (ch == EOF)
-      {
-         if (len > 0)
-         {
-            *p = '\0';
-            *dest = buf;
-            return JB_ERR_OK;
-         }
-         else
-         {
-            free(buf);
-            *dest = NULL;
-            return JB_ERR_FILE;
-         }
-      }
-      else if (ch == CHAR_CR)
+      char * p = html_encode(filename);
+      if (p)
       {
-         ch = getc(fp);
-         if (ch == CHAR_LF)
-         {
-            if (*newline == NEWLINE_UNKNOWN)
-            {
-               *newline = NEWLINE_DOS;
-            }
-         }
-         else
-         {
-            if (ch != EOF)
-            {
-               ungetc(ch, fp);
-            }
-            if (*newline == NEWLINE_UNKNOWN)
-            {
-               *newline = NEWLINE_MAC;
-            }
-         }
-         *p = '\0';
-         *dest = buf;
-         if (*newline == NEWLINE_UNKNOWN)
-         {
-            *newline = realnewline;
-         }
-         return JB_ERR_OK;
-      }
-      else if (ch == CHAR_LF)
-      {
-         *p = '\0';
-         *dest = buf;
-         if (*newline == NEWLINE_UNKNOWN)
-         {
-            *newline = NEWLINE_UNIX;
-         }
-         return JB_ERR_OK;
-      }
-      else if (ch == 0)
-      {
-         *p = '\0';
-         *dest = buf;
-         return JB_ERR_OK;
+         fs->proxy_args = strsav(fs->proxy_args, "<h2>The file `");
+         fs->proxy_args = strsav(fs->proxy_args, p);
+         fs->proxy_args = strsav(fs->proxy_args, 
+            "' contains the following patterns</h2>\n");
+         freez(p);
       }
+      fs->proxy_args = strsav(fs->proxy_args, "<pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
 
-      *p++ = ch;
+   *newfl = fs;
+   return 1;
 
-      if (++len >= buflen)
-      {
-         buflen += BUFFER_SIZE;
-         if (NULL == (p = realloc(buf, buflen)));
-         {
-            free(buf);
-            return JB_ERR_MEMORY;
-         }
-         buf = p;
-         p = buf + len;
-      }
-   }
 }
 
 
 /*********************************************************************
  *
- * Function    :  edit_read_line
+ * Function    :  read_config_line
  *
  * Description :  Read a single non-empty line from a file and return
  *                it.  Trims comments, leading and trailing whitespace
  *                and respects escaping of newline and comment char.
- *                Provides the line in 2 alternative forms: raw and
- *                preprocessed.
- *                - raw is the raw data read from the file.  If the
- *                  line is not modified, then this should be written
- *                  to the new file.
- *                - prefix is any comments and blank lines that were
- *                  read from the file.  If the line is modified, then
- *                  this should be written out to the file followed
- *                  by the modified data.  (If this string is non-empty
- *                  then it will have a newline at the end).
- *                - data is the actual data that will be parsed
- *                  further by appropriate routines.
- *                On EOF, the 3 strings will all be set to NULL and
- *                0 will be returned.
+ *                Also writes the file to fs->proxy_args.
  *
  * Parameters  :
- *          1  :  fp = File to read from
- *          2  :  raw_out = destination for newly malloc'd pointer to
- *                raw line data.  May be NULL if you don't want it.
- *          3  :  prefix_out = destination for newly malloc'd pointer to
- *                comments.  May be NULL if you don't want it.
- *          4  :  data_out = destination for newly malloc'd pointer to
- *                line data with comments and leading/trailing spaces
- *                removed, and line continuation performed.  May be
- *                NULL if you don't want it.
- *          5  :  newline = Standard for newlines in the file.
- *                On input, set to value to use or NEWLINE_UNKNOWN.
- *                On output, may be changed from NEWLINE_UNKNOWN to
- *                actual convention in file.  May be NULL if you
- *                don't want it.
- *          6  :  line_number = Line number in file.  In "lines" as
- *                reported by a text editor, not lines containing data.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_FILE   on EOF.
+ *          1  :  buf = Buffer to use.
+ *          2  :  buflen = Size of buffer in bytes.
+ *          3  :  fp = File to read from
+ *          4  :  fs = File will be written to fs->proxy_args.  May
+ *                be NULL to disable this feature.
+ *
+ * Returns     :  NULL on EOF or error
+ *                Otherwise, returns buf.
  *
  *********************************************************************/
-jb_err edit_read_line(FILE *fp,
-                      char **raw_out,
-                      char **prefix_out,
-                      char **data_out,
-                      int *newline,
-                      unsigned long *line_number)
+char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs)
 {
-   char *p;          /* Temporary pointer   */
-   char *linebuf;    /* Line read from file */
-   char *linestart;  /* Start of linebuf, usually first non-whitespace char */
-   int contflag = 0; /* Nonzero for line continuation - i.e. line ends '\' */
-   int is_empty = 1; /* Flag if not got any data yet */
-   char *raw    = NULL; /* String to be stored in raw_out    */
-   char *prefix = NULL; /* String to be stored in prefix_out */
-   char *data   = NULL; /* String to be stored in data_out   */
-   int scrapnewline;    /* Used for (*newline) if newline==NULL */
-   jb_err rval = JB_ERR_OK;
-
-   assert(fp);
-   assert(raw_out || data_out);
-   assert(newline == NULL
-       || *newline == NEWLINE_UNKNOWN
-       || *newline == NEWLINE_UNIX
-       || *newline == NEWLINE_DOS
-       || *newline == NEWLINE_MAC);
-
-   if (newline == NULL)
-   {
-      scrapnewline = NEWLINE_UNKNOWN;
-      newline = &scrapnewline;
-   }
+   char *p, *q;
+   char linebuf[BUFFER_SIZE];
+   int contflag = 0;
 
-   /* Set output parameters to NULL */
-   if (raw_out)
-   {
-      *raw_out    = NULL;
-   }
-   if (prefix_out)
-   {
-      *prefix_out = NULL;
-   }
-   if (data_out)
-   {
-      *data_out   = NULL;
-   }
-
-   /* Set string variables to new, empty strings. */
+   *buf = '\0';
 
-   if (raw_out)
+   while (fgets(linebuf, sizeof(linebuf), fp))
    {
-      if ((raw = malloc(1)) == NULL)
+#ifndef SPLIT_PROXY_ARGS
+      if (fs && !suppress_blocklists)
       {
-         return JB_ERR_MEMORY;
-      }
-      *raw = '\0';
-   }
-   if (prefix_out)
-   {
-      if ((prefix = malloc(1)) == NULL)
-      {
-         freez(raw);
-         return JB_ERR_MEMORY;
-      }
-      *prefix = '\0';
-   }
-   if (data_out)
-   {
-      if ((data = malloc(1)) == NULL)
-      {
-         freez(raw);
-         freez(prefix);
-         return JB_ERR_MEMORY;
+         char *html_line = html_encode(linebuf);
+         if (html_line != NULL)
+         {
+            fs->proxy_args = strsav(fs->proxy_args, html_line);
+            freez(html_line);
+         }
+         fs->proxy_args = strsav(fs->proxy_args, "<br>");
       }
-      *data = '\0';
-   }
-
-   /* Main loop.  Loop while we need more data & it's not EOF. */
+#endif /* ndef SPLIT_PROXY_ARGS */
 
-   while ( (contflag || is_empty)
-        && (JB_ERR_OK == (rval = simple_read_line(fp, &linebuf, newline))))
-   {
-      if (line_number)
+      /* Trim off newline */
+      if ((p = strpbrk(linebuf, "\r\n")) != NULL)
       {
-         (*line_number)++;
+         *p = '\0';
       }
-      if (raw)
+      else
       {
-         string_append(&raw,linebuf);
-         if (string_append(&raw,NEWLINE(*newline)))
-         {
-            freez(prefix);
-            freez(data);
-            free(linebuf);
-            return JB_ERR_MEMORY;
-         }
+         p = linebuf + strlen(linebuf);
       }
 
       /* Line continuation? Trim escape and set flag. */
-      p = linebuf + strlen(linebuf) - 1;
-      contflag = ((*linebuf != '\0') && (*p == '\\'));
-      if (contflag)
+      if ((p != linebuf) && (*--p == '\\'))
       {
+         contflag = 1;
          *p = '\0';
       }
 
-      /* Trim leading spaces if we're at the start of the line */
-      linestart = linebuf;
-      if (*data == '\0')
-      {
-         /* Trim leading spaces */
-         while (*linestart && isspace((int)(unsigned char)*linestart))
-         {
-            linestart++;
-         }
-      }
-
-      /* Handle comment characters. */
-      p = linestart;
-      while ((p = strchr(p, '#')) != NULL)
+      /* If there's a comment char.. */
+      if ((p = strpbrk(linebuf, "#")) != NULL)
       {
-         /* Found a comment char.. */
+         /* ..and it's escaped, left-shift the line over the escape. */
          if ((p != linebuf) && (*(p-1) == '\\'))
          {
-            /* ..and it's escaped, left-shift the line over the escape. */
-            char *q = p - 1;
-            while ((*q = *(q + 1)) != '\0')
-            {
-               q++;
-            }
-            /* Now scan from just after the "#". */
+            q = p-1;
+            while ((*q++ = *p++) != '\0') /* nop */;
          }
+         /* Else, chop off the rest of the line */
          else
          {
-            /* Real comment.  Save it... */
-            if (p == linestart)
-            {
-               /* Special case:  Line only contains a comment, so all the
-                * previous whitespace is considered part of the comment.
-                * Undo the whitespace skipping, if any.
-                */
-               linestart = linebuf;
-               p = linestart;
-            }
-            if (prefix)
-            {
-               string_append(&prefix,p);
-               if (string_append(&prefix, NEWLINE(*newline)))
-               {
-                  freez(raw);
-                  freez(data);
-                  free(linebuf);
-                  return JB_ERR_MEMORY;
-               }
-            }
-
-            /* ... and chop off the rest of the line */
             *p = '\0';
          }
-      } /* END while (there's a # character) */
+      }
 
       /* Write to the buffer */
-      if (*linestart)
+      if (*linebuf)
       {
-         is_empty = 0;
-         if (data)
-         {
-            if (string_append(&data, linestart))
-            {
-               freez(raw);
-               freez(prefix);
-               free(linebuf);
-               return JB_ERR_MEMORY;
-            }
-         }
+         strncat(buf, linebuf, buflen - strlen(buf));
       }
 
-      free(linebuf);
-   } /* END while(we need more data) */
-
-   /* Handle simple_read_line() errors - ignore EOF */
-   if ((rval != JB_ERR_OK) && (rval != JB_ERR_FILE))
-   {
-      freez(raw);
-      freez(prefix);
-      freez(data);
-      return rval;
-   }
-
-   if (raw ? (*raw == '\0') : is_empty)
-   {
-      /* EOF and no data there.  (Definition of "data" depends on whether
-       * the caller cares about "raw" or just "data").
-       */
-
-      freez(raw);
-      freez(prefix);
-      freez(data);
-
-      return JB_ERR_FILE;
-   }
-   else
-   {
-      /* Got at least some data */
-
-      /* Remove trailing whitespace */
-      chomp(data);
-
-      if (raw_out)
-      {
-         *raw_out    = raw;
-      }
-      else
-      {
-         freez(raw);
-      }
-      if (prefix_out)
-      {
-         *prefix_out = prefix;
-      }
-      else
-      {
-         freez(prefix);
-      }
-      if (data_out)
-      {
-         *data_out   = data;
-      }
-      else
+      /* Continue? */
+      if (contflag)
       {
-         freez(data);
+         contflag = 0;
+               continue;
       }
-      return JB_ERR_OK;
-   }
-}
 
+      /* Remove leading and trailing whitespace */         
+      chomp(buf);
 
-/*********************************************************************
- *
- * Function    :  read_config_line
- *
- * Description :  Read a single non-empty line from a file and return
- *                it.  Trims comments, leading and trailing whitespace
- *                and respects escaping of newline and comment char.
- *
- * Parameters  :
- *          1  :  buf = Buffer to use.
- *          2  :  buflen = Size of buffer in bytes.
- *          3  :  fp = File to read from
- *          4  :  linenum = linenumber in file
- *
- * Returns     :  NULL on EOF or error
- *                Otherwise, returns buf.
- *
- *********************************************************************/
-char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenum)
-{
-   jb_err err;
-   char *buf2 = NULL;
-   err = edit_read_line(fp, NULL, NULL, &buf2, NULL, linenum);
-   if (err)
-   {
-      if (err == JB_ERR_MEMORY)
+      if (*buf)
       {
-         log_error(LOG_LEVEL_FATAL, "Out of memory loading a config file");
+         return buf;
       }
-      return NULL;
-   }
-   else
-   {
-      assert(buf2);
-      assert(strlen(buf2) + 1U < buflen);
-      strncpy(buf, buf2, buflen - 1);
-      free(buf2);
-      buf[buflen - 1] = '\0';
-      return buf;
    }
+
+   /* EOF */
+   return NULL;
+
 }
 
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 /*********************************************************************
  *
  * Function    :  unload_trustfile
@@ -961,44 +702,16 @@ char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenu
  *********************************************************************/
 static void unload_trustfile(void *f)
 {
-   struct block_spec *cur = (struct block_spec *)f;
-   struct block_spec *next;
-
-   while (cur != NULL)
-   {
-      next = cur->next;
+   struct block_spec *b = (struct block_spec *)f;
+   if (b == NULL) return;
 
-      free_url_spec(cur->url);
-      free(cur);
+   unload_trustfile(b->next); /* Stack is cheap, isn't it? */
 
-      cur = next;
-   }
-
-}
+   free_url(b->url);
 
+   freez(b);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_trust_file
- *
- * Description :  Unloads current trust file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_trust_file(void)
-{
-   if (current_trustfile)
-   {
-      current_trustfile->unloader = unload_trustfile;
-      current_trustfile = NULL;
-   }
 }
-#endif /* FEATURE_GRACEFUL_TERMINATION */
 
 
 /*********************************************************************
@@ -1023,7 +736,6 @@ int load_trustfile(struct client_state *csp)
    char  buf[BUFFER_SIZE], *p, *q;
    int reject, trusted;
    struct file_list *fs;
-   unsigned long linenum = 0;
 
    if (!check_file_changed(current_trustfile, csp->config->trustfile, &fs))
    {
@@ -1052,7 +764,7 @@ int load_trustfile(struct client_state *csp)
 
    tl = csp->config->trust_list;
 
-   while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL)
+   while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
    {
       trusted = 0;
       reject  = 1;
@@ -1068,7 +780,7 @@ int load_trustfile(struct client_state *csp)
          reject = 0;
          p = buf;
          q = p+1;
-         while ((*p++ = *q++) != '\0')
+         while ((*p++ = *q++))
          {
             /* nop */
          }
@@ -1106,7 +818,6 @@ int load_trustfile(struct client_state *csp)
       if (trusted)
       {
          *tl++ = b->url;
-         /* FIXME BUFFER OVERFLOW if >=64 entries */
       }
    }
 
@@ -1114,6 +825,13 @@ int load_trustfile(struct client_state *csp)
 
    fclose(fp);
 
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
+
    /* the old one is now obsolete */
    if (current_trustfile)
    {
@@ -1137,15 +855,14 @@ load_trustfile_error:
    return(-1);
 
 }
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
 /*********************************************************************
  *
  * Function    :  unload_re_filterfile
  *
- * Description :  Unload the re_filter list by freeing all chained
- *                re_filterfile specs and their data.
+ * Description :  Unload the re_filter list.
  *
  * Parameters  :
  *          1  :  f = the data structure associated with the filterfile.
@@ -1155,57 +872,24 @@ load_trustfile_error:
  *********************************************************************/
 static void unload_re_filterfile(void *f)
 {
-   struct re_filterfile_spec *a, *b = (struct re_filterfile_spec *)f;
+   struct re_filterfile_spec *b = (struct re_filterfile_spec *)f;
 
-   while (b != NULL)
-   {
-      a = b->next;
-
-      destroy_list(b->patterns);
-      pcrs_free_joblist(b->joblist);
-      freez(b->name);
-      freez(b->description);
-      freez(b);
+   if (b == NULL) return;
 
-      b = a;
-   }
+   destroy_list(b->patterns);
+   pcrs_free_joblist(b->joblist);
+   freez(b);
 
    return;
 }
 
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_re_filterfile
- *
- * Description :  Unloads current re_filter file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_re_filterfile(void)
-{
-   if (current_re_filterfile)
-   {
-      current_re_filterfile->unloader = unload_re_filterfile;
-      current_re_filterfile = NULL;
-   }
-}
-#endif
-
-
 /*********************************************************************
  *
  * Function    :  load_re_filterfile
  *
- * Description :  Load the re_filterfile. 
- *                Generate a chained list of re_filterfile_spec's from
- *                the "FILTER: " blocks, compiling all their substitutions
- *                into chained lists of pcrs_job structs.
+ * Description :  Load the re_filterfile. Each non-comment, non-empty
+ *                line is instantly added to the joblist, which is
+ *                a chained list of pcrs_job structs.
  *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
@@ -1217,19 +901,16 @@ int load_re_filterfile(struct client_state *csp)
 {
    FILE *fp;
 
-   struct re_filterfile_spec *new_bl, *bl = NULL;
+   struct re_filterfile_spec *bl;
    struct file_list *fs;
 
    char  buf[BUFFER_SIZE];
    int error;
-   unsigned long linenum = 0;
    pcrs_job *dummy;
 
-   /*
-    * No need to reload if unchanged
-    */
    if (!check_file_changed(current_re_filterfile, csp->config->re_filterfile, &fs))
    {
+      /* No need to load */
       if (csp)
       {
          csp->rlist = current_re_filterfile;
@@ -1241,105 +922,53 @@ int load_re_filterfile(struct client_state *csp)
       goto load_re_filterfile_error;
    }
 
-   /* 
-    * Open the file or fail
-    */
-   if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL)
+   fs->f = bl = (struct re_filterfile_spec  *)zalloc(sizeof(*bl));
+   if (bl == NULL)
    {
       goto load_re_filterfile_error;
    }
 
-   /* 
-    * Read line by line
-    */
-   while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL)
+   /* Open the file or fail */
+   if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL)
    {
-      /*
-       * If this is the head of a new filter block, make it a
-       * re_filterfile spec of its own and chain it to the list:
-       */
-      if (strncmp(buf, "FILTER:", 7) == 0)
-      {
-         new_bl = (struct re_filterfile_spec  *)zalloc(sizeof(*bl));
-         if (new_bl == NULL)
-         {
-            goto load_re_filterfile_error;
-         }
-
-         new_bl->name = chomp(buf + 7);
-
-         if (NULL != (new_bl->description = strchr(new_bl->name, ' ')))
-         {
-            *new_bl->description++ = '\0';
-            new_bl->description = strdup(chomp(new_bl->description));
-         }
-         else
-         {
-            new_bl->description = strdup("No description available for this filter");
-         }
-
-         new_bl->name = strdup(chomp(new_bl->name));
-         
-         /*
-          * If this is the first filter block, chain it
-          * to the file_list rather than its (nonexistant)
-          * predecessor
-          */
-         if (fs->f == NULL)
-         {
-            fs->f = new_bl;
-         }
-         else
-         {
-            bl->next = new_bl;
-         }
-         bl = new_bl;
-
-         log_error(LOG_LEVEL_RE_FILTER, "Reading in filter \"%s\" (\"%s\")", bl->name, bl->description);
+      goto load_re_filterfile_error;
+   }
 
-         continue;
-      }
+   /* Read line by line */
+   while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
+   {
+      enlist( bl->patterns, buf );
 
-      /* 
-       * Else, save the expression, make it a pcrs_job
-       * and chain it into the current filter's joblist 
-       */
-      if (bl != NULL)
+      /* We have a meaningful line -> make it a job */
+      if ((dummy = pcrs_compile_command(buf, &error)) == NULL)
       {
-         enlist(bl->patterns, buf);
-
-         if ((dummy = pcrs_compile_command(buf, &error)) == NULL)
-         {
-            log_error(LOG_LEVEL_RE_FILTER,
-                      "Adding re_filter job %s to filter %s failed with error %d.", buf, bl->name, error);
-            continue;
-         }
-         else
-         {
-            dummy->next = bl->joblist;
-            bl->joblist = dummy;
-            log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s to filter %s succeeded.", buf, bl->name);
-         }
+         log_error(LOG_LEVEL_RE_FILTER, 
+               "Adding re_filter job %s failed with error %d.", buf, error);
+         continue;
       }
       else
       {
-         log_error(LOG_LEVEL_ERROR, "Ignoring job %s outside filter block in %s, line %d", buf, csp->config->re_filterfile, linenum);
+         dummy->next = bl->joblist;
+         bl->joblist = dummy;
+         log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s succeeded.", buf);
       }
    }
 
    fclose(fp);
 
-   /* 
-    * Schedule the now-obsolete old data for unloading
-    */
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+   /* the old one is now obsolete */
    if ( NULL != current_re_filterfile )
    {
       current_re_filterfile->unloader = unload_re_filterfile;
    }
 
-   /*
-    * Chain this file into the global list of loaded files
-    */
    fs->next    = files->next;
    files->next = fs;
    current_re_filterfile = fs;
@@ -1352,7 +981,7 @@ int load_re_filterfile(struct client_state *csp)
    return( 0 );
 
 load_re_filterfile_error:
-   log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E",
+   log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", 
              csp->config->re_filterfile);
    return(-1);
 
@@ -1374,7 +1003,7 @@ load_re_filterfile_error:
  * Returns     :  N/A
  *
  *********************************************************************/
-void add_loader(int (*loader)(struct client_state *),
+void add_loader(int (*loader)(struct client_state *), 
                 struct configuration_spec * config)
 {
    int i;
index 216c352..2ebb564 100644 (file)
--- a/loaders.h
+++ b/loaders.h
@@ -1,6 +1,6 @@
-#ifndef LOADERS_H_INCLUDED
-#define LOADERS_H_INCLUDED
-#define LOADERS_H_VERSION "$Id: loaders.h,v 1.18 2002/03/24 13:25:43 swa Exp $"
+#ifndef _LOADERS_H
+#define _LOADERS_H
+#define LOADERS_H_VERSION "$Id: loaders.h,v 1.6 2001/06/07 23:14:38 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loaders.h,v $
@@ -11,7 +11,7 @@
  *                unload files that are no longer in use.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: loaders.h,v $
- *    Revision 1.18  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.17  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.16  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.15  2002/01/22 23:46:18  jongfoster
- *    Moving edit_read_line() and simple_read_line() to loaders.c, and
- *    extending them to support reading MS-DOS, Mac and UNIX style files
- *    on all platforms.
- *
- *    Modifying read_config_line() (without changing it's prototype) to
- *    be a trivial wrapper for edit_read_line().  This means that we have
- *    one function to read a line and handle comments, which is common
- *    between the initialization code and the edit interface.
- *
- *    Revision 1.14  2002/01/17 21:03:08  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.13  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.12  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.11  2001/10/23 21:38:53  jongfoster
- *    Adding error-checking to create_url_spec()
- *
- *    Revision 1.10  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.9  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.7  2001/07/13 14:01:54  oes
- *    Removed all #ifdef PCRS
- *
  *    Revision 1.6  2001/06/07 23:14:38  jongfoster
  *    Removing ACL and forward file loaders - these files have
  *    been merged into the config file.
  *********************************************************************/
 \f
 
+#include "project.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/* Structures taken from project.h */
-struct client_state;
-struct file_list;
-struct configuration_spec;
-struct url_spec;
-
 extern void sweep(void);
-extern char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenum);
+extern char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs);
 extern int check_file_changed(const struct file_list * current,
                               const char * filename,
                               struct file_list ** newfl);
 
-extern jb_err edit_read_line(FILE *fp,
-                             char **raw_out,
-                             char **prefix_out,
-                             char **data_out,
-                             int *newline,
-                             unsigned long *line_number);
-
-extern jb_err simple_read_line(FILE *fp, char **dest, int *newline);
-
-/*
- * Various types of newlines that a file may contain.
- */
-#define NEWLINE_UNKNOWN 0  /* Newline convention in file is unknown */
-#define NEWLINE_UNIX    1  /* Newline convention in file is '\n'   (ASCII 10) */
-#define NEWLINE_DOS     2  /* Newline convention in file is '\r\n' (ASCII 13,10) */
-#define NEWLINE_MAC     3  /* Newline convention in file is '\r'   (ASCII 13) */
-
-/*
- * Types of newlines that a file may contain, as strings.  If you have an
- * extremely wierd compiler that does not have '\r' == CR == ASCII 13 and
- * '\n' == LF == ASCII 10), then fix CHAR_CR and CHAR_LF in loaders.c as
- * well as these definitions.
- */
-#define NEWLINE(style) ((style)==NEWLINE_DOS ? "\r\n" : \
-                        ((style)==NEWLINE_MAC ? "\r" : "\n"))
-
-
-extern short int MustReload;
 extern int load_actions_file(struct client_state *csp);
 extern int load_re_filterfile(struct client_state *csp);
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 extern int load_trustfile(struct client_state *csp);
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
+
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-#ifdef FEATURE_TRUST
-void unload_current_trust_file(void);
-#endif
-void unload_current_re_filterfile(void);
-#endif /* FEATURE_GRACEFUL_TERMINATION */
 
+extern int create_url_spec(struct url_spec * url, char * buf);
+extern void free_url(struct url_spec *url);
 
 extern void add_loader(int (*loader)(struct client_state *), 
                        struct configuration_spec * config);
@@ -226,7 +131,7 @@ extern const char loaders_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef LOADERS_H_INCLUDED */
+#endif /* ndef _LOADERS_H */
 
 /*
   Local Variables:
index ec4de4f..6650890 100644 (file)
@@ -1,16 +1,16 @@
-const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp $";
+const char miscutil_rcs[] = "$Id: miscutil.c,v 1.14 2001/06/29 21:45:41 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/miscutil.c,v $
  *
  * Purpose     :  zalloc, hash_string, safe_strerror, strcmpic,
- *                strncmpic, chomp, and MinGW32 strdup
+ *                strncmpic, strsav, chomp, and MinGW32 strdup
  *                functions. 
  *                These are each too small to deserve their own file
  *                but don't really fit in any other file.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -36,92 +36,6 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp
  *
  * Revisions   :
  *    $Log: miscutil.c,v $
- *    Revision 1.34  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.33  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.32  2002/03/06 23:02:57  jongfoster
- *    Removing tabs
- *
- *    Revision 1.31  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.30  2002/03/04 18:27:42  oes
- *    - Deleted deletePidFile
- *    - Made write_pid_file use the --pidfile option value
- *      (or no PID file, if the option was absent)
- *    - Played styleguide police
- *
- *    Revision 1.29  2002/03/04 02:08:02  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.28  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.27  2002/01/21 00:52:32  jongfoster
- *    Adding string_join()
- *
- *    Revision 1.26  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.25  2001/11/13 00:16:38  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.24  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.23  2001/10/29 03:48:10  david__schmidt
- *    OS/2 native needed a snprintf() routine.  Added one to miscutil, brackedted
- *    by and __OS2__ ifdef.
- *
- *    Revision 1.22  2001/10/26 17:39:38  oes
- *    Moved ijb_isspace and ijb_tolower to project.h
- *
- *    Revision 1.21  2001/10/23 21:27:50  jongfoster
- *    Standardising error codes in string_append
- *    make_path() no longer adds '\\' if the dir already ends in '\\' (this
- *    is just copying a UNIX-specific fix to the Windows-specific part)
- *
- *    Revision 1.20  2001/10/22 15:33:56  david__schmidt
- *    Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in
- *    filters.c.  Added a FIXME in front of the offending code.  I'll gladly
- *    put in a better/more robust fix for all parties if one is presented...
- *    It seems that just returning 200 instead of 404 would pretty much fix
- *    it for everyone, but I don't know all the history of the problem.
- *
- *    Revision 1.19  2001/10/14 22:02:57  jongfoster
- *    New function string_append() which is like strsav(), but running
- *    out of memory isn't automatically FATAL.
- *
- *    Revision 1.18  2001/09/20 13:33:43  steudten
- *
- *    change long to int as return value in hash_string(). Remember the wraparound
- *    for int = long = sizeof(4) - thats maybe not what we want.
- *
- *    Revision 1.17  2001/09/13 20:51:29  jongfoster
- *    Fixing potential problems with characters >=128 in simplematch()
- *    This was also a compiler warning.
- *
- *    Revision 1.16  2001/09/10 10:56:59  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.15  2001/07/13 14:02:24  oes
- *    Removed vim-settings
- *
  *    Revision 1.14  2001/06/29 21:45:41  oes
  *    Indentation, CRLF->LF, Tab-> Space
  *
@@ -197,22 +111,31 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp
 #include "config.h"
 
 #include <stdio.h>
-#include <sys/types.h>
 #include <stdlib.h>
-#if !defined(_WIN32) && !defined(__OS2__)
-#include <unistd.h>
-#endif /* #if !defined(_WIN32) && !defined(__OS2__) */
 #include <string.h>
+#include <malloc.h>
 #include <ctype.h>
-#include <assert.h>
 
+/*
+ * FIXME: Only need project.h for BUFFER_SIZE.  It would be nice
+ * to remove this dependency.
+ */
 #include "project.h"
 #include "miscutil.h"
 #include "errlog.h"
-#include "jcc.h"
 
 const char miscutil_h_rcs[] = MISCUTIL_H_VERSION;
 
+/* Fix a problem with Solaris.  There should be no effect on other
+ * platforms.
+ * Solaris's isspace() is a macro which uses it's argument directly
+ * as an array index.  Therefore we need to make sure that high-bit
+ * characters generate +ve values, and ideally we also want to make
+ * the argument match the declared parameter type of "int".
+ */
+#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
+#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))   
+
 /*********************************************************************
  *
  * Function    :  zalloc
@@ -226,7 +149,7 @@ const char miscutil_h_rcs[] = MISCUTIL_H_VERSION;
  * Returns     :  Pointer to newly malloc'd memory chunk.
  *
  *********************************************************************/
-void *zalloc(size_t size)
+void *zalloc(int size)
 {
    void * ret;
 
@@ -236,47 +159,9 @@ void *zalloc(size_t size)
    }
 
    return(ret);
-
 }
 
 
-#if defined(unix)
-/*********************************************************************
- *
- * Function    :  write_pid_file 
- *
- * Description :  Writes a pid file with the pid of the main process 
- *
- * Parameters  :  None
- *
- * Returns     :  N/A 
- *
- *********************************************************************/
-void write_pid_file(void)
-{
-   FILE   *fp;
-   
-   /*
-    * If no --pidfile option was given,
-    * we can live without one.
-    */
-   if (pidfile == NULL) return;
-
-   if ((fp = fopen(pidfile, "w")) == NULL)
-   {
-      log_error(LOG_LEVEL_INFO, "can't open pidfile '%s': %E", pidfile);
-   }
-   else
-   {
-      fprintf(fp, "%u\n", (unsigned int) getpid());
-      fclose (fp);
-   }
-   return;
-
-}
-#endif /* def unix */
-
-
 /*********************************************************************
  *
  * Function    :  hash_string
@@ -291,9 +176,9 @@ void write_pid_file(void)
  * Returns     :  an unsigned long variable with the hashed value.
  *
  *********************************************************************/
-unsigned int hash_string( const char* s )
+unsigned long hash_string( const char* s )
 {
-   unsigned int h = 0
+   unsigned long h = 0ul
 
    for ( ; *s; ++s )
    {
@@ -487,20 +372,17 @@ char *chomp(char *string)
 
 }
 
-
 /*********************************************************************
  *
  * Function    :  strsav
  *
  * Description :  Reallocate "old" and append text to it.  This makes
  *                it easier to append to malloc'd strings.
- *                Running out of memory is a FATAL error.
  *
  * Parameters  :
  *          1  :  old = Old text that is to be extended.  Will be
- *                free()d by this routine.  May be NULL.
+ *                free()d by this routine.
  *          2  :  text_to_append = Text to be appended to old.
- *                May be NULL.
  *
  * Returns     :  Pointer to newly malloc'ed appended string.
  *                If there is no text to append, return old.  Caller
@@ -509,172 +391,45 @@ char *chomp(char *string)
  *********************************************************************/
 char *strsav(char *old, const char *text_to_append)
 {
-   size_t old_len, new_len = 0;
+   int old_len, new_len;
    char *p;
 
-   if ((text_to_append == NULL) || (*text_to_append == '\0'))
+   if (( text_to_append == NULL) || (*text_to_append == '\0'))
    {
       return(old);
    }
 
-   if (NULL == old)
-   {
-      if ((p = strdup(text_to_append)) == NULL)
-      {
-         log_error(LOG_LEVEL_FATAL, "strdup() failed!");
-         /* Never get here - LOG_LEVEL_FATAL causes program exit */
-      }
-      return p;
-   }
-
-   old_len = strlen(old);
-   new_len = old_len + strlen(text_to_append) + 1;
-
-   if ((p = realloc(old, new_len)) == NULL)
-   {
-      log_error(LOG_LEVEL_FATAL, "realloc(%d) bytes failed!", new_len);
-      /* Never get here - LOG_LEVEL_FATAL causes program exit */
-   }
-
-   strcpy(p + old_len, text_to_append);
-   return(p);
-}
-
-
-/*********************************************************************
- *
- * Function    :  string_append
- *
- * Description :  Reallocate target_string and append text to it.  
- *                This makes it easier to append to malloc'd strings.
- *                This is similar to the (removed) strsav(), but
- *                running out of memory isn't catastrophic.
- *
- *                Programming style:
- *
- *                The following style provides sufficient error
- *                checking for this routine, with minimal clutter
- *                in the source code.  It is recommended if you
- *                have many calls to this function:
- *
- *                char * s = strdup(...); // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                if (NULL == s) { ... handle error ... }
- *
- *                OR, equivalently:
- *
- *                char * s = strdup(...); // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                if (string_append(&s, ...)) {... handle error ...}
- *
- * Parameters  :
- *          1  :  target_string = Pointer to old text that is to be
- *                extended.  *target_string will be free()d by this
- *                routine.  target_string must be non-NULL.
- *                If *target_string is NULL, this routine will
- *                do nothing and return with an error - this allows
- *                you to make many calls to this routine and only
- *                check for errors after the last one.
- *          2  :  text_to_append = Text to be appended to old.
- *                Must not be NULL.
- *
- * Returns     :  JB_ERR_OK on success, and sets *target_string
- *                   to newly malloc'ed appended string.  Caller
- *                   must free(*target_string).
- *                JB_ERR_MEMORY on out-of-memory.  (And free()s
- *                   *target_string and sets it to NULL).
- *                JB_ERR_MEMORY if *target_string is NULL.
- *
- *********************************************************************/
-jb_err string_append(char **target_string, const char *text_to_append)
-{
-   size_t old_len;
-   char *new_string;
-
-   assert(target_string);
-   assert(text_to_append);
-
-   if (*target_string == NULL)
+   if (NULL != old)
    {
-      return JB_ERR_MEMORY;
+      old_len = strlen(old);
    }
-
-   if (*text_to_append == '\0')
+   else
    {
-      return JB_ERR_OK;
+      old_len = 0;
    }
 
-   old_len = strlen(*target_string);
+   new_len = old_len + strlen(text_to_append) + 1;
 
-   if (NULL == (new_string = realloc(*target_string,
-          strlen(text_to_append) + old_len + 1)))
+   if (old)
    {
-      free(*target_string);
-
-      *target_string = NULL;
-      return JB_ERR_MEMORY;
+      if ((p = realloc(old, new_len)) == NULL)
+      {
+         log_error(LOG_LEVEL_FATAL, "realloc(%d) bytes failed!", new_len);
+         /* Never get here - LOG_LEVEL_FATAL causes program exit */
+      }
    }
-
-   strcpy(new_string + old_len, text_to_append);
-
-   *target_string = new_string;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  string_join
- *
- * Description :  Join two strings together.  Frees BOTH the original
- *                strings.  If either or both input strings are NULL,
- *                fails as if it had run out of memory.
- *
- *                For comparison, string_append requires that the
- *                second string is non-NULL, and doesn't free it.
- *
- *                Rationale: Too often, we want to do
- *                string_append(s, html_encode(s2)).  That assert()s
- *                if s2 is NULL or if html_encode() runs out of memory.
- *                It also leaks memory.  Proper checking is cumbersome.
- *                The solution: string_join(s, html_encode(s2)) is safe,
- *                and will free the memory allocated by html_encode().
- *
- * Parameters  :
- *          1  :  target_string = Pointer to old text that is to be
- *                extended.  *target_string will be free()d by this
- *                routine.  target_string must be non-NULL.
- *          2  :  text_to_append = Text to be appended to old.
- *
- * Returns     :  JB_ERR_OK on success, and sets *target_string
- *                   to newly malloc'ed appended string.  Caller
- *                   must free(*target_string).
- *                JB_ERR_MEMORY on out-of-memory, or if
- *                   *target_string or text_to_append is NULL.  (In
- *                   this case, frees *target_string and text_to_append,
- *                   sets *target_string to NULL).
- *
- *********************************************************************/
-jb_err string_join(char **target_string, char *text_to_append)
-{
-   jb_err err;
-
-   assert(target_string);
-
-   if (text_to_append == NULL)
+   else
    {
-      freez(*target_string);
-      return JB_ERR_MEMORY;
+      if ((p = (char *)malloc(new_len)) == NULL)
+      {
+         log_error(LOG_LEVEL_FATAL, "malloc(%d) bytes failed!", new_len);
+         /* Never get here - LOG_LEVEL_FATAL causes program exit */
+      }
    }
 
-   err = string_append(target_string, text_to_append);
-
-   free(text_to_append);
+   strcpy(p + old_len, text_to_append);
+   return(p);
 
-   return err;
 }
 
 
@@ -696,12 +451,12 @@ jb_err string_join(char **target_string, char *text_to_append)
  *********************************************************************/
 int simplematch(char *pattern, char *text)
 {
-   unsigned char *pat = (unsigned char *) pattern;
-   unsigned char *txt = (unsigned char *) text;
-   unsigned char *fallback = pat; 
+   char *fallback; 
+   char *pat = pattern;
+   char *txt = text;
    int wildcard = 0;
   
-   unsigned char lastchar = 'a';
+   char lastchar = 'a';
    unsigned i;
    unsigned char charmap[32];
   
@@ -803,25 +558,25 @@ int simplematch(char *pattern, char *text)
  *
  * Parameters  :
  *          1  :  string = string to be duplicated
- *          2  :  len = number of bytes to duplicate
+ *          2  :  n = number of bytes to duplicate
  *
  * Returns     :  pointer to copy, or NULL if failiure
  *
  *********************************************************************/
-char *bindup(const char *string, size_t len)
+char *bindup(const char *string, int n)
 {
-   char *duplicate;
+   char *dup;
 
-   if (NULL == (duplicate = (char *)malloc(len)))
+   if (NULL == (dup = (char *)malloc(n)))
    {
       return NULL;
    }
    else
    {
-     memcpy(duplicate, string, len);
+     memcpy(dup, string, n);
    }
 
-   return duplicate;
+   return dup;
 
 }
 
@@ -853,21 +608,7 @@ char * make_path(const char * dir, const char * file)
 
    if(dir)
    {
-      if(dir[0] == '.')
-      {
-         if(dir[1] == '/')
-         {
-            strncpy(path,dir+2,512);
-         }
-         else
-         {
-            strncpy(path,dir+1,512);
-         }
-      }
-      else
-      {
-         strncpy(path,dir,512);
-      }
+      strncpy(path,dir,512);
       path[511]=0;
    } else {
       path[0]=0;
@@ -886,53 +627,24 @@ char * make_path(const char * dir, const char * file)
    }
 
    if ((dir == NULL) || (*dir == '\0') /* No directory specified */
-#if defined(_WIN32) || defined(__OS2__)
+#ifdef _WIN32
       || (*file == '\\') || (file[1] == ':') /* Absolute path (DOS) */
-#else /* ifndef _WIN32 || __OS2__ */
+#else /* ifndef _WIN32 */
       || (*file == '/') /* Absolute path (U*ix) */
-#endif /* ifndef _WIN32 || __OS2__  */
+#endif /* ifndef _WIN32 */
       )
    {
       return strdup(file);
    }
    else
    {
-      char * path;
-
-#if defined(unix)
-      if ( *dir != '/' && basedir && *basedir )
-      {
-         path = malloc( strlen( basedir ) + strlen(dir) + strlen(file) + 3);
-         if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
-         strcpy(path, basedir);
-         strcat(path, "/");
-         strcat(path, dir);
-      }
-      else
-      {
-         path = malloc(strlen(dir) + strlen(file) + 2);
-         if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
-         strcpy(path, dir);
-      }
-#else
-
-      path = malloc(strlen(dir) + strlen(file) + 2);
-      if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
+      char * path = malloc(strlen(dir) + strlen(file) + 2);
       strcpy(path, dir);
-
-#endif /* defined unix */
-
-#if defined(_WIN32) || defined(__OS2__)
-      if(path[strlen(path)-1] != '\\')
-      {
-         strcat(path, "\\");
-      }
-#else /* ifndef _WIN32 || __OS2__ */
-      if(path[strlen(path)-1] != '/')
-      {
-         strcat(path, "/");
-      }
-#endif /* ifndef _WIN32 || __OS2__ */
+#ifdef _WIN32
+      strcat(path, "\\");
+#else /* ifndef _WIN32 */
+      if(path[strlen(path)-1] != '/') strcat(path, "/");
+#endif /* ifndef _WIN32 */
       strcat(path, file);
 
       return path;
@@ -941,774 +653,6 @@ char * make_path(const char * dir, const char * file)
 }
 
 
-/*
- * What follows is a portable snprintf routine, written by Mark Martinec.
- * See: http://www.ijs.si/software/snprintf/
- * Anyone who needs it can add a define for themselves... so far, only 
- * OS/2 (native) lacks snprintf.
-
-                                  snprintf.c
-                   - a portable implementation of snprintf,
-       including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf
-                                       
-   snprintf is a routine to convert numeric and string arguments to
-   formatted strings. It is similar to sprintf(3) provided in a system's
-   C library, yet it requires an additional argument - the buffer size -
-   and it guarantees never to store anything beyond the given buffer,
-   regardless of the format or arguments to be formatted. Some newer
-   operating systems do provide snprintf in their C library, but many do
-   not or do provide an inadequate (slow or idiosyncratic) version, which
-   calls for a portable implementation of this routine.
-
-Author
-
-   Mark Martinec <mark.martinec@ijs.si>, April 1999, June 2000
-   Copyright Â© 1999, Mark Martinec
-
- */
-
-#ifdef __OS2__
-
-#define PORTABLE_SNPRINTF_VERSION_MAJOR 2
-#define PORTABLE_SNPRINTF_VERSION_MINOR 2
-
-#if defined(NEED_ASPRINTF) || defined(NEED_ASNPRINTF) || defined(NEED_VASPRINTF) || defined(NEED_VASNPRINTF)
-# if defined(NEED_SNPRINTF_ONLY)
-# undef NEED_SNPRINTF_ONLY
-# endif
-# if !defined(PREFER_PORTABLE_SNPRINTF)
-# define PREFER_PORTABLE_SNPRINTF
-# endif
-#endif
-
-#if defined(SOLARIS_BUG_COMPATIBLE) && !defined(SOLARIS_COMPATIBLE)
-#define SOLARIS_COMPATIBLE
-#endif
-
-#if defined(HPUX_BUG_COMPATIBLE) && !defined(HPUX_COMPATIBLE)
-#define HPUX_COMPATIBLE
-#endif
-
-#if defined(DIGITAL_UNIX_BUG_COMPATIBLE) && !defined(DIGITAL_UNIX_COMPATIBLE)
-#define DIGITAL_UNIX_COMPATIBLE
-#endif
-
-#if defined(PERL_BUG_COMPATIBLE) && !defined(PERL_COMPATIBLE)
-#define PERL_COMPATIBLE
-#endif
-
-#if defined(LINUX_BUG_COMPATIBLE) && !defined(LINUX_COMPATIBLE)
-#define LINUX_COMPATIBLE
-#endif
-
-#include <sys/types.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <errno.h>
-
-#ifdef isdigit
-#undef isdigit
-#endif
-#define isdigit(c) ((c) >= '0' && (c) <= '9')
-
-/* For copying strings longer or equal to 'breakeven_point'
- * it is more efficient to call memcpy() than to do it inline.
- * The value depends mostly on the processor architecture,
- * but also on the compiler and its optimization capabilities.
- * The value is not critical, some small value greater than zero
- * will be just fine if you don't care to squeeze every drop
- * of performance out of the code.
- *
- * Small values favor memcpy, large values favor inline code.
- */
-#if defined(__alpha__) || defined(__alpha)
-#  define breakeven_point   2    /* AXP (DEC Alpha)     - gcc or cc or egcs */
-#endif
-#if defined(__i386__)  || defined(__i386)
-#  define breakeven_point  12    /* Intel Pentium/Linux - gcc 2.96 */
-#endif
-#if defined(__hppa)
-#  define breakeven_point  10    /* HP-PA               - gcc */
-#endif
-#if defined(__sparc__) || defined(__sparc)
-#  define breakeven_point  33    /* Sun Sparc 5         - gcc 2.8.1 */
-#endif
-
-/* some other values of possible interest: */
-/* #define breakeven_point  8 */ /* VAX 4000          - vaxc */
-/* #define breakeven_point 19 */ /* VAX 4000          - gcc 2.7.0 */
-
-#ifndef breakeven_point
-#  define breakeven_point   6    /* some reasonable one-size-fits-all value */
-#endif
-
-#define fast_memcpy(d,s,n) \
-  { register size_t nn = (size_t)(n); \
-    if (nn >= breakeven_point) memcpy((d), (s), nn); \
-    else if (nn > 0) { /* proc call overhead is worth only for large strings*/\
-      register char *dd; register const char *ss; \
-      for (ss=(s), dd=(d); nn>0; nn--) *dd++ = *ss++; } }
-
-#define fast_memset(d,c,n) \
-  { register size_t nn = (size_t)(n); \
-    if (nn >= breakeven_point) memset((d), (int)(c), nn); \
-    else if (nn > 0) { /* proc call overhead is worth only for large strings*/\
-      register char *dd; register const int cc=(int)(c); \
-      for (dd=(d); nn>0; nn--) *dd++ = cc; } }
-
-/* prototypes */
-
-#if defined(NEED_ASPRINTF)
-int asprintf   (char **ptr, const char *fmt, /*args*/ ...);
-#endif
-#if defined(NEED_VASPRINTF)
-int vasprintf  (char **ptr, const char *fmt, va_list ap);
-#endif
-#if defined(NEED_ASNPRINTF)
-int asnprintf  (char **ptr, size_t str_m, const char *fmt, /*args*/ ...);
-#endif
-#if defined(NEED_VASNPRINTF)
-int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap);
-#endif
-
-#if defined(HAVE_SNPRINTF)
-/* declare our portable snprintf  routine under name portable_snprintf  */
-/* declare our portable vsnprintf routine under name portable_vsnprintf */
-#else
-/* declare our portable routines under names snprintf and vsnprintf */
-#define portable_snprintf snprintf
-#if !defined(NEED_SNPRINTF_ONLY)
-#define portable_vsnprintf vsnprintf
-#endif
-#endif
-
-#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...);
-#if !defined(NEED_SNPRINTF_ONLY)
-int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap);
-#endif
-#endif
-
-/* declarations */
-
-static char credits[] = "\n\
-@(#)snprintf.c, v2.2: Mark Martinec, <mark.martinec@ijs.si>\n\
-@(#)snprintf.c, v2.2: Copyright 1999, Mark Martinec. Frontier Artistic License applies.\n\
-@(#)snprintf.c, v2.2: http://www.ijs.si/software/snprintf/\n";
-
-#if defined(NEED_ASPRINTF)
-int asprintf(char **ptr, const char *fmt, /*args*/ ...) {
-  va_list ap;
-  size_t str_m;
-  int str_l;
-
-  *ptr = NULL;
-  va_start(ap, fmt);                            /* measure the required size */
-  str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap);
-  va_end(ap);
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  *ptr = (char *) malloc(str_m = (size_t)str_l + 1);
-  if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-  else {
-    int str_l2;
-    va_start(ap, fmt);
-    str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-    va_end(ap);
-    assert(str_l2 == str_l);
-  }
-  return str_l;
-}
-#endif
-
-#if defined(NEED_VASPRINTF)
-int vasprintf(char **ptr, const char *fmt, va_list ap) {
-  size_t str_m;
-  int str_l;
-
-  *ptr = NULL;
-  { va_list ap2;
-    va_copy(ap2, ap);  /* don't consume the original ap, we'll need it again */
-    str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/
-    va_end(ap2);
-  }
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  *ptr = (char *) malloc(str_m = (size_t)str_l + 1);
-  if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-  else {
-    int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-    assert(str_l2 == str_l);
-  }
-  return str_l;
-}
-#endif
-
-#if defined(NEED_ASNPRINTF)
-int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...) {
-  va_list ap;
-  int str_l;
-
-  *ptr = NULL;
-  va_start(ap, fmt);                            /* measure the required size */
-  str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap);
-  va_end(ap);
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1;      /* truncate */
-  /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */
-  if (str_m == 0) {  /* not interested in resulting string, just return size */
-  } else {
-    *ptr = (char *) malloc(str_m);
-    if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-    else {
-      int str_l2;
-      va_start(ap, fmt);
-      str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-      va_end(ap);
-      assert(str_l2 == str_l);
-    }
-  }
-  return str_l;
-}
-#endif
-
-#if defined(NEED_VASNPRINTF)
-int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap) {
-  int str_l;
-
-  *ptr = NULL;
-  { va_list ap2;
-    va_copy(ap2, ap);  /* don't consume the original ap, we'll need it again */
-    str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/
-    va_end(ap2);
-  }
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1;      /* truncate */
-  /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */
-  if (str_m == 0) {  /* not interested in resulting string, just return size */
-  } else {
-    *ptr = (char *) malloc(str_m);
-    if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-    else {
-      int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-      assert(str_l2 == str_l);
-    }
-  }
-  return str_l;
-}
-#endif
-
-/*
- * If the system does have snprintf and the portable routine is not
- * specifically required, this module produces no code for snprintf/vsnprintf.
- */
-#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-
-#if !defined(NEED_SNPRINTF_ONLY)
-int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) {
-  va_list ap;
-  int str_l;
-
-  va_start(ap, fmt);
-  str_l = portable_vsnprintf(str, str_m, fmt, ap);
-  va_end(ap);
-  return str_l;
-}
-#endif
-
-#if defined(NEED_SNPRINTF_ONLY)
-int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) {
-#else
-int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap) {
-#endif
-
-#if defined(NEED_SNPRINTF_ONLY)
-  va_list ap;
-#endif
-  size_t str_l = 0;
-  const char *p = fmt;
-
-/* In contrast with POSIX, the ISO C99 now says
- * that str can be NULL and str_m can be 0.
- * This is more useful than the old:  if (str_m < 1) return -1; */
-
-#if defined(NEED_SNPRINTF_ONLY)
-  va_start(ap, fmt);
-#endif
-  if (!p) p = "";
-  while (*p) {
-    if (*p != '%') {
-   /* if (str_l < str_m) str[str_l++] = *p++;    -- this would be sufficient */
-   /* but the following code achieves better performance for cases
-    * where format string is long and contains few conversions */
-      const char *q = strchr(p+1,'%');
-      size_t n = !q ? strlen(p) : (q-p);
-      if (str_l < str_m) {
-        size_t avail = str_m-str_l;
-        fast_memcpy(str+str_l, p, (n>avail?avail:n));
-      }
-      p += n; str_l += n;
-    } else {
-      const char *starting_p;
-      size_t min_field_width = 0, precision = 0;
-      int zero_padding = 0, precision_specified = 0, justify_left = 0;
-      int alternate_form = 0, force_sign = 0;
-      int space_for_positive = 1; /* If both the ' ' and '+' flags appear,
-                                     the ' ' flag should be ignored. */
-      char length_modifier = '\0';            /* allowed values: \0, h, l, L */
-      char tmp[32];/* temporary buffer for simple numeric->string conversion */
-
-      const char *str_arg;      /* string address in case of string argument */
-      size_t str_arg_l;         /* natural field width of arg without padding
-                                   and sign */
-      unsigned char uchar_arg;
-        /* unsigned char argument value - only defined for c conversion.
-           N.B. standard explicitly states the char argument for
-           the c conversion is unsigned */
-
-      size_t number_of_zeros_to_pad = 0;
-        /* number of zeros to be inserted for numeric conversions
-           as required by the precision or minimal field width */
-
-      size_t zero_padding_insertion_ind = 0;
-        /* index into tmp where zero padding is to be inserted */
-
-      char fmt_spec = '\0';
-        /* current conversion specifier character */
-
-      str_arg = credits;/* just to make compiler happy (defined but not used)*/
-      str_arg = NULL;
-      starting_p = p; p++;  /* skip '%' */
-   /* parse flags */
-      while (*p == '0' || *p == '-' || *p == '+' ||
-             *p == ' ' || *p == '#' || *p == '\'') {
-        switch (*p) {
-        case '0': zero_padding = 1; break;
-        case '-': justify_left = 1; break;
-        case '+': force_sign = 1; space_for_positive = 0; break;
-        case ' ': force_sign = 1;
-     /* If both the ' ' and '+' flags appear, the ' ' flag should be ignored */
-#ifdef PERL_COMPATIBLE
-     /* ... but in Perl the last of ' ' and '+' applies */
-                  space_for_positive = 1;
-#endif
-                  break;
-        case '#': alternate_form = 1; break;
-        case '\'': break;
-        }
-        p++;
-      }
-   /* If the '0' and '-' flags both appear, the '0' flag should be ignored. */
-
-   /* parse field width */
-      if (*p == '*') {
-        int j;
-        p++; j = va_arg(ap, int);
-        if (j >= 0) min_field_width = j;
-        else { min_field_width = -j; justify_left = 1; }
-      } else if (isdigit((int)(*p))) {
-        /* size_t could be wider than unsigned int;
-           make sure we treat argument like common implementations do */
-        unsigned int uj = *p++ - '0';
-        while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0');
-        min_field_width = uj;
-      }
-   /* parse precision */
-      if (*p == '.') {
-        p++; precision_specified = 1;
-        if (*p == '*') {
-          int j = va_arg(ap, int);
-          p++;
-          if (j >= 0) precision = j;
-          else {
-            precision_specified = 0; precision = 0;
-         /* NOTE:
-          *   Solaris 2.6 man page claims that in this case the precision
-          *   should be set to 0.  Digital Unix 4.0, HPUX 10 and BSD man page
-          *   claim that this case should be treated as unspecified precision,
-          *   which is what we do here.
-          */
-          }
-        } else if (isdigit((int)(*p))) {
-          /* size_t could be wider than unsigned int;
-             make sure we treat argument like common implementations do */
-          unsigned int uj = *p++ - '0';
-          while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0');
-          precision = uj;
-        }
-      }
-   /* parse 'h', 'l' and 'll' length modifiers */
-      if (*p == 'h' || *p == 'l') {
-        length_modifier = *p; p++;
-        if (length_modifier == 'l' && *p == 'l') {   /* double l = long long */
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-          length_modifier = '2';                  /* double l encoded as '2' */
-#else
-          length_modifier = 'l';                 /* treat it as a single 'l' */
-#endif
-          p++;
-        }
-      }
-      fmt_spec = *p;
-   /* common synonyms: */
-      switch (fmt_spec) {
-      case 'i': fmt_spec = 'd'; break;
-      case 'D': fmt_spec = 'd'; length_modifier = 'l'; break;
-      case 'U': fmt_spec = 'u'; length_modifier = 'l'; break;
-      case 'O': fmt_spec = 'o'; length_modifier = 'l'; break;
-      default: break;
-      }
-   /* get parameter value, do initial processing */
-      switch (fmt_spec) {
-      case '%': /* % behaves similar to 's' regarding flags and field widths */
-      case 'c': /* c behaves similar to 's' regarding flags and field widths */
-      case 's':
-        length_modifier = '\0';          /* wint_t and wchar_t not supported */
-     /* the result of zero padding flag with non-numeric conversion specifier*/
-     /* is undefined. Solaris and HPUX 10 does zero padding in this case,    */
-     /* Digital Unix and Linux does not. */
-#if !defined(SOLARIS_COMPATIBLE) && !defined(HPUX_COMPATIBLE)
-        zero_padding = 0;    /* turn zero padding off for string conversions */
-#endif
-        str_arg_l = 1;
-        switch (fmt_spec) {
-        case '%':
-          str_arg = p; break;
-        case 'c': {
-          int j = va_arg(ap, int);
-          uchar_arg = (unsigned char) j;   /* standard demands unsigned char */
-          str_arg = (const char *) &uchar_arg;
-          break;
-        }
-        case 's':
-          str_arg = va_arg(ap, const char *);
-          if (!str_arg) str_arg_l = 0;
-       /* make sure not to address string beyond the specified precision !!! */
-          else if (!precision_specified) str_arg_l = strlen(str_arg);
-       /* truncate string if necessary as requested by precision */
-          else if (precision == 0) str_arg_l = 0;
-          else {
-       /* memchr on HP does not like n > 2^31  !!! */
-            const char *q = memchr(str_arg, '\0',
-                             precision <= 0x7fffffff ? precision : 0x7fffffff);
-            str_arg_l = !q ? precision : (q-str_arg);
-          }
-          break;
-        default: break;
-        }
-        break;
-      case 'd': case 'u': case 'o': case 'x': case 'X': case 'p': {
-        /* NOTE: the u, o, x, X and p conversion specifiers imply
-                 the value is unsigned;  d implies a signed value */
-
-        int arg_sign = 0;
-          /* 0 if numeric argument is zero (or if pointer is NULL for 'p'),
-            +1 if greater than zero (or nonzero for unsigned arguments),
-            -1 if negative (unsigned argument is never negative) */
-
-        int int_arg = 0;  unsigned int uint_arg = 0;
-          /* only defined for length modifier h, or for no length modifiers */
-
-        long int long_arg = 0;  unsigned long int ulong_arg = 0;
-          /* only defined for length modifier l */
-
-        void *ptr_arg = NULL;
-          /* pointer argument value -only defined for p conversion */
-
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-        long long int long_long_arg = 0;
-        unsigned long long int ulong_long_arg = 0;
-          /* only defined for length modifier ll */
-#endif
-        if (fmt_spec == 'p') {
-        /* HPUX 10: An l, h, ll or L before any other conversion character
-         *   (other than d, i, u, o, x, or X) is ignored.
-         * Digital Unix:
-         *   not specified, but seems to behave as HPUX does.
-         * Solaris: If an h, l, or L appears before any other conversion
-         *   specifier (other than d, i, u, o, x, or X), the behavior
-         *   is undefined. (Actually %hp converts only 16-bits of address
-         *   and %llp treats address as 64-bit data which is incompatible
-         *   with (void *) argument on a 32-bit system).
-         */
-#ifdef SOLARIS_COMPATIBLE
-#  ifdef SOLARIS_BUG_COMPATIBLE
-          /* keep length modifiers even if it represents 'll' */
-#  else
-          if (length_modifier == '2') length_modifier = '\0';
-#  endif
-#else
-          length_modifier = '\0';
-#endif
-          ptr_arg = va_arg(ap, void *);
-          if (ptr_arg != NULL) arg_sign = 1;
-        } else if (fmt_spec == 'd') {  /* signed */
-          switch (length_modifier) {
-          case '\0':
-          case 'h':
-         /* It is non-portable to specify a second argument of char or short
-          * to va_arg, because arguments seen by the called function
-          * are not char or short.  C converts char and short arguments
-          * to int before passing them to a function.
-          */
-            int_arg = va_arg(ap, int);
-            if      (int_arg > 0) arg_sign =  1;
-            else if (int_arg < 0) arg_sign = -1;
-            break;
-          case 'l':
-            long_arg = va_arg(ap, long int);
-            if      (long_arg > 0) arg_sign =  1;
-            else if (long_arg < 0) arg_sign = -1;
-            break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-          case '2':
-            long_long_arg = va_arg(ap, long long int);
-            if      (long_long_arg > 0) arg_sign =  1;
-            else if (long_long_arg < 0) arg_sign = -1;
-            break;
-#endif
-          }
-        } else {  /* unsigned */
-          switch (length_modifier) {
-          case '\0':
-          case 'h':
-            uint_arg = va_arg(ap, unsigned int);
-            if (uint_arg) arg_sign = 1;
-            break;
-          case 'l':
-            ulong_arg = va_arg(ap, unsigned long int);
-            if (ulong_arg) arg_sign = 1;
-            break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-          case '2':
-            ulong_long_arg = va_arg(ap, unsigned long long int);
-            if (ulong_long_arg) arg_sign = 1;
-            break;
-#endif
-          }
-        }
-        str_arg = tmp; str_arg_l = 0;
-     /* NOTE:
-      *   For d, i, u, o, x, and X conversions, if precision is specified,
-      *   the '0' flag should be ignored. This is so with Solaris 2.6,
-      *   Digital UNIX 4.0, HPUX 10, Linux, FreeBSD, NetBSD; but not with Perl.
-      */
-#ifndef PERL_COMPATIBLE
-        if (precision_specified) zero_padding = 0;
-#endif
-        if (fmt_spec == 'd') {
-          if (force_sign && arg_sign >= 0)
-            tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
-         /* leave negative numbers for sprintf to handle,
-            to avoid handling tricky cases like (short int)(-32768) */
-#ifdef LINUX_COMPATIBLE
-        } else if (fmt_spec == 'p' && force_sign && arg_sign > 0) {
-          tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
-#endif
-        } else if (alternate_form) {
-          if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X') )
-            { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = fmt_spec; }
-         /* alternate form should have no effect for p conversion, but ... */
-#ifdef HPUX_COMPATIBLE
-          else if (fmt_spec == 'p'
-         /* HPUX 10: for an alternate form of p conversion,
-          *          a nonzero result is prefixed by 0x. */
-#ifndef HPUX_BUG_COMPATIBLE
-         /* Actually it uses 0x prefix even for a zero value. */
-                   && arg_sign != 0
-#endif
-                  ) { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = 'x'; }
-#endif
-        }
-        zero_padding_insertion_ind = str_arg_l;
-        if (!precision_specified) precision = 1;   /* default precision is 1 */
-        if (precision == 0 && arg_sign == 0
-#if defined(HPUX_BUG_COMPATIBLE) || defined(LINUX_COMPATIBLE)
-            && fmt_spec != 'p'
-         /* HPUX 10 man page claims: With conversion character p the result of
-          * converting a zero value with a precision of zero is a null string.
-          * Actually HP returns all zeroes, and Linux returns "(nil)". */
-#endif
-        ) {
-         /* converted to null string */
-         /* When zero value is formatted with an explicit precision 0,
-            the resulting formatted string is empty (d, i, u, o, x, X, p).   */
-        } else {
-          char f[5]; int f_l = 0;
-          f[f_l++] = '%';    /* construct a simple format string for sprintf */
-          if (!length_modifier) { }
-          else if (length_modifier=='2') { f[f_l++] = 'l'; f[f_l++] = 'l'; }
-          else f[f_l++] = length_modifier;
-          f[f_l++] = fmt_spec; f[f_l++] = '\0';
-          if (fmt_spec == 'p') str_arg_l += sprintf(tmp+str_arg_l, f, ptr_arg);
-          else if (fmt_spec == 'd') {  /* signed */
-            switch (length_modifier) {
-            case '\0':
-            case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, int_arg);  break;
-            case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, long_arg); break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-            case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,long_long_arg); break;
-#endif
-            }
-          } else {  /* unsigned */
-            switch (length_modifier) {
-            case '\0':
-            case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, uint_arg);  break;
-            case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, ulong_arg); break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-            case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,ulong_long_arg);break;
-#endif
-            }
-          }
-         /* include the optional minus sign and possible "0x"
-            in the region before the zero padding insertion point */
-          if (zero_padding_insertion_ind < str_arg_l &&
-              tmp[zero_padding_insertion_ind] == '-') {
-            zero_padding_insertion_ind++;
-          }
-          if (zero_padding_insertion_ind+1 < str_arg_l &&
-              tmp[zero_padding_insertion_ind]   == '0' &&
-             (tmp[zero_padding_insertion_ind+1] == 'x' ||
-              tmp[zero_padding_insertion_ind+1] == 'X') ) {
-            zero_padding_insertion_ind += 2;
-          }
-        }
-        { size_t num_of_digits = str_arg_l - zero_padding_insertion_ind;
-          if (alternate_form && fmt_spec == 'o'
-#ifdef HPUX_COMPATIBLE                                  /* ("%#.o",0) -> ""  */
-              && (str_arg_l > 0)
-#endif
-#ifdef DIGITAL_UNIX_BUG_COMPATIBLE                      /* ("%#o",0) -> "00" */
-#else
-              /* unless zero is already the first character */
-              && !(zero_padding_insertion_ind < str_arg_l
-                   && tmp[zero_padding_insertion_ind] == '0')
-#endif
-          ) {        /* assure leading zero for alternate-form octal numbers */
-            if (!precision_specified || precision < num_of_digits+1) {
-             /* precision is increased to force the first character to be zero,
-                except if a zero value is formatted with an explicit precision
-                of zero */
-              precision = num_of_digits+1; precision_specified = 1;
-            }
-          }
-       /* zero padding to specified precision? */
-          if (num_of_digits < precision) 
-            number_of_zeros_to_pad = precision - num_of_digits;
-        }
-     /* zero padding to specified minimal field width? */
-        if (!justify_left && zero_padding) {
-          int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
-          if (n > 0) number_of_zeros_to_pad += n;
-        }
-        break;
-      }
-      default: /* unrecognized conversion specifier, keep format string as-is*/
-        zero_padding = 0;  /* turn zero padding off for non-numeric convers. */
-#ifndef DIGITAL_UNIX_COMPATIBLE
-        justify_left = 1; min_field_width = 0;                /* reset flags */
-#endif
-#if defined(PERL_COMPATIBLE) || defined(LINUX_COMPATIBLE)
-     /* keep the entire format string unchanged */
-        str_arg = starting_p; str_arg_l = p - starting_p;
-     /* well, not exactly so for Linux, which does something inbetween,
-      * and I don't feel an urge to imitate it: "%+++++hy" -> "%+y"  */
-#else
-     /* discard the unrecognized conversion, just keep *
-      * the unrecognized conversion character          */
-        str_arg = p; str_arg_l = 0;
-#endif
-        if (*p) str_arg_l++;  /* include invalid conversion specifier unchanged
-                                 if not at end-of-string */
-        break;
-      }
-      if (*p) p++;      /* step over the just processed conversion specifier */
-   /* insert padding to the left as requested by min_field_width;
-      this does not include the zero padding in case of numerical conversions*/
-      if (!justify_left) {                /* left padding with blank or zero */
-        int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memset(str+str_l, (zero_padding?'0':' '), (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-   /* zero padding as requested by the precision or by the minimal field width
-    * for numeric conversions required? */
-      if (number_of_zeros_to_pad <= 0) {
-     /* will not copy first part of numeric right now, *
-      * force it to be copied later in its entirety    */
-        zero_padding_insertion_ind = 0;
-      } else {
-     /* insert first part of numerics (sign or '0x') before zero padding */
-        int n = zero_padding_insertion_ind;
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memcpy(str+str_l, str_arg, (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-     /* insert zero padding as requested by the precision or min field width */
-        n = number_of_zeros_to_pad;
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memset(str+str_l, '0', (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-   /* insert formatted string
-    * (or as-is conversion specifier for unknown conversions) */
-      { int n = str_arg_l - zero_padding_insertion_ind;
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memcpy(str+str_l, str_arg+zero_padding_insertion_ind,
-                        (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-   /* insert right padding */
-      if (justify_left) {          /* right blank padding to the field width */
-        int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memset(str+str_l, ' ', (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-    }
-  }
-#if defined(NEED_SNPRINTF_ONLY)
-  va_end(ap);
-#endif
-  if (str_m > 0) { /* make sure the string is null-terminated
-                      even at the expense of overwriting the last character
-                      (shouldn't happen, but just in case) */
-    str[str_l <= str_m-1 ? str_l : str_m-1] = '\0';
-  }
-  /* Return the number of characters formatted (excluding trailing null
-   * character), that is, the number of characters that would have been
-   * written to the buffer if it were large enough.
-   *
-   * The value of str_l should be returned, but str_l is of unsigned type
-   * size_t, and snprintf is int, possibly leading to an undetected
-   * integer overflow, resulting in a negative return value, which is illegal.
-   * Both XSH5 and ISO C99 (at least the draft) are silent on this issue.
-   * Should errno be set to EOVERFLOW and EOF returned in this case???
-   */
-  return (int) str_l;
-}
-#endif
-#endif /* __OS2__ */
 /*
   Local Variables:
   tab-width: 3
index 4e0b264..2638be9 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef MISCUTIL_H_INCLUDED
-#define MISCUTIL_H_INCLUDED
-#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.19 2002/03/24 13:25:43 swa Exp $"
+#ifndef _MISCUTIL_H
+#define _MISCUTIL_H
+#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.7 2001/06/05 22:32:01 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/miscutil.h,v $
@@ -11,7 +11,7 @@
  *                really fit in any other file.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: miscutil.h,v $
- *    Revision 1.19  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.18  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.17  2002/03/04 18:28:32  oes
- *    Deleted deletePidFile, played syleguide police
- *
- *    Revision 1.16  2002/01/21 00:53:36  jongfoster
- *    Adding string_join()
- *
- *    Revision 1.15  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.14  2001/11/05 21:43:48  steudten
- *    Add global var 'basedir' for unix os.
- *
- *    Revision 1.13  2001/10/29 03:48:10  david__schmidt
- *    OS/2 native needed a snprintf() routine.  Added one to miscutil, brackedted
- *    by and __OS2__ ifdef.
- *
- *    Revision 1.12  2001/10/23 21:27:50  jongfoster
- *    Standardising error codes in string_append
- *    make_path() no longer adds '\\' if the dir already ends in '\\' (this
- *    is just copying a UNIX-specific fix to the Windows-specific part)
- *
- *    Revision 1.11  2001/10/14 22:02:57  jongfoster
- *    New function string_append() which is like strsav(), but running
- *    out of memory isn't automatically FATAL.
- *
- *    Revision 1.10  2001/09/20 13:34:09  steudten
- *
- *    change long to int for prototype hash_string()
- *
- *    Revision 1.9  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.8  2001/06/29 13:32:14  oes
- *    Removed logentry from cancelled commit
- *
  *    Revision 1.7  2001/06/05 22:32:01  jongfoster
  *    New function make_path() to splice directory and file names together.
  *
  *********************************************************************/
 \f
 
-#include "project.h"
-
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
-extern const char *basedir;
-extern void *zalloc(size_t size);
+extern void *zalloc(int size);
 
-#if defined(unix)
-extern void write_pid_file(void);
-#endif /* unix */
-
-extern unsigned int hash_string(const char* s);
+extern unsigned long hash_string(const char* s);
 
 extern char *safe_strerror(int err);
 
@@ -155,13 +101,11 @@ extern int strcmpic(const char *s1, const char *s2);
 extern int strncmpic(const char *s1, const char *s2, size_t n);
 
 extern char *strsav(char *old, const char *text_to_append);
-extern jb_err string_append(char **target_string, const char *text_to_append);
-extern jb_err string_join  (char **target_string,       char *text_to_append);
 
 extern char *chomp(char *string);
 extern int simplematch(char *pattern, char *text);
 
-extern char *bindup(const char *string, size_t len);
+extern char *bindup(const char *string, int n);
 
 extern char *make_path(const char * dir, const char * file);
 
@@ -169,10 +113,6 @@ extern char *make_path(const char * dir, const char * file);
 extern char *strdup(const char *s);
 #endif /* def __MINGW32__ */
 
-#ifdef __OS2__
-extern int snprintf(char *, size_t, const char *, /*args*/ ...);
-#endif /* def __OS2__ */
-
 /* Revision control strings from this header and associated .c file */
 extern const char miscutil_rcs[];
 extern const char miscutil_h_rcs[];
@@ -181,7 +121,7 @@ extern const char miscutil_h_rcs[];
 }
 #endif
 
-#endif /* ndef MISCUTIL_H_INCLUDED */
+#endif /* ndef _MISCUTIL_H */
 
 /*
   Local Variables:
index 6129e0e..11b511e 100644 (file)
--- a/parsers.c
+++ b/parsers.c
@@ -1,4 +1,4 @@
-const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.17 2001/06/29 21:45:41 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/parsers.c,v $
@@ -10,17 +10,18 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
  *                   `client_uagent', `client_x_forwarded',
  *                   `client_x_forwarded_adder', `client_xtra_adder',
  *                   `content_type', `crumble', `destroy_list', `enlist',
- *                   `flush_socket', ``get_header', `sed',
+ *                   `flush_socket', `free_http_request', `get_header',
+ *                   `list_to_text', `parse_http_request', `sed',
  *                   and `server_set_cookie'.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -40,186 +41,6 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: parsers.c,v $
- *    Revision 1.52  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.51  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.50  2002/03/12 01:45:35  oes
- *    More verbose logging
- *
- *    Revision 1.49  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.48  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.47  2002/02/20 23:15:13  jongfoster
- *    Parsing functions now handle out-of-memory gracefully by returning
- *    an error code.
- *
- *    Revision 1.46  2002/01/17 21:03:47  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.45  2002/01/09 14:33:03  oes
- *    Added support for localtime_r.
- *
- *    Revision 1.44  2001/12/14 01:22:54  steudten
- *    Remove 'user:pass@' from 'proto://user:pass@host' for the
- *    new added header 'Host: ..'. (See Req ID 491818)
- *
- *    Revision 1.43  2001/11/23 00:26:38  jongfoster
- *    Fixing two really stupid errors in my previous commit
- *
- *    Revision 1.42  2001/11/22 21:59:30  jongfoster
- *    Adding code to handle +no-cookies-keep
- *
- *    Revision 1.41  2001/11/05 23:43:05  steudten
- *    Add time+date to log files.
- *
- *    Revision 1.40  2001/10/26 20:13:09  jongfoster
- *    ctype.h is needed in Windows, too.
- *
- *    Revision 1.39  2001/10/26 17:40:04  oes
- *    Introduced get_header_value()
- *    Removed http->user_agent, csp->referrer and csp->accept_types
- *    Removed client_accept()
- *
- *    Revision 1.38  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.37  2001/10/23 21:36:02  jongfoster
- *    Documenting sed()'s error behaviou (doc change only)
- *
- *    Revision 1.36  2001/10/13 12:51:51  joergs
- *    Removed client_host, (was only required for the old 2.0.2-11 http://noijb.
- *    force-load), instead crumble Host: and add it (again) in client_host_adder
- *    (in case we get a HTTP/1.0 request without Host: header and forward it to
- *    a HTTP/1.1 server/proxy).
- *
- *    Revision 1.35  2001/10/09 22:39:21  jongfoster
- *    assert.h is also required under Win32, so moving out of #ifndef _WIN32
- *    block.
- *
- *    Revision 1.34  2001/10/07 18:50:55  oes
- *    Added server_content_encoding, renamed server_transfer_encoding
- *
- *    Revision 1.33  2001/10/07 18:04:49  oes
- *    Changed server_http11 to server_http and its pattern to "HTTP".
- *      Additional functionality: it now saves the HTTP status into
- *      csp->http->status and sets CT_TABOO for Status 206 (partial range)
- *
- *    Revision 1.32  2001/10/07 15:43:28  oes
- *    Removed FEATURE_DENY_GZIP and replaced it with client_accept_encoding,
- *       client_te and client_accept_encoding_adder, triggered by the new
- *       +no-compression action. For HTTP/1.1 the Accept-Encoding header is
- *       changed to allow only identity and chunked, and the TE header is
- *       crunched. For HTTP/1.0, Accept-Encoding is crunched.
- *
- *    parse_http_request no longer does anything than parsing. The rewriting
- *      of http->cmd and version mangling are gone. It now also recognizes
- *      the put and delete methods and saves the url in http->url. Removed
- *      unused variable.
- *
- *    renamed content_type and content_length to have the server_ prefix
- *
- *    server_content_type now only works if csp->content_type != CT_TABOO
- *
- *    added server_transfer_encoding, which
- *      - Sets CT_TABOO to prohibit filtering if encoding compresses
- *      - Raises the CSP_FLAG_CHUNKED flag if Encoding is "chunked"
- *      - Change from "chunked" to "identity" if body was chunked
- *        but has been de-chunked for filtering.
- *
- *    added server_content_md5 which crunches any Content-MD5 headers
- *      if the body was modified.
- *
- *    made server_http11 conditional on +downgrade action
- *
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Revision 1.31  2001/10/05 14:25:02  oes
- *    Crumble Keep-Alive from Server
- *
- *    Revision 1.30  2001/09/29 12:56:03  joergs
- *    IJB now changes HTTP/1.1 to HTTP/1.0 in requests and answers.
- *
- *    Revision 1.29  2001/09/24 21:09:24  jongfoster
- *    Fixing 2 memory leaks that Guy spotted, where the paramater to
- *    enlist() was not being free()d.
- *
- *    Revision 1.28  2001/09/22 16:32:28  jongfoster
- *    Removing unused #includes.
- *
- *    Revision 1.27  2001/09/20 15:45:25  steudten
- *
- *    add casting from size_t to int for printf()
- *    remove local variable shadow s2
- *
- *    Revision 1.26  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.25  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.24  2001/09/13 23:05:50  jongfoster
- *    Changing the string paramater to the header parsers a "const".
- *
- *    Revision 1.23  2001/09/12 18:08:19  steudten
- *
- *    In parse_http_request() header rewriting miss the host value, so
- *    from http://www.mydomain.com the result was just " / " not
- *    http://www.mydomain.com/ in case we forward.
- *
- *    Revision 1.22  2001/09/10 10:58:53  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.21  2001/07/31 14:46:00  oes
- *     - Persistant connections now suppressed
- *     - sed() no longer appends empty header to csp->headers
- *
- *    Revision 1.20  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.19  2001/07/25 17:21:54  oes
- *    client_uagent now saves copy of User-Agent: header value
- *
- *    Revision 1.18  2001/07/13 14:02:46  oes
- *     - Included fix to repair broken HTTP requests that
- *       don't contain a path, not even '/'.
- *     - Removed all #ifdef PCRS
- *     - content_type now always inspected and classified as
- *       text, gif or other.
- *     - formatting / comments
- *
  *    Revision 1.17  2001/06/29 21:45:41  oes
  *    Indentation, CRLF->LF, Tab-> Space
  *
@@ -245,7 +66,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
  *    CRLF -> LF
  *
  *    Revision 1.11  2001/05/29 20:11:19  joergs
- *    '/ * inside comment' warning removed.
+ *    '/* inside comment' warning removed.
  *
  *    Revision 1.10  2001/05/29 09:50:24  jongfoster
  *    Unified blocklist/imagelist/permissionslist.
@@ -371,17 +192,13 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
 
 #include "config.h"
 
-#ifndef _WIN32
 #include <stdio.h>
 #include <sys/types.h>
-#endif
-
 #include <stdlib.h>
 #include <ctype.h>
-#include <assert.h>
 #include <string.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
@@ -389,11 +206,15 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
 #include "list.h"
 #include "parsers.h"
 #include "encode.h"
+#include "filters.h"
+#include "loaders.h"
+#include "showargs.h"
+#include "jcc.h"
 #include "ssplit.h"
 #include "errlog.h"
 #include "jbsockets.h"
 #include "miscutil.h"
-#include "list.h"
+#include "cgi.h"
 
 const char parsers_h_rcs[] = PARSERS_H_VERSION;
 
@@ -403,8 +224,8 @@ const char parsers_h_rcs[] = PARSERS_H_VERSION;
  * as an array index.  Therefore we need to make sure that high-bit
  * characters generate +ve values, and ideally we also want to make
  * the argument match the declared parameter type of "int".
- *
- * Why did they write a character function that can't take a simple
+ * 
+ * Why did they write a character function that can't take a simple 
  * "char" argument?  Doh!
  */
 #define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
@@ -418,44 +239,39 @@ const struct parsers client_patterns[] = {
    { "from:",                    5,    client_from },
    { "cookie:",                  7,    client_send_cookie },
    { "x-forwarded-for:",         16,   client_x_forwarded },
-   { "Accept-Encoding:",         16,   client_accept_encoding },
-   { "TE:",                      3,    client_te },
-   { "Host:",                     5,   crumble },
-/* { "if-modified-since:",       18,   crumble }, */
-   { "Keep-Alive:",              11,   crumble },
-   { "connection:",              11,   crumble },
    { "proxy-connection:",        17,   crumble },
+#ifdef DENY_GZIP
+   { "Accept-Encoding: gzip",    21,   crumble },
+#endif /* def DENY_GZIP */
+#if defined(DETECT_MSIE_IMAGES)
+   { "Accept:",                   7,   client_accept },
+#endif /* defined(DETECT_MSIE_IMAGES) */
+#ifdef FORCE_LOAD
+   { "Host:",                     5,   client_host },
+#endif /* def FORCE_LOAD */
+/* { "if-modified-since:",       18,   crumble }, */
    { NULL,                       0,    NULL }
 };
 
 
 const struct parsers server_patterns[] = {
-   { "HTTP",                4, server_http },
    { "set-cookie:",        11, server_set_cookie },
    { "connection:",        11, crumble },
-   { "Content-Type:",      13, server_content_type },
-   { "Content-Length:",    15, server_content_length },
-   { "Content-MD5:",       12, server_content_md5 },
-   { "Content-Encoding:",  17, server_content_encoding },
-   { "Transfer-Encoding:", 18, server_transfer_coding },
-   { "Keep-Alive:",        11, crumble },
+   { "Content-Type:",      13, content_type },
+   { "Content-Length:",    15, content_length },
    { NULL, 0, NULL }
 };
 
 
-const add_header_func_ptr add_client_headers[] = {
-   client_host_adder,
+void (* const add_client_headers[])(struct client_state *) = {
    client_cookie_adder,
    client_x_forwarded_adder,
    client_xtra_adder,
-   client_accept_encoding_adder,
-   connection_close_adder,
    NULL
 };
 
 
-const add_header_func_ptr add_server_headers[] = {
-   connection_close_adder,
+void (* const add_server_headers[])(struct client_state *) = {
    NULL
 };
 
@@ -478,22 +294,19 @@ const add_header_func_ptr add_server_headers[] = {
  *                file, the results are not portable.
  *
  *********************************************************************/
-int flush_socket(jb_socket fd, struct client_state *csp)
+int flush_socket(int fd, struct client_state *csp)
 {
    struct iob *iob = csp->iob;
-   int len = iob->eod - iob->cur;
+   int n = iob->eod - iob->cur;
 
-   if (len <= 0)
+   if (n <= 0)
    {
       return(0);
    }
 
-   if (write_socket(fd, iob->cur, (size_t)len))
-   {
-      return(-1);
-   }
+   n = write_socket(fd, iob->cur, n);
    iob->eod = iob->cur = iob->buf;
-   return(len);
+   return(n);
 
 }
 
@@ -509,27 +322,28 @@ int flush_socket(jb_socket fd, struct client_state *csp)
  *          2  :  buf = holds the content to be added to the page
  *          3  :  n = number of bytes to be added
  *
- * Returns     :  None
+ * Returns     :  Number of bytes in the content buffer.
  *
  *********************************************************************/
-void add_to_iob(struct client_state *csp, char *buf, int n)
+int add_to_iob(struct client_state *csp, char *buf, int n)
 {
    struct iob *iob = csp->iob;
-   size_t have, need;
+   int have, need;
    char *p;
 
    have = iob->eod - iob->cur;
 
    if (n <= 0)
    {
-      return;
+      return(have);
    }
 
    need = have + n;
 
    if ((p = (char *)malloc(need + 1)) == NULL)
    {
-      log_error(LOG_LEVEL_FATAL, "malloc() iob failed: %E");
+      log_error(LOG_LEVEL_ERROR, "malloc() iob failed: %E");
+      return(-1);
    }
 
    if (have)
@@ -552,7 +366,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n)
    }
 
    /* copy the new data into the iob buffer */
-   memcpy(p, buf, (size_t)n);
+   memcpy(p, buf, n);
 
    /* point to the end of the data */
    p += n;
@@ -564,7 +378,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n)
    iob->cur = iob->buf;
    iob->eod = p;
 
-   return;
+   return(need);
 
 }
 
@@ -601,15 +415,10 @@ char *get_header(struct client_state *csp)
    *p = '\0';
 
    ret = strdup(iob->cur);
-   if (ret == NULL)
-   {
-      /* FIXME No way to handle error properly */
-      log_error(LOG_LEVEL_FATAL, "Out of memory in get_header()");
-   }
 
    iob->cur = p+1;
 
-   if ((q = strchr(ret, '\r')) != NULL) *q = '\0';
+   if ((q = strchr(ret, '\r'))) *q = '\0';
 
    /* is this a blank linke (i.e. the end of the header) ? */
    if (*ret == '\0')
@@ -623,56 +432,6 @@ char *get_header(struct client_state *csp)
 }
 
 
-/*********************************************************************
- *
- * Function    :  get_header_value
- *
- * Description :  Get the value of a given header from a chained list
- *                of header lines or return NULL if no such header is
- *                present in the list.
- *
- * Parameters  :
- *          1  :  header_list = pointer to list
- *          2  :  header_name = string with name of header to look for.
- *                              Trailing colon required, capitalization
- *                              doesn't matter.
- *
- * Returns     :  NULL if not found, else value of header
- *
- *********************************************************************/
-char *get_header_value(const struct list *header_list, const char *header_name)
-{
-   struct list_entry *cur_entry;
-   char *ret = NULL;
-   size_t length = 0;
-
-   assert(header_list);
-   assert(header_name);
-   length = strlen(header_name);
-
-   for (cur_entry = header_list->first; cur_entry ; cur_entry = cur_entry->next)
-   {
-      if (cur_entry->str)
-      {
-         if (!strncmpic(cur_entry->str, header_name, length))
-         {
-            /*
-             * Found: return pointer to start of value
-             */
-            ret = (char *) (cur_entry->str + length);
-            while (*ret && ijb_isspace(*ret)) ret++;
-            return(ret);
-         }
-      }
-   }
-
-   /* 
-    * Not found
-    */
-   return NULL;
-
-}
-
 /*********************************************************************
  *
  * Function    :  sed
@@ -691,22 +450,19 @@ char *get_header_value(const struct list *header_list, const char *header_name)
  *                headers (client or server)
  *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  Single pointer to a fully formed header, or NULL
- *                on out-of-memory error.
+ * Returns     :  Single pointer to a fully formed header.
  *
  *********************************************************************/
-char *sed(const struct parsers pats[],
-          const add_header_func_ptr more_headers[],
-          struct client_state *csp)
+char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp)
 {
-   struct list_entry *p;
+   struct list *p;
    const struct parsers *v;
-   const add_header_func_ptr *f;
-   jb_err err = JB_ERR_OK;
+   char *hdr;
+   void (* const *f)();
 
-   for (v = pats; (err == JB_ERR_OK) && (v->str != NULL) ; v++)
+   for (v = pats; v->str ; v++)
    {
-      for (p = csp->headers->first; (err == JB_ERR_OK) && (p != NULL) ; p = p->next)
+      for (p = csp->headers->next; p ; p = p->next)
       {
          /* Header crunch()ed in previous run? -> ignore */
          if (p->str == NULL) continue;
@@ -715,312 +471,310 @@ char *sed(const struct parsers pats[],
 
          if (strncmpic(p->str, v->str, v->len) == 0)
          {
-            err = v->parser(csp, (char **)&(p->str));
+            hdr = v->parser(v, p->str, csp);
+            freez(p->str);
+            p->str = hdr;
          }
       }
    }
 
    /* place any additional headers on the csp->headers list */
-   for (f = more_headers; (err == JB_ERR_OK) && (*f) ; f++)
+   for (f = more_headers; *f ; f++)
    {
-      err = (*f)(csp);
+      (*f)(csp);
    }
 
-   if (err != JB_ERR_OK)
+   /* add the blank line at the end of the header, if necessary */
+   if ( (csp->headers->last == NULL)
+     || (csp->headers->last->str == NULL)
+     || (*csp->headers->last->str != '\0') )
    {
-      return NULL;
+      enlist(csp->headers, "");
    }
 
-   return list_to_text(csp->headers);
-}
+   hdr = list_to_text(csp->headers);
 
+   return(hdr);
 
-/* here begins the family of parser functions that reformat header lines */
+}
 
 
 /*********************************************************************
  *
- * Function    :  crumble
+ * Function    :  free_http_request
  *
- * Description :  This is called if a header matches a pattern to "crunch"
+ * Description :  Freez a http_request structure
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  http = points to a http_request structure to free
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err crumble(struct client_state *csp, char **header)
+void free_http_request(struct http_request *http)
 {
-   log_error(LOG_LEVEL_HEADER, "crunch!");
-   freez(*header);
-   return JB_ERR_OK;
+   freez(http->cmd);
+   freez(http->gpc);
+   freez(http->host);
+   freez(http->hostport);
+   freez(http->path);
+   freez(http->ver);
+   freez(http->host_ip_addr_str);
+
 }
 
 
 /*********************************************************************
  *
- * Function    :  server_content_type
+ * Function    :  parse_http_request
  *
- * Description :  Set the content-type for filterable types (text/.*,
- *                javascript and image/gif) unless filtering has been
- *                forbidden (CT_TABOO) while parsing earlier headers.
+ * Description :  Parse out the host and port from the URL.  Find the
+ *                hostname & path, port (if ':'), and/or password (if '@')
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  req = URL (or is it URI?) to break down
+ *          2  :  http = pointer to the http structure to hold elements
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err server_content_type(struct client_state *csp, char **header)
+void parse_http_request(char *req, struct http_request *http, struct client_state *csp)
 {
-   if (csp->content_type != CT_TABOO)
-   {
-      if (strstr(*header, " text/")
-       || strstr(*header, "application/x-javascript"))
-         csp->content_type = CT_TEXT;
-      else if (strstr(*header, " image/gif"))
-         csp->content_type = CT_GIF;
-      else
-         csp->content_type = 0;
-   }
+   char *buf, *v[10], *url, *p;
+   int n;
 
-   return JB_ERR_OK;
-}
+   memset(http, '\0', sizeof(*http));
 
+   http->cmd = strdup(req);
 
-/*********************************************************************
- *
- * Function    :  server_transfer_coding
- *
- * Description :  - Prohibit filtering (CT_TABOO) if transfer coding compresses
- *                - Raise the CSP_FLAG_CHUNKED flag if coding is "chunked"
- *                - Change from "chunked" to "identity" if body was chunked
- *                  but has been de-chunked for filtering.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err server_transfer_coding(struct client_state *csp, char **header)
-{
-   /*
-    * Turn off pcrs and gif filtering if body compressed
-    */
-   if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate"))
-   {
-      csp->content_type = CT_TABOO;
-   }
+   buf = strdup(req);
+   n = ssplit(buf, " \r\n", v, SZ(v), 1, 1);
 
-   /*
-    * Raise flag if body chunked
-    */
-   if (strstr(*header, "chunked"))
+   if (n == 3)
    {
-      csp->flags |= CSP_FLAG_CHUNKED;
+      /* this could be a CONNECT request */
+      if (strcmpic(v[0], "connect") == 0)
+      {
+         http->ssl      = 1;
+         http->gpc      = strdup(v[0]);
+         http->hostport = strdup(v[1]);
+         http->ver      = strdup(v[2]);
+      }
 
-      /*
-       * If the body was modified, it has been
-       * de-chunked first, so adjust the header:
-       */
-      if (csp->flags & CSP_FLAG_MODIFIED)
+#ifdef WEBDAV
+
+/* This next line is a little ugly, but it simplifies the if statement below. */
+/* Basically if using webDAV, we want the OR condition to use these too.      */
+
+/*
+ * by haroon
+ * These are the headers as defined in RFC2518 to add webDAV support
+ */
+
+#define OR_WEBDAV || \
+         (0 == strcmpic(v[0], "propfind")) || \
+         (0 == strcmpic(v[0], "proppatch")) || \
+         (0 == strcmpic(v[0], "move")) || \
+         (0 == strcmpic(v[0], "copy")) || \
+         (0 == strcmpic(v[0], "mkcol")) || \
+         (0 == strcmpic(v[0], "lock")) || \
+         (0 == strcmpic(v[0], "unlock"))
+
+#else /* No webDAV support is enabled.  Provide an empty OR_WEBDAV macro. */
+
+#define OR_WEBDAV
+
+#endif
+
+      /* or it could be a GET or a POST (possibly webDAV too) */
+      if ((strcmpic(v[0], "get")  == 0) ||
+          (strcmpic(v[0], "head") == 0) OR_WEBDAV ||
+          (strcmpic(v[0], "post") == 0))
       {
-         freez(*header);
-         *header = strdup("Transfer-Encoding: identity");
-         return (header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
+         http->ssl      = 0;
+         http->gpc      = strdup(v[0]);
+         url            = v[1];
+         http->ver      = strdup(v[2]);
+
+         if (strncmpic(url, "http://",  7) == 0)
+         {
+            url += 7;
+         }
+         else if (strncmpic(url, "https://", 8) == 0)
+         {
+            url += 8;
+         }
+         else
+         {
+            url = NULL;
+         }
+
+         if (url)
+         {
+            if (p = strchr(url, '/'))
+            {
+               http->path = strdup(p);
+               *p = '\0';
+               http->hostport = strdup(url);
+            }
+            /* 
+             * Repair broken HTTP requests that don't contain a path
+             */
+            else
+            {
+               /* Repair hostport & path */
+               http->path = strdup("/");
+               http->hostport = strdup(url);
+
+               /* Even repair cmd in case we're just forwarding. Boy are we nice ;-)  */
+               freez(http->cmd);
+               http->cmd = strsav(http->cmd, http->gpc);
+               http->cmd = strsav(http->cmd, " / ");
+               http->cmd = strsav(http->cmd, http->ver);
+            }
+         }
       }
    }
 
-   return JB_ERR_OK;
-}
+   freez(buf);
 
 
-/*********************************************************************
- *
- * Function    :  server_content_encoding
- *
- * Description :  Prohibit filtering (CT_TABOO) if content encoding compresses
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err server_content_encoding(struct client_state *csp, char **header)
-{
-   /*
-    * Turn off pcrs and gif filtering if body compressed
-    */
-   if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate"))
+   if (http->hostport == NULL)
    {
-      csp->content_type = CT_TABOO;
+      free_http_request(http);
+      return;
    }
 
-   return JB_ERR_OK;
+   buf = strdup(http->hostport);
 
-}
 
+   /* check if url contains password */
+   n = ssplit(buf, "@", v, SZ(v), 1, 1);
+   if (n == 2)
+   {
+      char * newbuf = NULL;
+      newbuf = strdup(v[1]);
+      freez(buf);
+      buf = newbuf;
+   }
 
-/*********************************************************************
- *
- * Function    :  server_content_length
- *
- * Description :  Adjust Content-Length header if we modified
- *                the body.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err server_content_length(struct client_state *csp, char **header)
-{
-   if (csp->content_length != 0) /* Content length has been modified */
+   n = ssplit(buf, ":", v, SZ(v), 1, 1);
+
+   if (n == 1)
    {
-      freez(*header);
-      *header = (char *) zalloc(100);
-      if (*header == NULL)
-      {
-         return JB_ERR_MEMORY;
-      }
+      http->host = strdup(v[0]);
+      http->port = 80;
+   }
 
-      sprintf(*header, "Content-Length: %d", (int) csp->content_length);
+   if (n == 2)
+   {
+      http->host = strdup(v[0]);
+      http->port = atoi(v[1]);
+   }
 
-      log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", (int) csp->content_length);
+   freez(buf);
+
+   if (http->host == NULL)
+   {
+      free_http_request(http);
+   }
+
+   if (http->path == NULL)
+   {
+      http->path = strdup("");
    }
 
-   return JB_ERR_OK;
 }
 
 
+/* here begins the family of parser functions that reformat header lines */
+
+
 /*********************************************************************
  *
- * Function    :  server_content_md5
+ * Function    :  crumble
  *
- * Description :  Crumble any Content-MD5 headers if the document was
- *                modified. FIXME: Should we re-compute instead?
+ * Description :  This is called if a header matches a pattern to "crunch"
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = Pointer to parsers structure, which basically holds
+ *                headers (client or server) that we want to "crunch"
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Always NULL.
  *
  *********************************************************************/
-jb_err server_content_md5(struct client_state *csp, char **header)
+char *crumble(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if (csp->flags & CSP_FLAG_MODIFIED)
-   {
-      log_error(LOG_LEVEL_HEADER, "Crunching Content-MD5");
-      freez(*header);
-   }
+   log_error(LOG_LEVEL_HEADER, "crunch!");
+   return(NULL);
 
-   return JB_ERR_OK;
 }
 
 
 /*********************************************************************
  *
- * Function    :  client_accept_encoding
+ * Function    :  content_type
  *
- * Description :  Rewrite the client's Accept-Encoding header so that
- *                if doesn't allow compression, if the action applies.
- *                Note: For HTTP/1.0 the absence of the header is enough.
+ * Description :  Is this a text/.* or javascript MIME Type?
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header string we are "considering"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A duplicate string pointer to this header (ie. pass thru)
  *
  *********************************************************************/
-jb_err client_accept_encoding(struct client_state *csp, char **header)
+char *content_type(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
-   {
-      log_error(LOG_LEVEL_HEADER, "Supressed offer to compress content");
+   if (strstr(s, " text/") || strstr(s, "application/x-javascript"))
+      csp->content_type = CT_TEXT;
+   else if (strstr(s, " image/gif"))
+      csp->content_type = CT_GIF;
+   else
+      csp->content_type = 0;
 
-      freez(*header);
-      if (!strcmpic(csp->http->ver, "HTTP/1.1"))
-      {
-         *header = strdup("Accept-Encoding: identity;q=1.0, *;q=0");
-         if (*header == NULL)
-         {
-            return JB_ERR_MEMORY;
-         }
-      }
-   }
+   return(strdup(s));
 
-   return JB_ERR_OK;
 }
 
 
 /*********************************************************************
  *
- * Function    :  client_te
+ * Function    :  content_length
  *
- * Description :  Rewrite the client's TE header so that
- *                if doesn't allow compression, if the action applies.
+ * Description :  Adjust Content-Length header if we modified
+ *                the body.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header string we are "considering"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A duplicate string pointer to this header (ie. pass thru)
  *
  *********************************************************************/
-jb_err client_te(struct client_state *csp, char **header)
+char *content_length(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
+   if (csp->content_length != 0) /* Content has been modified */
    {
-      freez(*header);
-      log_error(LOG_LEVEL_HEADER, "Supressed offer to compress transfer");
+      s = (char *) zalloc(100);
+      sprintf(s, "Content-Length: %d", csp->content_length);
+
+       log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", csp->content_length);
+      return(s);
+   }
+   else
+   {
+      return(strdup(s));
    }
 
-   return JB_ERR_OK;
 }
 
+
 /*********************************************************************
  *
  * Function    :  client_referrer
@@ -1029,81 +783,96 @@ jb_err client_te(struct client_state *csp, char **header)
  *                Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  NULL if crunched, or a malloc'ed string with the original
+ *                or modified header
  *
  *********************************************************************/
-jb_err client_referrer(struct client_state *csp, char **header)
+char *client_referrer(const struct parsers *v, char *s, struct client_state *csp)
 {
    const char * newval;
-
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
    /* Since the referrer can include the prefix even
     * even if the request itself is non-forced, we must
-    * clean it unconditionally
+    * clean it unconditionally 
     */
-   strclean(*header, FORCE_PREFIX);
-#endif /* def FEATURE_FORCE_LOAD */
+   strclean(s, FORCE_PREFIX);
+#endif /* def FORCE_LOAD */
+
+#ifdef TRUST_FILES
+   csp->referrer = strdup(s);
+#endif /* def TRUST_FILES */
 
    /*
     * Are we sending referer?
     */
    if ((csp->action->flags & ACTION_HIDE_REFERER) == 0)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
-   freez(*header);
-
    newval = csp->action->string[ACTION_STRING_REFERER];
 
+   /*
+    * Are we blocking referer?
+    */
    if ((newval == NULL) || (0 == strcmpic(newval, "block")) )
    {
-      /*
-       * Blocking referer
-       */
       log_error(LOG_LEVEL_HEADER, "crunch!");
-      return JB_ERR_OK;
+      return(NULL);
    }
-   else if (0 == strncmpic(newval, "http://", 7))
+
+   /*
+    * Are we forging referer?
+    */
+   if (0 == strcmpic(newval, "forge"))
    {
       /*
-       * We have a specific (fixed) referer we want to send.
+       * Forge a referer as http://[hostname:port of REQUEST]/
+       * to fool stupid checks for in-site links
        */
-      log_error(LOG_LEVEL_HEADER, "modified");
-
-      *header = strdup("Referer: ");
-      string_append(header, newval);
-
-      return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
+      log_error(LOG_LEVEL_HEADER, "crunch+forge!");
+      s = strsav(NULL, "Referer: ");
+      s = strsav(s, "http://");
+      s = strsav(s, csp->http->hostport);
+      s = strsav(s, "/");
+      return(s);
    }
-   else
+
+   /*
+    * Have we got a fixed referer?
+    */
+   if (0 == strncmpic(newval, "http://", 7))
    {
       /*
-       * Forge a referer as http://[hostname:port of REQUEST]/
-       * to fool stupid checks for in-site links
+       * We have a specific (fixed) referer we want to send.
        */
-      if (0 != strcmpic(newval, "forge"))
-      {
-         /*
-          * Invalid choice - but forge is probably the best default.
-          */
-         log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval);
-      }
 
-      *header = strdup("Referer: http://");
-      string_append(header, csp->http->hostport);
-      string_append(header, "/");
-      log_error(LOG_LEVEL_HEADER, "crunch+forge to %s", *header);
-      
-      return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
+      log_error(LOG_LEVEL_HEADER, "modified");
+
+      s = strsav( NULL, "Referer: " );
+      s = strsav( s, newval );
+      return(s);
    }
+
+   /* Should never get here! */
+   log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval);
+
+   /*
+    * Forge is probably the best default.
+    *
+    * Forge a referer as http://[hostname:port of REQUEST]/
+    * to fool stupid checks for in-site links
+    */
+   log_error(LOG_LEVEL_HEADER, "crunch+forge!");
+   s = strsav(NULL, "Referer: ");
+   s = strsav(s, "http://");
+   s = strsav(s, csp->http->hostport);
+   s = strsav(s, "/");
+   return(s);
 }
 
 
@@ -1111,43 +880,49 @@ jb_err client_referrer(struct client_state *csp, char **header)
  *
  * Function    :  client_uagent
  *
- * Description :  Handle the "user-agent" config setting properly
- *                and remember its original value to enable browser
- *                bug workarounds. Called from `sed'.
+ * Description :  Handle the "user-agent" config setting properly.
+ *                Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A malloc'ed pointer to the default agent, or
+ *                a malloc'ed string pointer to this header (ie. pass thru).
  *
  *********************************************************************/
-jb_err client_uagent(struct client_state *csp, char **header)
+char *client_uagent(const struct parsers *v, char *s, struct client_state *csp)
 {
    const char * newval;
 
+#ifdef DETECT_MSIE_IMAGES
+   if (strstr (s, "MSIE "))
+   {
+      /* This is Microsoft Internet Explorer.
+       * Enable auto-detect.
+       */
+      csp->accept_types |= ACCEPT_TYPE_IS_MSIE;
+   }
+#endif /* def DETECT_MSIE_IMAGES */
+
    if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
    newval = csp->action->string[ACTION_STRING_USER_AGENT];
    if (newval == NULL)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
    log_error(LOG_LEVEL_HEADER, "modified");
 
-   freez(*header);
-   *header = strdup("User-Agent: ");
-   string_append(header, newval);
+   s = strsav( NULL, "User-Agent: " );
+   s = strsav( s, newval );
+   return(s);
 
-   return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
 }
 
 
@@ -1158,25 +933,24 @@ jb_err client_uagent(struct client_state *csp, char **header)
  * Description :  Handle "ua-" headers properly.  Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  NULL if crunched, or a malloc'ed string to original header
  *
  *********************************************************************/
-jb_err client_ua(struct client_state *csp, char **header)
+char *client_ua(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if ((csp->action->flags & ACTION_HIDE_USER_AGENT) != 0)
+   if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0)
+   {
+      return(strdup(s));
+   }
+   else
    {
       log_error(LOG_LEVEL_HEADER, "crunch!");
-      freez(*header);
+      return(NULL);
    }
-
-   return JB_ERR_OK;
 }
 
 
@@ -1188,44 +962,40 @@ jb_err client_ua(struct client_state *csp, char **header)
  *                Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  NULL if crunched, or a malloc'ed string to
+ *                modified/original header.
  *
  *********************************************************************/
-jb_err client_from(struct client_state *csp, char **header)
+char *client_from(const struct parsers *v, char *s, struct client_state *csp)
 {
    const char * newval;
 
    if ((csp->action->flags & ACTION_HIDE_FROM) == 0)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
-   freez(*header);
-
    newval = csp->action->string[ACTION_STRING_FROM];
 
    /*
-    * Are we blocking the e-mail address?
+    * Are we blocking referer?
     */
    if ((newval == NULL) || (0 == strcmpic(newval, "block")) )
    {
       log_error(LOG_LEVEL_HEADER, "crunch!");
-      return JB_ERR_OK;
+      return(NULL);
    }
 
    log_error(LOG_LEVEL_HEADER, " modified");
 
-   *header = strdup("From: ");
-   string_append(header, newval);
+   s = strsav( NULL, "From: " );
+   s = strsav( s, newval );
+   return(s);
 
-   return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
 }
 
 
@@ -1238,24 +1008,18 @@ jb_err client_from(struct client_state *csp, char **header)
  *                else we crunch it.  Mmmmmmmmmmm ... cookie ......
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = pattern of cookie `sed' found matching
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Always NULL.
  *
  *********************************************************************/
-jb_err client_send_cookie(struct client_state *csp, char **header)
+char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp)
 {
-   jb_err result = JB_ERR_OK;
-
    if ((csp->action->flags & ACTION_NO_COOKIE_READ) == 0)
    {
-      /* strlen("cookie: ") == 8 */
-      result = enlist(csp->cookie_list, *header + 8);
+      enlist(csp->cookie_list, s + v->len + 1);
    }
    else
    {
@@ -1263,12 +1027,11 @@ jb_err client_send_cookie(struct client_state *csp, char **header)
    }
 
    /*
-    * Always remove the cookie here.  The cookie header
+    * Always return NULL here.  The cookie header
     * will be sent at the end of the header.
     */
-   freez(*header);
+   return(NULL);
 
-   return result;
 }
 
 
@@ -1280,91 +1043,72 @@ jb_err client_send_cookie(struct client_state *csp, char **header)
  *                also used in the add_client_headers list.  Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Always NULL.
  *
  *********************************************************************/
-jb_err client_x_forwarded(struct client_state *csp, char **header)
+char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp)
 {
    if ((csp->action->flags & ACTION_HIDE_FORWARDED) == 0)
    {
       /* Save it so we can re-add it later */
-      freez(csp->x_forwarded);
-      csp->x_forwarded = *header;
-
-      /*
-       * Always set *header = NULL, since this information
-       * will be sent at the end of the header.
-       */
-      *header = NULL;
-   }
-   else
-   {
-      freez(*header);
-      log_error(LOG_LEVEL_HEADER, " crunch!");
+      csp->x_forwarded = strdup(s);
    }
 
-   return JB_ERR_OK;
-}
+   /*
+    * Always return NULL, since this information
+    * will be sent at the end of the header.
+    */
 
-/* the following functions add headers directly to the header list */
+   return(NULL);
 
+}
+
+#if defined(DETECT_MSIE_IMAGES)
 /*********************************************************************
  *
- * Function    :  client_host_adder
+ * Function    :  client_accept
  *
- * Description :  (re)adds the host header. Called from `sed'.
+ * Description :  Detect whether the client wants HTML or an image.
+ *                Clients do not always make this information available
+ *                in a sane way.  Always passes the header through
+ *                the proxy unchanged.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
+ *          1  :  v = Ignored.
+ *          2  :  s = Header string.  Null terminated.
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Duplicate of argument s.
  *
  *********************************************************************/
-jb_err client_host_adder(struct client_state *csp)
+char *client_accept(const struct parsers *v, char *s, struct client_state *csp)
 {
-   char *p;
-   char *pos;
-   jb_err err;
-
-   if ( !csp->http->hostport || !*(csp->http->hostport))
+#ifdef DETECT_MSIE_IMAGES
+   if (strstr (s, "image/gif"))
    {
-      return JB_ERR_OK;
-   }
-
-   p = strdup("Host: ");
-   /*
-   ** remove 'user:pass@' from 'proto://user:pass@host'
-   */
-   if ( (pos = strchr( csp->http->hostport, '@')) != NULL )
-   {
-       string_append(&p, pos+1);
+      /* Client will accept HTML.  If this seems counterintuitive,
+       * blame Microsoft. 
+       */
+      csp->accept_types |= ACCEPT_TYPE_MSIE_HTML;
    }
    else
    {
-      string_append(&p, csp->http->hostport);
+      csp->accept_types |= ACCEPT_TYPE_MSIE_IMAGE;
    }
+#endif /* def DETECT_MSIE_IMAGES */
 
-   if (p == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
+   return(strdup(s));
 
-   log_error(LOG_LEVEL_HEADER, "addh: %s", p);
+}
+#endif /* defined(DETECT_MSIE_IMAGES) */
 
-   err = enlist(csp->headers, p);
 
-   freez(p);
 
-   return err;
-}
+/* the following functions add headers directly to the header list */
 
 
 /*********************************************************************
@@ -1376,90 +1120,50 @@ jb_err client_host_adder(struct client_state *csp)
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err client_cookie_adder(struct client_state *csp)
+void client_cookie_adder(struct client_state *csp)
 {
-   struct list_entry *lst;
-   char *tmp;
-   struct list_entry *list1 = csp->cookie_list->first;
-   struct list_entry *list2 = csp->action->multi[ACTION_MULTI_WAFER]->first;
-   int first_cookie = 1;
-   jb_err err;
-
-   if ((list1 == NULL) && (list2 == NULL))
-   {
-      /* Nothing to do */
-      return JB_ERR_OK;
-   }
+   struct list *lst;
+   char *tmp = NULL;
+   char *e;
 
-   tmp = strdup("Cookie: ");
-
-   for (lst = list1; lst ; lst = lst->next)
+   for (lst = csp->cookie_list->next; lst ; lst = lst->next)
    {
-      if (first_cookie)
-      {
-         first_cookie = 0;
-      }
-      else
+      if (tmp)
       {
-         string_append(&tmp, "; ");
+         tmp = strsav(tmp, "; ");
       }
-      string_append(&tmp, lst->str);
+      tmp = strsav(tmp, lst->str);
    }
 
-   for (lst = list2;  lst ; lst = lst->next)
+   for (lst = csp->action->multi[ACTION_MULTI_WAFER]->next;  lst ; lst = lst->next)
    {
-      if (first_cookie)
+      if (tmp)
       {
-         first_cookie = 0;
+         tmp = strsav(tmp, "; ");
       }
-      else
+
+      if ((e = cookie_encode(lst->str)))
       {
-         string_append(&tmp, "; ");
+         tmp = strsav(tmp, e);
+         freez(e);
       }
-      string_join(&tmp, cookie_encode(lst->str));
    }
 
-   if (tmp == NULL)
+   if (tmp)
    {
-      return JB_ERR_MEMORY;
-   }
-
-   log_error(LOG_LEVEL_HEADER, "addh: %s", tmp);
-   err = enlist(csp->headers, tmp);
-   free(tmp);
-   return err;
-}
+      char *ret;
 
-
-/*********************************************************************
- *
- * Function    :  client_accept_encoding_adder
- *
- * Description :  Add an Accept-Encoding header to the client's request
- *                that disables compression if the action applies, and
- *                the header is not already there. Called from `sed'.
- *                Note: For HTTP/1.0, the absence of the header is enough.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err client_accept_encoding_adder(struct client_state *csp)
-{
-   if (   ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
-       && (!strcmpic(csp->http->ver, "HTTP/1.1")) )
-   {
-      return enlist_unique(csp->headers, "Accept-Encoding: identity;q=1.0, *;q=0", 16);
+      ret = strdup("Cookie: ");
+      ret = strsav(ret, tmp);
+      log_error(LOG_LEVEL_HEADER, "addh: %s", ret);
+      enlist(csp->headers, ret);
+      freez(tmp);
+      freez(ret);
    }
 
-   return JB_ERR_OK;
 }
 
 
@@ -1472,28 +1176,19 @@ jb_err client_accept_encoding_adder(struct client_state *csp)
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err client_xtra_adder(struct client_state *csp)
+void client_xtra_adder(struct client_state *csp)
 {
-   struct list_entry *lst;
-   jb_err err;
+   struct list *lst = csp->action->multi[ACTION_MULTI_ADD_HEADER];
 
-   for (lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]->first;
-        lst ; lst = lst->next)
+   for (lst = lst->next; lst ; lst = lst->next)
    {
       log_error(LOG_LEVEL_HEADER, "addh: %s", lst->str);
-      err = enlist(csp->headers, lst->str);
-      if (err)
-      {
-         return err;
-      }
-
+      enlist(csp->headers, lst->str);
    }
 
-   return JB_ERR_OK;
 }
 
 
@@ -1506,234 +1201,105 @@ jb_err client_xtra_adder(struct client_state *csp)
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err client_x_forwarded_adder(struct client_state *csp)
+void client_x_forwarded_adder(struct client_state *csp)
 {
    char *p = NULL;
-   jb_err err;
 
    if ((csp->action->flags & ACTION_HIDE_FORWARDED) != 0)
    {
-      return JB_ERR_OK;
+      return;
    }
 
    if (csp->x_forwarded)
    {
-      p = strdup(csp->x_forwarded);
-      string_append(&p, ", ");
+      p = strsav(p, csp->x_forwarded);
+      p = strsav(p, ", ");
+      p = strsav(p, csp->ip_addr_str);
    }
    else
    {
-      p = strdup("X-Forwarded-For: ");
-   }
-   string_append(&p, csp->ip_addr_str);
-
-   if (p == NULL)
-   {
-      return JB_ERR_MEMORY;
+      p = strsav(p, "X-Forwarded-For: ");
+      p = strsav(p, csp->ip_addr_str);
    }
 
    log_error(LOG_LEVEL_HEADER, "addh: %s", p);
-   err = enlist(csp->headers, p);
-   free(p);
+   enlist(csp->headers, p);
 
-   return err;
 }
 
 
 /*********************************************************************
  *
- * Function    :  connection_close_adder
- *
- * Description :  Adds a "Connection: close" header to csp->headers
- *                as a temporary fix for the needed but missing HTTP/1.1
- *                support. Called from `sed'.
- *                FIXME: This whole function shouldn't be neccessary!
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err connection_close_adder(struct client_state *csp)
-{
-   return enlist(csp->headers, "Connection: close");
-}
-
-
-/*********************************************************************
- *
- * Function    :  server_http
+ * Function    :  server_set_cookie
  *
- * Description :  - Save the HTTP Status into csp->http->status
- *                - Set CT_TABOO to prevent filtering if the answer
- *                  is a partial range (HTTP status 206)
- *                - Rewrite HTTP/1.1 answers to HTTP/1.0 if +downgrade
- *                  action applies.
+ * Description :  Handle the server "cookie" header properly.
+ *                Log cookie to the jar file.  Then "crunch" it,
+ *                or accept it.  Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = parser pattern that matched this header
+ *          2  :  s = header that matched this pattern
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  `crumble' or a newly malloc'ed string.
  *
  *********************************************************************/
-jb_err server_http(struct client_state *csp, char **header)
+char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp)
 {
-   sscanf(*header, "HTTP/%*d.%*d %d", &(csp->http->status));
-   if (csp->http->status == 206)
+#ifdef JAR_FILES
+   if (csp->config->jar)
    {
-      csp->content_type = CT_TABOO;
+      fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1));
    }
+#endif /* def JAR_FILES */
 
-   if ((csp->action->flags & ACTION_DOWNGRADE) != 0)
+   if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0)
    {
-      (*header)[7] = '0';
-      log_error(LOG_LEVEL_HEADER, "Downgraded answer to HTTP/1.0");
+      return(crumble(v, s, csp));
    }
 
-   return JB_ERR_OK;
+   return(strdup(s));
+
 }
 
 
+#ifdef FORCE_LOAD
 /*********************************************************************
  *
- * Function    :  server_set_cookie
+ * Function    :  client_host
  *
- * Description :  Handle the server "cookie" header properly.
- *                Log cookie to the jar file.  Then "crunch" it,
- *                or accept it.  Called from `sed'.
+ * Description :  Clean the FORCE_PREFIX out of the 'host' http
+ *                header, if we use force
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to clean
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A malloc'ed pointer to the cleaned host header 
  *
  *********************************************************************/
-jb_err server_set_cookie(struct client_state *csp, char **header)
+char *client_host(const struct parsers *v, char *s, struct client_state *csp)
 {
-#ifdef FEATURE_COOKIE_JAR
-   if (csp->config->jar)
-   {
-      /*
-       * Write timestamp into outbuf.
-       *
-       * Complex because not all OSs have tm_gmtoff or
-       * the %z field in strftime()
-       */
-      char tempbuf[ BUFFER_SIZE ];
-      time_t now; 
-      struct tm tm_now; 
-      time (&now); 
-#ifdef HAVE_LOCALTIME_R
-      tm_now = *localtime_r(&now, &tm_now);
-#else
-      tm_now = *localtime (&now); 
-#endif
-      strftime(tempbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); 
-
-      /* strlen("set-cookie: ") = 12 */
-      fprintf(csp->config->jar, "%s %s\t%s\n", tempbuf, csp->http->host, *header + 12);
-   }
-#endif /* def FEATURE_COOKIE_JAR */
-
-   if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0)
-   {
-      return crumble(csp, header);
-   }
-   else if ((csp->action->flags & ACTION_NO_COOKIE_KEEP) != 0)
-   {
-      /* Flag whether or not to log a message */
-      int changed = 0;
-
-      /* A variable to store the tag we're working on */
-      char * cur_tag;
-
-      /* Skip "Set-Cookie:" (11 characters) in header */
-      cur_tag = *header + 11;
-
-      /* skip whitespace between "Set-Cookie:" and value */
-      while (*cur_tag && ijb_isspace(*cur_tag))
-      {
-         cur_tag++;
-      }
-
-      /* Loop through each tag in the cookie */
-      while (*cur_tag)
-      {
-         /* Find next tag */
-         char * next_tag = strchr(cur_tag, ';');
-         if (next_tag != NULL)
-         {
-            /* Skip the ';' character itself */
-            next_tag++;
-
-            /* skip whitespace ";" and start of tag */
-            while (*next_tag && ijb_isspace(*next_tag))
-            {
-               next_tag++;
-            }
-         }
-         else
-         {
-            /* "Next tag" is the end of the string */
-            next_tag = cur_tag + strlen(cur_tag);
-         }
-
-         /* Is this the "Expires" tag? */
-         if (strncmpic(cur_tag, "expires=", 8) == 0)
-         {
-            /* Delete the tag by copying the rest of the string over it.
-             * (Note that we cannot just use "strcpy(cur_tag, next_tag)",
-             * since the behaviour of strcpy is undefined for overlapping
-             * strings.)
-             */
-            memmove(cur_tag, next_tag, strlen(next_tag) + 1);
-
-            /* That changed the header, need to issue a log message */
-            changed = 1;
-
-            /* Note that the next tag has now been moved to *cur_tag,
-             * so we do not need to update the cur_tag pointer.
-             */
-         }
-         else
-         {
-            /* Move on to next cookie tag */
-            cur_tag = next_tag;
-         }
-      }
-
-      if (changed)
-      {
-         log_error(LOG_LEVEL_HEADER, "Changed cookie to a temporary one.");
-      }
-   }
-
-   return JB_ERR_OK;
+   char *cleanhost = strdup(s);
+   if(csp->force)
+      strclean(cleanhost, FORCE_PREFIX);
+   return(cleanhost);
 }
-
-
-#ifdef FEATURE_FORCE_LOAD
+#endif /* def FORCE_LOAD */
+#ifdef FORCE_LOAD 
 /*********************************************************************
  *
  * Function    :  strclean
  *
- * Description :  In-Situ-Eliminate all occurances of substring in
+ * Description :  In-Situ-Eliminate all occurances of substring in 
  *                string
  *
  * Parameters  :
@@ -1748,12 +1314,12 @@ int strclean(const char *string, const char *substring)
    int hits = 0, len = strlen(substring);
    char *pos, *p;
 
-   while((pos = strstr(string, substring)) != NULL)
+   while((pos = strstr(string, substring)))
    {
       p = pos + len;
       do
       {
-         *(p - len) = *p;
+         *(p - len) = *p; 
       }
       while (*p++ != '\0');
 
@@ -1762,7 +1328,7 @@ int strclean(const char *string, const char *substring)
 
    return(hits);
 }
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
 
 
 /*
index d7e104b..b68ee8d 100644 (file)
--- a/parsers.h
+++ b/parsers.h
@@ -1,6 +1,6 @@
-#ifndef PARSERS_H_INCLUDED
-#define PARSERS_H_INCLUDED
-#define PARSERS_H_VERSION "$Id: parsers.h,v 1.24 2002/03/24 13:25:43 swa Exp $"
+#ifndef _PARSERS_H
+#define _PARSERS_H
+#define PARSERS_H_VERSION "$Id: parsers.h,v 1.7 2001/06/29 13:32:14 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/parsers.h,v $
@@ -17,7 +17,7 @@
  *                   and `server_set_cookie'.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: parsers.h,v $
- *    Revision 1.24  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.23  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.22  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.21  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.20  2002/02/20 23:15:13  jongfoster
- *    Parsing functions now handle out-of-memory gracefully by returning
- *    an error code.
- *
- *    Revision 1.19  2002/01/17 21:03:47  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.18  2001/10/26 17:40:23  oes
- *    Introduced get_header_value()
- *    Removed client_accept()
- *
- *    Revision 1.17  2001/10/13 12:47:32  joergs
- *    Removed client_host, added client_host_adder
- *
- *    Revision 1.16  2001/10/07 18:50:16  oes
- *    Added server_content_encoding, renamed server_transfer_encoding
- *
- *    Revision 1.15  2001/10/07 18:01:55  oes
- *    Changed server_http11 to server_http
- *
- *    Revision 1.14  2001/10/07 15:45:48  oes
- *    added client_accept_encoding, client_te, client_accept_encoding_adder
- *
- *    renamed content_type and content_length
- *
- *    fixed client_host and strclean prototypes
- *
- *    Revision 1.13  2001/09/29 12:56:03  joergs
- *    IJB now changes HTTP/1.1 to HTTP/1.0 in requests and answers.
- *
- *    Revision 1.12  2001/09/13 23:05:50  jongfoster
- *    Changing the string paramater to the header parsers a "const".
- *
- *    Revision 1.11  2001/07/31 14:46:53  oes
- *    Added prototype for connection_close_adder
- *
- *    Revision 1.10  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.9  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.8  2001/07/13 14:01:54  oes
- *    Removed all #ifdef PCRS
- *
  *    Revision 1.7  2001/06/29 13:32:14  oes
  *    Removed logentry from cancelled commit
  *
@@ -172,44 +90,42 @@ extern "C" {
 extern const struct parsers client_patterns[];
 extern const struct parsers server_patterns[];
 
-extern const add_header_func_ptr add_client_headers[];
-extern const add_header_func_ptr add_server_headers[];
+extern void (* const add_client_headers[])(struct client_state *);
+extern void (* const add_server_headers[])(struct client_state *);
 
-extern int flush_socket(jb_socket fd, struct client_state *csp);
-extern void add_to_iob(struct client_state *csp, char *buf, int n);
+extern int flush_socket(int fd, struct client_state *csp);
+extern int add_to_iob(struct client_state *csp, char *buf, int n);
 extern char *get_header(struct client_state *csp);
-extern char *get_header_value(const struct list *header_list, const char *header_name);
-extern char *sed(const struct parsers pats[], const add_header_func_ptr more_headers[], struct client_state *csp);
-
-extern jb_err crumble                (struct client_state *csp, char **header);
-extern jb_err client_referrer        (struct client_state *csp, char **header);
-extern jb_err client_uagent          (struct client_state *csp, char **header);
-extern jb_err client_ua              (struct client_state *csp, char **header);
-extern jb_err client_from            (struct client_state *csp, char **header);
-extern jb_err client_send_cookie     (struct client_state *csp, char **header);
-extern jb_err client_x_forwarded     (struct client_state *csp, char **header);
-extern jb_err client_accept_encoding (struct client_state *csp, char **header);
-extern jb_err client_te              (struct client_state *csp, char **header);
-
-extern jb_err client_host_adder           (struct client_state *csp);
-extern jb_err client_cookie_adder         (struct client_state *csp);
-extern jb_err client_xtra_adder           (struct client_state *csp);
-extern jb_err client_accept_encoding_adder(struct client_state *csp);
-extern jb_err client_x_forwarded_adder    (struct client_state *csp);
-
-extern jb_err connection_close_adder      (struct client_state *csp); 
-
-extern jb_err server_set_cookie      (struct client_state *csp, char **header);
-extern jb_err server_content_type    (struct client_state *csp, char **header);
-extern jb_err server_content_length  (struct client_state *csp, char **header);
-extern jb_err server_content_md5     (struct client_state *csp, char **header);
-extern jb_err server_content_encoding(struct client_state *csp, char **header);
-extern jb_err server_transfer_coding (struct client_state *csp, char **header);
-extern jb_err server_http            (struct client_state *csp, char **header);
-
-#ifdef FEATURE_FORCE_LOAD
-extern int strclean(const char *string, const char *substring);
-#endif /* def FEATURE_FORCE_LOAD */
+
+extern char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp);
+
+extern void free_http_request(struct http_request *http);
+extern void parse_http_request(char *req, struct http_request *http, struct client_state *csp);
+
+extern char *crumble(const struct parsers *v, char *s, struct client_state *csp);
+
+extern char *client_referrer(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_uagent(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_ua(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_from(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp);
+extern void client_cookie_adder(struct client_state *csp);
+extern void client_xtra_adder(struct client_state *csp);
+extern void client_x_forwarded_adder(struct client_state *csp);
+extern char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp);
+
+extern char *content_type(const struct parsers *v, char *s, struct client_state *csp);
+extern char *content_length(const struct parsers *v, char *s, struct client_state *csp);
+
+#ifdef FORCE_LOAD
+char *client_host(const struct parsers *v, char *s, struct client_state *csp);
+int strclean(const char *string, const char *substring);
+#endif /* def FORCE_LOAD */
+
+#if defined(DETECT_MSIE_IMAGES)
+extern char *client_accept(const struct parsers *v, char *s, struct client_state *csp);
+#endif /* defined(DETECT_MSIE_IMAGES) */
 
 /* Revision control strings from this header and associated .c file */
 extern const char parsers_rcs[];
@@ -219,7 +135,7 @@ extern const char parsers_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef PARSERS_H_INCLUDED */
+#endif /* ndef _PARSERS_H */
 
 /*
   Local Variables:
index c767cbb..89b7ac4 100644 (file)
@@ -1,5 +1,5 @@
 
-/* For Privoxy, we just use Privoxy's config.h */
+/* For JunkBuster, we just use JunkBuster's config.h */
 
 #include "../config.h"
 
index d698f40..1dffb02 100644 (file)
@@ -17,7 +17,7 @@ make changes to pcre.in. */
 /* Win32 uses DLL by default */
 
 #ifdef _WIN32
-# ifdef STATIC_PCRE
+# ifdef STATIC
 #  define PCRE_DL_IMPORT
 # else
 #  define PCRE_DL_IMPORT __declspec(dllimport)
index 519d2dd..6aeb882 100644 (file)
@@ -251,7 +251,7 @@ if (rc == 0) rc = nmatch;    /* All captured slots were filled in */
 if (rc >= 0)
   {
   size_t i;
-  for (i = 0; i < (size_t)rc; i++)
+  for (i = 0; i < rc; i++)
     {
     pmatch[i].rm_so = ovector[i*2];
     pmatch[i].rm_eo = ovector[i*2+1];
diff --git a/pcrs.c b/pcrs.c
index 45a471b..48c78fd 100644 (file)
--- a/pcrs.c
+++ b/pcrs.c
@@ -1,80 +1,43 @@
-const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
+const char pcrs_rcs[] = "$Id: pcrs.c,v 1.8 2001/06/29 21:45:41 oes Exp $";
 
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/pcrs.c,v $
  *
- * Purpose     :  pcrs is a supplement to the pcre library by Philip Hazel
- *                <ph10@cam.ac.uk> and adds Perl-style substitution. That
- *                is, it mimics Perl's 's' operator. See pcrs(3) for details.
+ * Purpose     :  pcrs is a supplement to the brilliant pcre library by Philip
+ *                Hazel (ph10@cam.ac.uk) and adds Perl-style substitution. That
+ *                is, it mimics Perl's 's' operator.
  *
+ *                Currently, there's no documentation besides comments and the
+ *                source itself ;-)
+ *
+ *                Note: In addition to perl's options, 'U' for ungreedy and 'T'
+ *                for trivial (i.e.: ignore backrefs in the substitute) are
+ *                supported.
  *
  * Copyright   :  Written and Copyright (C) 2000, 2001 by Andreas S. Oesterhelt
  *                <andreas@oesterhelt.org>
  *
  *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU Lesser
- *                General Public License (LGPL), version 2.1, which  should
- *                be included in this distribution (see LICENSE.txt), with
- *                the exception that the permission to replace that license
- *                with the GNU General Public License (GPL) given in section
- *                3 is restricted to version 2 of the GPL.
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
  *
  *                This program is distributed in the hope that it will
  *                be useful, but WITHOUT ANY WARRANTY; without even the
  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the license for more details.
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
  *
- *                The GNU Lesser General Public License should be included
- *                with this file.  If not, you can view it at
- *                http://www.gnu.org/licenses/lgpl.html
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
  *                or write to the Free Software Foundation, Inc., 59
  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
  * Revisions   :
  *    $Log: pcrs.c,v $
- *    Revision 1.18  2002/03/08 14:17:14  oes
- *    Fixing -Wconversion warnings
- *
- *    Revision 1.17  2002/03/08 13:45:48  oes
- *    Hiding internal functions
- *
- *    Revision 1.16  2001/11/30 21:32:14  jongfoster
- *    Fixing signed/unsigned comparison (Andreas please check this!)
- *    One tab->space
- *
- *    Revision 1.15  2001/09/20 16:11:06  steudten
- *
- *    Add casting for some string functions.
- *
- *    Revision 1.14  2001/09/09 21:41:57  oes
- *    Fixing yet another silly bug
- *
- *    Revision 1.13  2001/09/06 14:05:59  oes
- *    Fixed silly bug
- *
- *    Revision 1.12  2001/08/18 11:35:00  oes
- *    - Introduced pcrs_strerror()
- *    - made some NULL arguments non-fatal
- *    - added support for \n \r \e \b \t \f \a \0 in substitute
- *    - made quoting adhere to standard rules
- *    - added warning for bad backrefs
- *    - added pcrs_execute_list()
- *    - fixed comments
- *    - bugfix & cosmetics
- *
- *    Revision 1.11  2001/08/15 15:32:03  oes
- *     - Added support for Perl's special variables $+, $' and $`
- *     - Improved the substitute parser
- *     - Replaced the hard limit for the maximum number of matches
- *       by dynamic reallocation
- *
- *    Revision 1.10  2001/08/05 13:13:11  jongfoster
- *    Making parameters "const" where possible.
- *
- *    Revision 1.9  2001/07/18 17:27:00  oes
- *    Changed interface; Cosmetics
- *
  *    Revision 1.8  2001/06/29 21:45:41  oes
  *    Indentation, CRLF->LF, Tab-> Space
  *
@@ -98,12 +61,33 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
  *    - Removed create_pcrs_job() which was useless
  *    - Fixed a bug in pcrs_execute
  *    - Success flag is now handled by pcrs instead of user
+ *    - Removed logentry from cancelled commit
  *
  *    Revision 1.6  2001/06/03 19:12:45  oes
  *    added FIXME
  *
  *    Revision 1.5  2001/05/29 09:50:24  jongfoster
- *    (Fixed one int -> size_t)
+ *    Unified blocklist/imagelist/permissionslist.
+ *    File format is still under discussion, but the internal changes
+ *    are (mostly) done.
+ *
+ *    Also modified interceptor behaviour:
+ *    - We now intercept all URLs beginning with one of the following
+ *      prefixes (and *only* these prefixes):
+ *        * http://i.j.b/
+ *        * http://ijbswa.sf.net/config/
+ *        * http://ijbswa.sourceforge.net/config/
+ *    - New interceptors "home page" - go to http://i.j.b/ to see it.
+ *    - Internal changes so that intercepted and fast redirect pages
+ *      are not replaced with an image.
+ *    - Interceptors now have the option to send a binary page direct
+ *      to the client. (i.e. ijb-send-banner uses this)
+ *    - Implemented show-url-info interceptor.  (Which is why I needed
+ *      the above interceptors changes - a typical URL is
+ *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
+ *      The previous mechanism would not have intercepted that, and
+ *      if it had been intercepted then it then it would have replaced
+ *      it with an image.)
  *
  *    Revision 1.4  2001/05/25 14:12:40  oes
  *    Fixed bug: Empty substitutes now detected
@@ -113,12 +97,48 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
  *
  *    Revision 1.2  2001/05/22 18:46:04  oes
  *
- *      Added support for PCRE_UNGREEDY behaviour to pcrs,
+ *    - Enabled filtering banners by size rather than URL
+ *      by adding patterns that replace all standard banner
+ *      sizes with the "Junkbuster" gif to the re_filterfile
+ *
+ *    - Enabled filtering WebBugs by providing a pattern
+ *      which kills all 1x1 images
+ *
+ *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
  *      which is selected by the (nonstandard and therefore
  *      capital) letter 'U' in the option string.
  *      It causes the quantifiers to be ungreedy by default.
  *      Appending a ? turns back to greedy (!).
  *
+ *    - Added a new interceptor ijb-send-banner, which
+ *      sends back the "Junkbuster" gif. Without imagelist or
+ *      MSIE detection support, or if tinygif = 1, or the
+ *      URL isn't recognized as an imageurl, a lame HTML
+ *      explanation is sent instead.
+ *
+ *    - Added new feature, which permits blocking remote
+ *      script redirects and firing back a local redirect
+ *      to the browser.
+ *      The feature is conditionally compiled, i.e. it
+ *      can be disabled with --disable-fast-redirects,
+ *      plus it must be activated by a "fast-redirects"
+ *      line in the config file, has its own log level
+ *      and of course wants to be displayed by show-proxy-args
+ *      Note: Boy, all the #ifdefs in 1001 locations and
+ *      all the fumbling with configure.in and acconfig.h
+ *      were *way* more work than the feature itself :-(
+ *
+ *    - Because a generic redirect template was needed for
+ *      this, tinygif = 3 now uses the same.
+ *
+ *    - Moved GIFs, and other static HTTP response templates
+ *      to project.h
+ *
+ *    - Some minor fixes
+ *
+ *    - Removed some >400 CRs again (Jon, you really worked
+ *      a lot! ;-)
+ *
  *    Revision 1.1.1.1  2001/05/15 13:59:02  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -128,71 +148,13 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
 
 #include <pcre.h>
 #include <string.h>
-#include <ctype.h>
-
 #include "pcrs.h"
-
 const char pcrs_h_rcs[] = PCRS_H_VERSION;
 
-/*
- * Internal prototypes
- */
-
-static int              pcrs_parse_perl_options(const char *optstring, int *flags);
-static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag,
-                        int capturecount, int *errptr);
-
-/*********************************************************************
- *
- * Function    :  pcrs_strerror
- *
- * Description :  Return a string describing a given error code.
- *             
- * Parameters  :
- *          1  :  error = the error code
- *
- * Returns     :  char * to the descriptive string
- *
- *********************************************************************/
-const char *pcrs_strerror(const int error)
-{
-   if (error < 0)
-   {
-      switch (error)
-      {
-         /* Passed-through PCRE error: */
-         case PCRE_ERROR_NOMEMORY:     return "(pcre:) No memory";
-
-         /* Shouldn't happen unless PCRE or PCRS bug, or user messed with compiled job: */
-         case PCRE_ERROR_NULL:         return "(pcre:) NULL code or subject or ovector";
-         case PCRE_ERROR_BADOPTION:    return "(pcre:) Unrecognized option bit";
-         case PCRE_ERROR_BADMAGIC:     return "(pcre:) Bad magic number in code";
-         case PCRE_ERROR_UNKNOWN_NODE: return "(pcre:) Bad node in pattern";
-
-         /* Can't happen / not passed: */
-         case PCRE_ERROR_NOSUBSTRING:  return "(pcre:) Fire in power supply"; 
-         case PCRE_ERROR_NOMATCH:      return "(pcre:) Water in power supply";
-
-         /* PCRS errors: */
-         case PCRS_ERR_NOMEM:          return "(pcrs:) No memory";
-         case PCRS_ERR_CMDSYNTAX:      return "(pcrs:) Syntax error while parsing command";
-         case PCRS_ERR_STUDY:          return "(pcrs:) PCRE error while studying the pattern";
-         case PCRS_ERR_BADJOB:         return "(pcrs:) Bad job - NULL job, pattern or substitute";
-         case PCRS_WARN_BADREF:        return "(pcrs:) Backreference out of range";
-
-         /* What's that? */
-         default:  return "Unknown error";
-      }
-   }
-   /* error >= 0: No error */
-   return "(pcrs:) Everything's just fine. Thanks for asking.";
-
-}
-
 
 /*********************************************************************
  *
- * Function    :  pcrs_parse_perl_options
+ * Function    :  pcrs_compile_perl_options
  *
  * Description :  This function parses a string containing the options to
  *                Perl's s/// operator. It returns an integer that is the
@@ -209,19 +171,16 @@ const char *pcrs_strerror(const int error)
  * Returns     :  option integer suitable for pcre 
  *
  *********************************************************************/
-static int pcrs_parse_perl_options(const char *optstring, int *flags)
+int pcrs_compile_perl_options(char *optstring, int *flags)
 {
    size_t i;
    int rc = 0;
    *flags = 0;
-
-   if (NULL == optstring) return 0;
-
-   for (i = 0; i < strlen(optstring); i++)
+   for (i=0; i < strlen(optstring); i++)
    {
       switch(optstring[i])
       {
-         case 'e': break; /* ToDo ;-) */
+         case 'e': break;
          case 'g': *flags |= PCRS_GLOBAL; break;
          case 'i': rc |= PCRE_CASELESS; break;
          case 'm': rc |= PCRE_MULTILINE; break;
@@ -229,8 +188,8 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags)
          case 's': rc |= PCRE_DOTALL; break;
          case 'x': rc |= PCRE_EXTENDED; break;
          case 'U': rc |= PCRE_UNGREEDY; break;
-         case 'T': *flags |= PCRS_TRIVIAL; break;
-         default: break;
+          case 'T': *flags |= PCRS_TRIVIAL; break;
+         default:  break;
       }
    }
    return rc;
@@ -250,11 +209,7 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags)
  * Parameters  :
  *          1  :  replacement = replacement part of s/// operator
  *                              in perl syntax
- *          2  :  trivialflag = Flag that causes backreferences to be
- *                              ignored.
- *          3  :  capturecount = Number of capturing subpatterns in
- *                               the pattern. Needed for $+ handling.
- *          4  :  errptr = pointer to an integer in which error
+ *          2  :  errptr = pointer to an integer in which error
  *                         conditions can be returned.
  *
  * Returns     :  pcrs_substitute data structure, or NULL if an
@@ -262,178 +217,89 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags)
  *                the reason.
  *
  *********************************************************************/
-static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, int capturecount, int *errptr)
+pcrs_substitute *pcrs_compile_replacement(char *replacement, int trivialflag, int *errptr)
 {
-   int i, k, l, quoted;
-   size_t length;
-   char *text;
+   int length, i, k = 0, l = 0, quoted = 0, idx;
+   char *text, *num_ptr, *numbers = "0123456789";
    pcrs_substitute *r;
 
-   i = k = l = quoted = 0;
-
-   /*
-    * Sanity check
-    */
-   if (NULL == replacement)
-   {
-      replacement = "";
-   }
+   r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute));
+   if (r == NULL) return NULL;
+   memset(r, '\0', sizeof(pcrs_substitute));
 
-   /*
-    * Get memory or fail
-    */
-   if (NULL == (r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute))))
+   text = strdup(replacement);      /* must be free()d by caller */
+   if (text  == NULL)
    {
       *errptr = PCRS_ERR_NOMEM;
+      free(r);
       return NULL;
    }
-   memset(r, '\0', sizeof(pcrs_substitute));
 
    length = strlen(replacement);
 
-   if (NULL == (text = (char *)malloc(length + 1)))
-   {
-      free(r);
-      *errptr = PCRS_ERR_NOMEM;
-      return NULL;
-   }
-   memset(text, '\0', length + 1);
-   
-
-   /*
-    * In trivial mode, just copy the substitute text
-    */
    if (trivialflag)
    {
-      text = strncpy(text, replacement, length + 1);
-      k = length;
+       k = length;
    }
-
-   /*
-    * Else, parse, cut out and record all backreferences
-    */
    else
    {
-      while (i < (int)length)
+      for (i=0; i < length; i++)
       {
-         /* Quoting */
+         /* Backslash treatment */
          if (replacement[i] == '\\')
          {
             if (quoted)
             {
-               text[k++] = replacement[i++];
+               text[k++] = replacement[i];
                quoted = 0;
             }
             else
             {
-               if (replacement[i+1] && strchr("tnrfae0", replacement[i+1]))
-               {
-                  switch (replacement[++i])
-                  {
-                  case 't':
-                     text[k++] = '\t';
-                     break;
-                  case 'n':
-                     text[k++] = '\n';
-                     break;
-                  case 'r':
-                     text[k++] = '\r';
-                     break;
-                  case 'f':
-                     text[k++] = '\f';
-                     break;
-                  case 'a':
-                     text[k++] = 7;
-                     break;
-                  case 'e':
-                     text[k++] = 27;
-                     break;
-                  case '0':
-                     text[k++] = '\0';
-                     break;
-                  }
-                  i++;
-               }
-               else
-               {
-                  quoted = 1;
-                  i++;
-               }
+               quoted = 1;
             }
             continue;
          }
 
-         /* Backreferences */
-         if (replacement[i] == '$' && !quoted && i < (int)(length - 1))
+         /* Dollar treatment */
+         if (replacement[i] == '$' && !quoted && i < length - 1)
          {
-            char *symbol, symbols[] = "'`+&";
-            r->block_length[l] = k - r->block_offset[l];
-
-            /* Numerical backreferences */
-            if (isdigit((int)replacement[i + 1]))
+            if (strchr("0123456789&", replacement[i + 1]) == NULL)
             {
-               while (i < (int)length && isdigit((int)replacement[++i]))
-               {
-                  r->backref[l] = r->backref[l] * 10 + replacement[i] - 48;
-               }
-               if (r->backref[l] > capturecount)
-               {
-                  *errptr = PCRS_WARN_BADREF;
-               }
+               text[k++] = replacement[i];
             }
-
-            /* Symbolic backreferences: */
-            else if (NULL != (symbol = strchr(symbols, replacement[i + 1])))
+            else
             {
-               
-               if (symbol - symbols == 2) /* $+ */
-               {
-                  r->backref[l] = capturecount;
-               }
-               else if (symbol - symbols == 3) /* $& */
-               {
-                  r->backref[l] = 0;
-               }
-               else /* $' or $` */
+               r->block_length[l] = k - r->block_offset[l];
+               r->backref[l] = 0;
+               if (replacement[i + 1] != '&')
                {
-                  r->backref[l] = PCRS_MAX_SUBMATCHES + 1 - (symbol - symbols);
+                  while ((num_ptr = strchr(numbers, replacement[++i])) != NULL && i < length)
+                  {
+                     idx = num_ptr - numbers;
+                     r->backref[l] = r->backref[l] * 10 + idx;
+                  }
+                  i--;
                }
-               i += 2;
-            }
-
-            /* Invalid backref -> plain '$' */
-            else
-            {
-               goto plainchar;
-            }
-
-            /* Valid and in range? -> record */
-            if (r->backref[l] < PCRS_MAX_SUBMATCHES + 2)
-            {
-               r->backref_count[r->backref[l]] += 1;
-               r->block_offset[++l] = k;
+               else
+                  i++;
+               if (r->backref[l] < PCRS_MAX_SUBMATCHES)
+                  r->backref_count[r->backref[l]] += 1;
+               l++;
+               r->block_offset[l] = k;
             }
-            else
-            {
-               *errptr = PCRS_WARN_BADREF;
-            }   
             continue;
          }
-         
-plainchar:
-         /* Plain chars are copied */
-         text[k++] = replacement[i++];
+
+         /* Plain char treatment */
+         text[k++] = replacement[i];
          quoted = 0;
       }
    } /* -END- if (!trivialflag) */
 
-   /*
-    * Finish & return
-    */
+   text[k] = '\0';
    r->text = text;
    r->backrefs = l;
    r->block_length[l] = k - r->block_offset[l];
-
    return r;
 
 }
@@ -444,7 +310,8 @@ plainchar:
  * Function    :  pcrs_free_job
  *
  * Description :  Frees the memory used by a pcrs_job struct and its
- *                dependant structures.
+ *                dependant structures. Returns a pointer to the next
+ *                job, if there was any, or NULL otherwise.
  *
  * Parameters  :
  *          1  :  job = pointer to the pcrs_job structure to be freed
@@ -477,7 +344,6 @@ pcrs_job *pcrs_free_job(pcrs_job *job)
 
 }
 
-
 /*********************************************************************
  *
  * Function    :  pcrs_free_joblist
@@ -520,16 +386,15 @@ void pcrs_free_joblist(pcrs_job *joblist)
  *                has the reason.
  *
  *********************************************************************/
-pcrs_job *pcrs_compile_command(const char *command, int *errptr)
+pcrs_job *pcrs_compile_command(char *command, int *errptr)
 {
-   int i, k, l, quoted = FALSE;
-   size_t limit;
+   int i, k, l, limit, quoted = FALSE;
    char delimiter;
    char *tokens[4];   
    pcrs_job *newjob;
-   
+
    i = k = l = 0;
-   
+
    /*
     * Tokenize the perl command
     */
@@ -541,38 +406,36 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr)
    }
    else
    {
-      delimiter = command[1];
+     delimiter = command[1];
    }
 
    tokens[l] = (char *) malloc(limit + 1);
 
-   for (i = 0; i <= (int)limit; i++)
+   for (i=0; i <= limit; i++)
    {
-      
+
       if (command[i] == delimiter && !quoted)
       {
-         if (l == 3)
-         {
-            l = -1;
+          if (l == 3)
+               {
+                  l = -1;
             break;
          }
-         tokens[0][k++] = '\0';
+          tokens[0][k++] = '\0';
          tokens[++l] = tokens[0] + k;
          continue;
       }
-      
-      else if (command[i] == '\\' && !quoted)
+
+      else if (command[i] == '\\' && !quoted && i+1 < limit && command[i+1] == delimiter)
       {
          quoted = TRUE;
-         if (command[i+1] == delimiter) continue;
-      }
-      else
-      {
-         quoted = FALSE;
+         continue;
       }
       tokens[0][k++] = command[i];
+      quoted = FALSE;
    }
 
+
    /*
     * Syntax error ?
     */
@@ -582,11 +445,11 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr)
       free(tokens[0]);
       return NULL;
    }
-   
+
    newjob = pcrs_compile(tokens[1], tokens[2], tokens[3], errptr);
    free(tokens[0]);
    return newjob;
-   
+
 }
 
 
@@ -609,20 +472,19 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr)
  *                has the reason.
  *
  *********************************************************************/
-pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr)
+pcrs_job *pcrs_compile(char *pattern, char *substitute, char *options, int *errptr)
 {
    pcrs_job *newjob;
    int flags;
-   int capturecount;
    const char *error;
 
-   *errptr = 0;
 
    /* 
     * Handle NULL arguments
     */
    if (pattern == NULL) pattern = "";
    if (substitute == NULL) substitute = "";
+   if (options == NULL) options = "";
 
 
    /* 
@@ -639,7 +501,7 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *
    /*
     * Evaluate the options
     */
-   newjob->options = pcrs_parse_perl_options(options, &flags);
+   newjob->options = pcrs_compile_perl_options(options, &flags);
    newjob->flags = flags;
 
 
@@ -667,21 +529,10 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *
    }
  
 
-   /* 
-    * Determine the number of capturing subpatterns. 
-    * This is needed for handling $+ in the substitute.
-    */
-   if (0 > (*errptr = pcre_fullinfo(newjob->pattern, newjob->hints, PCRE_INFO_CAPTURECOUNT, &capturecount)))
-   {
-      pcrs_free_job(newjob);
-      return NULL;
-   }
-
    /*
     * Compile the substitute
     */
-   if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, capturecount, errptr)))
+   if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, errptr)))
    {
       pcrs_free_job(newjob);
       return NULL;
@@ -692,73 +543,16 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *
 }
 
 
-/*********************************************************************
- *
- * Function    :  pcrs_execute_list
- *
- * Description :  This is a multiple job wrapper for pcrs_execute().
- *                Apply the regular substitutions defined by the jobs in
- *                the joblist to the subject.
- *                The subject itself is left untouched, memory for the result
- *                is malloc()ed and it is the caller's responsibility to free
- *                the result when it's no longer needed.
- *
- * Parameters  :
- *          1  :  joblist = the chained list of pcrs_jobs to be executed
- *          2  :  subject = the subject string
- *          3  :  subject_length = the subject's length 
- *                INCLUDING the terminating zero, if string!
- *          4  :  result = char** for returning  the result 
- *          5  :  result_length = size_t* for returning the result's length
- *
- * Returns     :  On success, the number of substitutions that were made.
- *                 May be > 1 if job->flags contained PCRS_GLOBAL
- *                On failiure, the (negative) pcre error code describing the
- *                 failiure, which may be translated to text using pcrs_strerror().
- *
- *********************************************************************/
-int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, char **result, size_t *result_length)
-{
-   pcrs_job *job;
-   char *old, *new;
-   int hits, total_hits;
-   old = subject;
-   *result_length = subject_length;
-   hits = total_hits = 0;
-
-   for (job = joblist; job != NULL; job = job->next)
-   {
-      hits = pcrs_execute(job, old, *result_length, &new, result_length);
-
-      if (old != subject) free(old);
-
-      if (hits < 0)
-      {
-         return(hits);
-      }
-      else
-      {
-         total_hits += hits;
-         old = new;
-      }
-   }
-
-   *result = new;
-   return(total_hits);
-
-}
-
-
 /*********************************************************************
  *
  * Function    :  pcrs_execute
  *
- * Description :  Apply the regular substitution defined by the job to the
- *                subject.
- *                The subject itself is left untouched, memory for the result
- *                is malloc()ed and it is the caller's responsibility to free
- *                the result when it's no longer needed.
+ * Description :  Modify the subject by executing the regular substitution
+ *                defined by the job. Since the result may be longer than
+ *                the subject, its space requirements are precalculated in
+ *                the matching phase and new memory is allocated accordingly.
+ *                It is the caller's responsibility to free the result when
+ *                it's no longer needed.
  *
  * Parameters  :
  *          1  :  job = the pcrs_job to be executed
@@ -766,30 +560,26 @@ int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c
  *          3  :  subject_length = the subject's length 
  *                INCLUDING the terminating zero, if string!
  *          4  :  result = char** for returning  the result 
- *          5  :  result_length = size_t* for returning the result's length
+ *          5  :  result_length = int* for returning the result's length
  *
- * Returns     :  On success, the number of substitutions that were made.
- *                 May be > 1 if job->flags contained PCRS_GLOBAL
- *                On failiure, the (negative) pcre error code describing the
- *                 failiure, which may be translated to text using pcrs_strerror().
+ * Returns     :  the number of substitutions that were made. May be > 1
+ *                if job->flags contained PCRS_GLOBAL
  *
  *********************************************************************/
-int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length)
+int pcrs_execute(pcrs_job *job, char *subject, int subject_length, char **result, int *result_length)
 {
    int offsets[3 * PCRS_MAX_SUBMATCHES],
-       offset,
-       i, k,
+       offset, i, k,
        matches_found,
-       submatches,
-       max_matches = PCRS_MAX_MATCH_INIT;
-   size_t newsize;
-   pcrs_match *matches, *dummy;
+       newsize,
+       submatches;
+   pcrs_match matches[PCRS_MAX_MATCHES];
    char *result_offset;
 
    offset = i = k = 0;
 
    /* 
-    * Sanity check & memory allocation
+    * Sanity check
     */
    if (job == NULL || job->pattern == NULL || job->substitute == NULL)
    {
@@ -797,26 +587,18 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
       return(PCRS_ERR_BADJOB);
    }
 
-   if (NULL == (matches = (pcrs_match *)malloc(max_matches * sizeof(pcrs_match))))
-   {
-      *result = NULL;
-      return(PCRS_ERR_NOMEM);
-   }
-   memset(matches, '\0', max_matches * sizeof(pcrs_match));
-
-
+   
    /*
     * Find the pattern and calculate the space
-    * requirements for the result
+    * requirements for the result (newsize)
     */
-   newsize = subject_length;
+   newsize=subject_length;
 
-   while ((submatches = pcre_exec(job->pattern, job->hints, subject, (int)subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0)
+   while ((submatches = pcre_exec(job->pattern, job->hints, subject, subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0)
    {
       job->flags |= PCRS_SUCCESS;
       matches[i].submatches = submatches;
-
-      for (k = 0; k < submatches; k++)
+      for (k=0; k < submatches; k++)
       {
          matches[i].submatch_offset[k] = offsets[2 * k];
 
@@ -829,35 +611,12 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
       /* plus replacement text size minus match text size */
       newsize += strlen(job->substitute->text) - matches[i].submatch_length[0]; 
 
-      /* chunk before match */
-      matches[i].submatch_offset[PCRS_MAX_SUBMATCHES] = 0;
-      matches[i].submatch_length[PCRS_MAX_SUBMATCHES] = offsets[0];
-      newsize += offsets[0] * job->substitute->backref_count[PCRS_MAX_SUBMATCHES];
-
-      /* chunk after match */
-      matches[i].submatch_offset[PCRS_MAX_SUBMATCHES + 1] = offsets[1];
-      matches[i].submatch_length[PCRS_MAX_SUBMATCHES + 1] = subject_length - offsets[1] - 1;
-      newsize += (subject_length - offsets[1]) * job->substitute->backref_count[PCRS_MAX_SUBMATCHES + 1];
-
-      /* Storage for matches exhausted? -> Extend! */
-      if (++i >= max_matches)
-      {
-         max_matches = (int)(max_matches * PCRS_MAX_MATCH_GROW);
-         if (NULL == (dummy = (pcrs_match *)realloc(matches, max_matches * sizeof(pcrs_match))))
-         {
-            free(matches);
-            *result = NULL;
-            return(PCRS_ERR_NOMEM);
-         }
-         matches = dummy;
-      }
-
       /* Non-global search or limit reached? */
-      if (!(job->flags & PCRS_GLOBAL)) break;
+      if (++i >= PCRS_MAX_MATCHES || !(job->flags & PCRS_GLOBAL) ) break;
 
       /* Don't loop on empty matches */
       if (offsets[1] == offset)
-         if ((size_t)offset < subject_length)
+         if (offset < subject_length)
             offset++;
          else
             break;
@@ -865,12 +624,8 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
       else
          offset = offsets[1];
    }
-   /* Pass pcre error through if (bad) failiure */
-   if (submatches < PCRE_ERROR_NOMATCH)
-   {
-      free(matches);
-      return submatches;   
-   }
+   /* Pass pcre error through if failiure */
+   if (submatches < -1) return submatches;   
    matches_found = i;
 
 
@@ -879,7 +634,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
     */
    if ((*result = (char *)malloc(newsize)) == NULL)   /* must be free()d by caller */
    {
-      free(matches);
       return PCRS_ERR_NOMEM;
    }
 
@@ -890,14 +644,14 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
    offset = 0;
    result_offset = *result;
 
-   for (i = 0; i < matches_found; i++)
+   for (i=0; i < matches_found; i++)
    {
       /* copy the chunk preceding the match */
-      memcpy(result_offset, subject + offset, (size_t)matches[i].submatch_offset[0] - offset); 
+      memcpy(result_offset, subject + offset, matches[i].submatch_offset[0] - offset); 
       result_offset += matches[i].submatch_offset[0] - offset;
 
       /* For every segment of the substitute.. */
-      for (k = 0; k <= job->substitute->backrefs; k++)
+      for (k=0; k <= job->substitute->backrefs; k++)
       {
          /* ...copy its text.. */
          memcpy(result_offset, job->substitute->text + job->substitute->block_offset[k], job->substitute->block_length[k]);
@@ -906,7 +660,7 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
          /* ..plus, if it's not the last chunk, i.e.: There *is* a backref.. */
          if (k != job->substitute->backrefs
              /* ..in legal range.. */
-             && job->substitute->backref[k] < PCRS_MAX_SUBMATCHES + 2
+             && job->substitute->backref[k] <= PCRS_MAX_SUBMATCHES
              /* ..and referencing a nonempty match.. */
              && matches[i].submatch_length[job->substitute->backref[k]] > 0)
          {
@@ -926,7 +680,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
    memcpy(result_offset, subject + offset, subject_length - offset);
 
    *result_length = newsize;
-   free(matches);
    return matches_found;
 
 }
diff --git a/pcrs.h b/pcrs.h
index a14b816..23e99e9 100644 (file)
--- a/pcrs.h
+++ b/pcrs.h
@@ -1,36 +1,31 @@
-#ifndef PCRS_H_INCLUDED
-#define PCRS_H_INCLUDED
+#ifndef _PCRS_H
+#define _PCRS_H
 
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/pcrs.h,v $
  *
- * Purpose     :  Header file for pcrs.c
+ * Purpose     :  This is the pre-pre-alpha realease of libpcrs. It is only
+ *                published at this (ugly) stage of development, because it is
+ *                needed for a new feature in JunkBuster.
  *
- * Copyright   :  see pcrs.c
+ *                Apart from the code being quite a mess, no inconsistencies,
+ *                memory leaks or functional bugs **should** be present.
  *
- * Revisions   :
- *    $Log: pcrs.h,v $
- *    Revision 1.10  2002/03/08 13:44:48  oes
- *    Hiding internal functions, preventing double inclusion of pcre.h
- *
- *    Revision 1.9  2001/08/18 11:35:29  oes
- *    - Introduced pcrs_strerror()
- *    - added pcrs_execute_list()
+ *                While you ROTFL at the code, you could just as well mail me
+ *                (oes@paradis.rhein.de) with advice for improvement.
  *
- *    Revision 1.8  2001/08/15 15:32:50  oes
- *    Replaced the hard limit for the maximum number of matches
- *    by dynamic reallocation
+ *                pcrs is a supplement to the brilliant pcre library by Philip
+ *                Hazel (ph10@cam.ac.uk) and adds Perl-style substitution. That
+ *                is, it mimics Perl's 's' operator.
  *
- *    Revision 1.7  2001/08/05 13:13:11  jongfoster
- *    Making parameters "const" where possible.
+ *                Currently, there's no documentation besides comments and the
+ *                source itself ;-)
  *
- *    Revision 1.6  2001/07/29 18:52:06  jongfoster
- *    Renaming _PCRS_H, and adding "extern C {}"
- *
- *    Revision 1.5  2001/07/18 17:27:00  oes
- *    Changed interface; Cosmetics
+ * Copyright   :  Written and copyright 2001 by Sourceforge IJBSWA team.
  *
+ * Revisions   :
+ *    $Log: pcrs.h,v $
  *    Revision 1.4  2001/06/29 13:33:19  oes
  *    - Cleaned up, commented and adapted to reflect the
  *      changes in pcrs.c
  *
  *********************************************************************/
 
-#define PCRS_H_VERSION "$Id: pcrs.h,v 1.10 2002/03/08 13:44:48 oes Exp $"
+#define PCRS_H_VERSION "$Id: pcrs.h,v 1.4 2001/06/29 13:33:19 oes Exp $"
 \f
 
-#ifndef _PCRE_H
 #include <pcre.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*
  * Constants:
@@ -78,88 +67,68 @@ extern "C" {
 #define TRUE 1
 
 /* Capacity */
-#define PCRS_MAX_SUBMATCHES  33     /* Maximum number of capturing subpatterns allowed. MUST be <= 99! FIXME: Should be dynamic */
-#define PCRS_MAX_MATCH_INIT  40     /* Initial amount of matches that can be stored in global searches */
-#define PCRS_MAX_MATCH_GROW  1.6    /* Factor by which storage for matches is extended if exhausted */
+#define PCRS_MAX_MATCHES 300
+#define PCRS_MAX_SUBMATCHES 33
 
 /* Error codes */
 #define PCRS_ERR_NOMEM     -10      /* Failed to acquire memory. */
 #define PCRS_ERR_CMDSYNTAX -11      /* Syntax of s///-command */
 #define PCRS_ERR_STUDY     -12      /* pcre error while studying the pattern */
 #define PCRS_ERR_BADJOB    -13      /* NULL job pointer, pattern or substitute */
-#define PCRS_WARN_BADREF   -14      /* Backreference out of range */
 
 /* Flags */
 #define PCRS_GLOBAL          1      /* Job should be applied globally, as with perl's g option */
-#define PCRS_TRIVIAL         2      /* Backreferences in the substitute are ignored */
-#define PCRS_SUCCESS         4      /* Job did previously match */
-
+#define PCRS_SUCCESS         2      /* Job did previously match */
+#define PCRS_TRIVIAL         4      /* Backreferences in the substitute are ignored */
 
 /*
  * Data types:
  */
 
 /* A compiled substitute */
-
-typedef struct {
-  char  *text;                                   /* The plaintext part of the substitute, with all backreferences stripped */
-  int    backrefs;                               /* The number of backreferences */
-  int    block_offset[PCRS_MAX_SUBMATCHES];      /* Array with the offsets of all plaintext blocks in text */
-  size_t block_length[PCRS_MAX_SUBMATCHES];      /* Array with the lengths of all plaintext blocks in text */
-  int    backref[PCRS_MAX_SUBMATCHES];           /* Array with the backref number for all plaintext block borders */
-  int    backref_count[PCRS_MAX_SUBMATCHES + 2]; /* Array with the number of references to each backref index */
+typedef struct PCRS_SUBSTITUTE {
+  char *text;                               /* The plaintext part of the substitute, with all backreferences stripped */
+  int backrefs;                             /* The number of backreferences */
+  int block_offset[PCRS_MAX_SUBMATCHES];    /* Array with the offsets of all plaintext blocks in text */
+  int block_length[PCRS_MAX_SUBMATCHES];    /* Array with the lengths of all plaintext blocks in text */
+  int backref[PCRS_MAX_SUBMATCHES];         /* Array with the backref number for all plaintext block borders */
+  int backref_count[PCRS_MAX_SUBMATCHES];   /* Array with the number of reference to each backref index */
 } pcrs_substitute;
 
-
-/*
- * A match, including all captured subpatterns (submatches)
- * Note: The zeroth is the whole match, the PCRS_MAX_SUBMATCHES + 0th
- * is the range before the match, the PCRS_MAX_SUBMATCHES + 1th is the
- * range after the match.
- */
-
-typedef struct {
-  int    submatches;                               /* Number of captured subpatterns */
-  int    submatch_offset[PCRS_MAX_SUBMATCHES + 2]; /* Offset for each submatch in the subject */
-  size_t submatch_length[PCRS_MAX_SUBMATCHES + 2]; /* Length of each submatch in the subject */
+typedef struct PCRS_MATCH {
+  /* char *buffer; */
+  int submatches;                           /* Number of submatches. Note: The zeroth is the whole match */
+  int submatch_offset[PCRS_MAX_SUBMATCHES]; /* Offset for each submatch in the subject */
+  int submatch_length[PCRS_MAX_SUBMATCHES]; /* Length of each submatch in the subject */
 } pcrs_match;
 
-
-/* A PCRS job */
-
 typedef struct PCRS_JOB {
   pcre *pattern;                            /* The compiled pcre pattern */
   pcre_extra *hints;                        /* The pcre hints for the pattern */
   int options;                              /* The pcre options (numeric) */
   int flags;                                /* The pcrs and user flags (see "Flags" above) */
-  pcrs_substitute *substitute;              /* The compiled pcrs substitute */
+  pcrs_substitute *substitute;              /* The compiles pcrs substitute */
   struct PCRS_JOB *next;                    /* Pointer for chaining jobs to joblists */
 } pcrs_job;
 
-
 /*
  * Prototypes:
  */
 
 /* Main usage */
-extern pcrs_job        *pcrs_compile_command(const char *command, int *errptr);
-extern pcrs_job        *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr);
-extern int              pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length);
-extern int              pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, char **result, size_t *result_length);
+extern pcrs_job        *pcrs_compile_command(char *command, int *errptr);
+extern pcrs_job        *pcrs_compile(char *pattern, char *substitute, char *options, int *errptr);
+extern int              pcrs_execute(pcrs_job *job, char *subject, int subject_length, char **result, int *result_length);
 
 /* Freeing jobs */
 extern pcrs_job        *pcrs_free_job(pcrs_job *job);
 extern void             pcrs_free_joblist(pcrs_job *joblist);
 
-/* Info on errors: */
-extern const char *pcrs_strerror(const int error);
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
+/* Expert usage */
+extern int              pcrs_compile_perl_options(char *optstring, int *flags);
+extern pcrs_substitute *pcrs_compile_replacement(char *replacement, int trivialflag, int *errptr);
 
-#endif /* ndef PCRS_H_INCLUDED */
+#endif /* ndef _PCRS_H */
 
 /*
   Local Variables:
diff --git a/privoxy-rh.spec b/privoxy-rh.spec
deleted file mode 100644 (file)
index 87c0810..0000000
+++ /dev/null
@@ -1,778 +0,0 @@
-# $Id: privoxy-rh.spec,v 1.16 2002/03/26 22:29:55 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-
-# Defines should happen in the begining of the file
-%define veryoldname junkbust
-%define oldname junkbuster
-%define privoxyconf %{_sysconfdir}/%{name}
-
-Name: privoxy
-# ATTENTION
-# Version and release should be updated acordingly on configure.in and
-# configure. Otherwise, the package can be build with the wrong value
-Version: 2.9.13
-Release: 3
-Summary: Privoxy - privacy enhancing proxy
-License: GPL
-Vendor: http://www.privoxy.org
-Source0: http://www.waldherr.org/%{name}/%{name}-%{version}.tar.gz
-BuildRoot: %{_tmppath}/%{name}-%{version}-root
-Group: Networking/Utilities
-URL: http://www.privoxy.org/
-Obsoletes: junkbuster-raw junkbuster-blank junkbuster
-# Prereq: /usr/sbin/useradd , /sbin/chkconfig , /sbin/service 
-Prereq: shadow-utils, chkconfig, initscripts, sh-utils
-BuildRequires: perl gzip sed docbook-utils libtool autoconf
-Conflicts: junkbuster-raw junkbuster-blank junkbuster
-
-%description 
-Privoxy is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. Privoxy has a very flexible configuration and
-can be customized to suit individual needs and tastes. Privoxy has application
-for both stand-alone systems and multi-user networks.
-
-Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-was originally written by JunkBusters Corporation, and was released as
-free open-source software under the GNU GPL. Stefan Waldherr made many
-improvements, and started the SourceForge project to continue
-development. Several other developers are now contributing.
-
-%prep
-%setup -q -c
-
-%build
-autoheader
-autoconf
-%configure
-make 
-make redhat-dok
-
-## Explicitily stripping is not recomended.
-## This is handled altomaticaly by RPM, and can couse troubles if
-## anyone wants to build an unstriped version - morcego
-#strip %{name}
-
-%install
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-mkdir -p %{buildroot}%{_sbindir} \
-         %{buildroot}%{_mandir}/man1 \
-         %{buildroot}%{_localstatedir}/log/%{name} \
-         %{buildroot}%{privoxyconf}/templates \
-         %{buildroot}%{_sysconfdir}/logrotate.d \
-         %{buildroot}%{_sysconfdir}/rc.d/init.d 
-
-## Manual gziping of manpages should not be done, once it can
-## break the building on some distributions. Anyway, rpm does it
-## automagicaly these days
-## Gziping the documentation files is not recomended - morcego
-#gzip README AUTHORS ChangeLog %{name}.1 || /bin/true
-
-install -s -m 744 %{name} %{buildroot}%{_sbindir}/%{name}
-
-cp -f %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1
-cp -f *.action %{buildroot}%{privoxyconf}/
-cp -f default.filter %{buildroot}%{privoxyconf}/default.filter
-cp -f trust %{buildroot}%{privoxyconf}/trust
-cp -f templates/*  %{buildroot}%{privoxyconf}/templates/
-cp -f %{name}.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
-install -m 755 %{name}.init %{buildroot}%{_sysconfdir}/rc.d/init.d/%{name}
-install -m 711 -d %{buildroot}%{_localstatedir}/log/%{name}
-
-# verify all file locations, etc. in the config file
-# don't start with ^ or commented lines are not replaced
-## Changing the sed paramter delimiter to @, so we don't have to
-## escape the slashes
-cat config | \
-    sed 's@^confdir.*@confdir %{privoxyconf}@g' | \
-#    sed 's/^permissionsfile.*/permissionsfile \/etc\/%{name}\/permissionsfile/g' | \
-#    sed 's/^filterfile.*/default.filter \/etc\/%{name}\/default.filter/g' | \
-#    sed 's/^logfile.*/logfile \%{_localstatedir}\/log\/%{name}\/logfile/g' | \
-#    sed 's/^jarfile.*/jarfile \%{_localstatedir}\/log\/%{name}\/jarfile/g' | \
-#    sed 's/^forward.*/forward \/etc\/%{name}\/forward/g' | \
-#    sed 's/^aclfile.*/aclfile \/etc\/%{name}\/aclfile/g' > \
-    sed 's@^logdir.*@logdir %{_localstatedir}/log/%{name}@g' > \
-    %{buildroot}%{privoxyconf}/config
-perl -pe 's/{-no-cookies}/{-no-cookies}\n\.redhat.com/' default.action >\
-    %{buildroot}%{privoxyconf}/default.action
-
-
-# Creating ghost init files
-mkdir -p %{buildroot}/%{_sysconfdir}/rc.d/rc{0,1,2,3,4,5,6}.d
-for i in 0 1 4 6
-do
-ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/K09%{name}
-done
-for i in 2 3 5
-do
-ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/S84%{name}
-done
-
-## Macros are expanded even on commentaries. So, we have to use %%
-## -- morcego
-#%%makeinstall
-
-%pre
-# This is where we handle old usernames (junkbust and junkbuster)
-# I'm not sure we should do that, but this is the way we have been
-# doing it for some time now -- morcego
-# We should do it for the group as well -- morcego
-# Doing it by brute force. Much cleaner (no more Mr. Nice Guy) -- morcego
-
-# Change the group name. Remove anything left behind.
-groupmod -n %{name} %{oldname} > /dev/null 2>&1 ||:
-groupmod -n %{name} %{veryoldname} > /dev/null 2>&1 ||:
-groupdel %{oldname} > /dev/null 2>&1 ||:
-groupdel %{veryoldname} > /dev/null 2>&1 ||:
-
-# Same for username
-usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{oldname} > /dev/null 2>&1 || :
-usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{veryoldname} > /dev/null 2>&1 || :
-userdel %{oldname} > /dev/null 2>&1 ||:
-userdel %{veryoldname} > /dev/null 2>&1 ||:
-
-# Check to see if everything is okey. Create user if it still does not
-# exist
-id %{name} > /dev/null 2>&1
-if [ $? -eq 1 ]; then
-       /usr/sbin/useradd -d %{_sysconfdir}/%{name} -r -s "" %{name} > /dev/null 2>&1 
-fi
-
-%post
-# for upgrade from 2.0.x
-[ -f %{_localstatedir}/log/%{oldname}/logfile ] &&\
- mv -f %{_localstatedir}/log/%{oldname}/logfile %{_localstatedir}/log/%{name}/logfile || /bin/true
-[ -f %{_localstatedir}/log/%{name}/%{name} ] &&\
- mv -f %{_localstatedir}/log/%{name}/%{name} %{_localstatedir}/log/%{name}/logfile || /bin/true
-chown -R %{name}:%{name} %{_localstatedir}/log/%{name} 2>/dev/null
-chown -R %{name}:%{name} /etc/%{name} 2>/dev/null
-if [ "$1" = "1" ]; then
-       /sbin/service %{name} condrestart > /dev/null 2>&1
-fi
-
-%preun
-/sbin/service %{veryoldname} stop > /dev/null 2>&1 ||:
-/sbin/service %{oldname} stop > /dev/null 2>&1 ||:
-
-if [ "$1" = "0" ]; then
-       /sbin/service %{name} stop > /dev/null 2>&1 ||:
-       # No need to use chkconfig. The %%ghost files will handle it
-fi
-
-%postun
-#if [ "$1" -ge "1" ]; then
-#      /sbin/service %{name} condrestart > /dev/null 2>&1
-#fi
-# We only remove it we this is not an upgrade
-if [ "$1" = "0" ]; then
-       id privoxy > /dev/null 2>&1 && /usr/sbin/userdel privoxy || /bin/true
-fi
-
-%clean
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-
-%files
-%defattr(0644,root,root,0755)
-%doc README AUTHORS ChangeLog
-%doc doc/text/developer-manual.txt doc/text/user-manual.txt
-%doc doc/webserver/developer-manual
-%doc doc/webserver/user-manual
-%doc doc/webserver/faq
-%doc doc/webserver/ijb_docs.css
-
-%dir %{privoxyconf}
-%dir %{privoxyconf}/templates
-%attr(0744,%{name},%{name}) %dir %{_localstatedir}/log/%{name}
-
-%attr(0744,%{name},%{name})%{_sbindir}/%{name}
-
-# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING !
-# We should not use wildchars here. This could mask missing files problems
-# -- morcego
-# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING !
-%config %{privoxyconf}/config
-%config %{privoxyconf}/advanced.action
-%config %{privoxyconf}/basic.action
-%config %{privoxyconf}/intermediate.action
-%config %{privoxyconf}/default.action
-%config %{privoxyconf}/default.filter
-%config %{privoxyconf}/trust
-
-%config %{privoxyconf}/templates/blocked
-%config %{privoxyconf}/templates/blocked-compact
-%config %{privoxyconf}/templates/cgi-error-404
-%config %{privoxyconf}/templates/cgi-error-bad-param
-%config %{privoxyconf}/templates/cgi-error-disabled
-%config %{privoxyconf}/templates/cgi-error-file
-%config %{privoxyconf}/templates/cgi-error-modified
-%config %{privoxyconf}/templates/cgi-error-parse
-%config %{privoxyconf}/templates/connect-failed
-%config %{privoxyconf}/templates/default
-%config %{privoxyconf}/templates/edit-actions-add-url-form
-%config %{privoxyconf}/templates/edit-actions-for-url
-%config %{privoxyconf}/templates/edit-actions-list
-%config %{privoxyconf}/templates/edit-actions-list-section
-%config %{privoxyconf}/templates/edit-actions-list-url
-%config %{privoxyconf}/templates/edit-actions-remove-url-form
-%config %{privoxyconf}/templates/edit-actions-url-form
-%config %{privoxyconf}/templates/no-such-domain
-%config %{privoxyconf}/templates/show-request
-%config %{privoxyconf}/templates/show-status
-%config %{privoxyconf}/templates/show-status-file
-%config %{privoxyconf}/templates/show-url-info
-%config %{privoxyconf}/templates/show-version
-%config %{privoxyconf}/templates/toggle
-%config %{privoxyconf}/templates/toggle-mini
-%config %{privoxyconf}/templates/untrusted
-%config %{privoxyconf}/templates/edit-actions-for-url-filter
-%config %{_sysconfdir}/logrotate.d/%{name}
-%config %attr(0744,root,root) %{_sysconfdir}/rc.d/init.d/%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc0.d/K09%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc1.d/K09%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc2.d/S84%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc3.d/S84%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc4.d/K09%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc5.d/S84%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc6.d/K09%{name}
-
-%{_mandir}/man1/%{name}.*
-
-%changelog
-* Tue Mar 25 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-3
-- Fix typo in Description.
-
-* Tue Mar 26 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ privoxy-2.9.13-3
-- Added commentary asking to update the release value on the configure
-  script
-
-* Tue Mar 25 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-3
-- Added the missing edit-actions-for-url-filter to templates.
-
-* Mon Mar 25 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ privoxy-2.9.13-2
-- Fixing Release number
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-2
-- Added faq to docs.
-
-* Sun Mar 24 2002 Rodrigo Barbosa <rodrigob@suespammers.org>
-+ privoxy-2.9.13-2
-- Fixed the init files entries. Now we use %%ghost
-- improved username (and groupname) handling on the %%pre section. By improved
-  I mean: we do it by brute force now. Much easier to maintain. Yeah, you
-  got it right. No more Mr. Nice Guy.
-- Removed the userdel call on %%post. No need, once it's complety handled on
-  the %%pre section
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-+ junkbusterng-2.9.13-1
-  Added autoheader. Added autoconf to buildrequires.
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-+ junkbusterng-2.9.13-1
-- Fixed build problems re: name conflicts with man page and logrotate.
-- Commented out rc?d/* configs for time being, which are causing a build 
-- failure. /etc/junkbuster is now /etc/privoxy. Stefan did other name 
-- changes. Fixed typo ';' should be ':' causing 'rpm -e' to fail.
-
-* Fri Mar 22 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbusterng-2.9.13-1
-- References to the expression ijb where changed where possible
-- New package name: junkbusterng (all in lower case, acording to
-  the LSB recomendation)
-- Version changed to: 2.9.13
-- Release: 1
-- Added: junkbuster to obsoletes and conflicts (Not sure this is
-  right. If it obsoletes, why conflict ? Have to check it later)
-- Summary changed: Stefan, please check and aprove it
-- Changes description to use the new name
-- Sed string was NOT changed. Have to wait to the manpage to
-  change first
-- Keeping the user junkbuster for now. It will require some aditional
-  changes on the script (scheduled for the next specfile release)
-- Added post entry to move the old logfile to the new log directory
-- Removing "chkconfig --add" entry (not good to have it automaticaly
-  added to the startup list).
-- Added preun section to stop the service with the old name, as well
-  as remove it from the startup list
-- Removed the chkconfig --del entry from the conditional block on
-  the preun scriptlet (now handled on the %files section)
-
-* Thu Mar 21 2002 Hal Burgiss <hal@foobox.net>
-- added ijb_docs.css to docs.
-
-* Mon Mar 11 2002 Hal Burgiss <hal@foobox.net>
-+ junkbuster-2.9.11-8 
-- Take out --enable-no-gifs, breaks some browsers.
-
-* Sun Mar 10 2002 Hal Burgiss <hal@foobox.net>
-+ junkbuster-2.9.11-8 
-- Add --enable-no-gifs to configure.
-
-* Fri Mar 08 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-7
-- Added BuildRequires to libtool.
-
-* Tue Mar 06 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-6
-- Changed the routined that handle the junkbust and junkbuster users on
-  %%pre and %%post to work in a smoother manner
-- %%files now uses hardcoded usernames, to avoid problems with package
-  name changes in the future
-
-* Tue Mar 05 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-5
-- Added "make redhat-dok" to the build process
-- Added docbook-utils to BuildRequires
-
-* Tue Mar 05 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-4
-- Changing man section in the manpage from 1 to 8
-- We now require packages, not files, to avoid issues with apt
-
-* Mon Mar 04 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-3
-- Fixing permissions of the init script
-
-* Mon Mar 04 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-2
-- General specfile fixup, using the best recomended practices, including:
-       - Adding -q to %%setup
-       - Using macros whereever possible
-       - Not using wildchars on %%files section
-       - Doubling the percentage char on changelog and comments, to
-         avoid rpm expanding them
-
-* Sun Mar 03 2002 Hal Burgiss <hal@foobox.net>
-- /bin/false for shell causes init script to fail. Reverting.
-
-* Wed Jan 09 2002 Hal Burgiss <hal@foobox.net>
-- Removed UID 73. Included user-manual and developer-manual in docs.
-  Include other actions files. Default shell is now /bin/false.
-  Userdel user=junkbust. ChangeLog was not zipped. Removed 
-  RPM_OPT_FLAGS kludge.
-
-* Fri Dec 28 2001 Thomas Steudten <thomas@steudten.ch>
-- add paranoia check for 'rm -rf %%{buildroot}'
-- add gzip to 'BuildRequires'
-
-* Sat Dec  1 2001 Hal Burgiss <hal@foobox.net>
-- actionsfile is now ijb.action.
-
-* Tue Nov  6 2001 Thomas Steudten <thomas@steudten.ch>
-- Compress manpage
-- Add more documents for installation
-- Add version string to name and source
-
-* Wed Oct 24 2001 Hal Burigss <hal@foobox.net>
-- Back to user 'junkbuster' and fix configure macro.
-
-* Wed Oct 10 2001 Hal Burigss <hal@foobox.net>
-- More changes for user 'junkbust'. Init script had 'junkbuster'.
-
-* Sun Sep 23 2001 Hal Burgiss <hal@foobox.net>
-- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files.
-- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise.
-
-* Thu Sep 13 2001 Hal Burgiss <hal@foobox.net>
-- Added $RPM_OPT_FLAGS support, renaming of old logfile, and 
-- made sure no default shell exists for user junkbust.
-
-* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
-- rework of RPM
-
-* Mon Sep 25 2000 Stefan Waldherr <stefan@waldherr.org>
-- CLF Logging patch by davep@cyw.uklinux.net
-- Hal DeVore <haldevore@earthling.net> fix akamaitech in blocklist
-
-* Sun Sep 17 2000 Stefan Waldherr <stefan@waldherr.org>
-- Steve Kemp skx@tardis.ed.ac.uk's javascript popup patch.
-- Markus Breitenbach breitenb@rbg.informatik.tu-darmstadt.de supplied
-  numerous fixes and enhancements for Steve's patch.
-- adamlock@netscape.com (Adam Lock) in the windows version:
-  - Taskbar activity spinner always spins even when logging is
-  turned off (which is the default) - people who don't
-  like the spinner can turn it off from a menu option.
-  - Taskbar popup menu has a options submenu - people can now
-  open the settings files for cookies, blockers etc.
-  without opening the JB window.
-  - Logging functionality works again
-  - Buffer overflow is fixed - new code uses a bigger buffer
-  and snprintf so it shouldn't overflow anymore.
-- Fixed userid swa, group learning problem while installing.
-  root must build RPM.
-- Added patch by Benjamin Low <ben@snrc.uow.edu.au> that prevents JB to
-  core dump when there is no log file.
-- Tweaked SuSE startup with the help of mohataj@gmx.net and Doc.B@gmx.de.
-- Fixed man page to include imagefile and popupfile.
-- Sanity check for the statistics function added.
-- "Patrick D'Cruze" <pdcruze@orac.iinet.net.au>: It seems Microsoft
- are transitioning Hotmail from FreeBSD/Apache to Windows 2000/IIS.
- With IIS/5, it appears to omit the trailing \r\n from http header
- only messages.  eg, when I visit http://www.hotmail.com, IIS/5
- responds with a HTTP 302 redirect header.  However, this header
- message is missing the trailing \r\n.  IIS/5 then closes the
- connection.  Junkbuster, unfortunately, discards the header becomes
- it thinks it is incomplete - and it is.  MS have transmitted an
- incomplete header!
-- Added bug reports and patch submission forms in the docs.
-
-* Mon Mar 20 2000 Stefan Waldherr <stefan@waldherr.org>
-       Andrew <anw@tirana.freewire.co.uk> extended the JB:
-       Display of statistics of the total number of requests and the number
-       of requests filtered by junkbuster, also the percentage of requests
-       filtered. Suppression of the listing of files on the proxy-args page.
-       All stuff optional and configurable.
-
-* Sun Sep 12 1999 Stefan Waldherr <stefan@waldherr.org>
-       Jan Willamowius (jan@janhh.shnet.org) fixed a bug in the 
-       code which prevented the JB from handling URLs of the form
-       user:password@www.foo.com. Fixed.
-
-* Mon Aug  2 1999 Stefan Waldherr <stefan@waldherr.org>
-       Blank images are no longer cached, thanks to a hint from Markus 
-        Breitenbach <breitenb@rbg.informatik.tu-darmstadt.de>. The user 
-        agent is NO longer set by the Junkbuster. Sadly, many sites depend 
-        on the correct browser version nowadays. Incorporated many 
-       suggestions from Jan "Yenya" Kasprzak <kas@fi.muni.cz> for the
-        spec file. Fixed logging problem and since runlevel 2 does not 
-        use networking, I replaced /etc/rc.d/rc2.d/S84junkbuster with
-        /etc/rc.d/rc2.d/K09junkbuster thanks to Shaw Walker 
-        <walker@netgate.net>. You should now be able to build this RPM as 
-        a non-root user (mathias@weidner.sem.lipsia.de).
-
-* Sun Jan 31 1999 Stefan Waldherr <stefan@waldherr.org>
-       %%{_localstatedir}/log/junkbuster set to nobody. Added /etc/junkbuster/imagelist
-       to allow more sophisticated matching of blocked images. Logrotate
-       logfile. Added files for auto-updating the blocklist et al.
-
-* Wed Dec 16 1998 Stefan Waldherr <stefan@waldherr.org>
-       Configure blank version via config file. No separate blank
-       version anymore. Added Roland's <roland@spinnaker.rhein.de>
-       patch to show a logo instead of a blank area. Added a suggestion
-       from Alex <alex@cocoa.demon.co.uk>: %%{_localstatedir}/lock/subsys/junkbuster.
-       More regexps in the blocklist. Prepared the forwardfile for
-       squid. Extended image regexp with help from gabriel 
-       <somlo@CS.ColoState.EDU>.
-
-* Thu Nov 19 1998 Stefan Waldherr <stefan@waldherr.org>
-       All RPMs now identify themselves in the show-proxy-args page.
-       Released Windoze version. Run junkbuster as nobody instead of
-       root. 
-
-* Fri Oct 30 1998 Stefan Waldherr <stefan@waldherr.org>
-       Newest version. First release (hence the little version number
-       mixture -- 2.0.2-0 instead of 2.0-7). This version tightens 
-       security over 2.0.1; some multi-user sites will need to change 
-       the listen-address in the configuration file. The blank version of
-        the Internet Junkbuster has a more sophisticated way of replacing
-       images. All RPMs identify themselves in the show-proxy-args page.
-
-* Thu Sep 23 1998 Stefan Waldherr <stefan@waldherr.org>
-       Modified the blocking feature, so that only GIFs and JPEGs are
-       blocked and replaced but not HTML pages. Thanks to 
-       "Gerd Flender" <plgerd@informatik.uni-siegen.de> for this nice
-       idea. Added numerous stuff to the blocklist. Keep patches in
-        seperate files and no longer in diffs (easier to maintain).
-
-* Tue Jun 16 1998 Stefan Waldherr <swa@cs.cmu.edu>
-        Moved config files to /etc/junkbuster directory, moved man page,
-       added BuildRoot directive (Thanks to Alexey Nogin <ayn2@cornell.edu>)
-        Made new version junkbuster-raw (which is only a stripped version of 
-        the junkuster rpm, i.e. without my blocklist, etc.)
-
-* Tue Jun 16 1998 (2.0-1)
-       Uhm, not that much. Just a new junkbuster version that
-       fixes a couple of bugs ... and of course a bigger 
-       blocklist with the unique Now-less-ads-than-ever(SM)
-       feature.
-       Oh, one thing: I changed the default user agent to Linux -- no 
-       need anymore to support Apple.
-
-* Tue Jun 16 1998 (2.0-0)
-       Now-less-ads-than-ever (SM)
-       compiled with gcc instead of cc
-       compiled with -O3, thus it should be a little faster
-       show-proxy-args now works
-       /etc/junkbuster.init wasn't necessary
-
-* Tue Jun 16 1998 (1.4)
-       some more config files were put into /etc
-       The junkbuster-blank rpm returns a 1x1 pixel image, that gets 
-       displayed by Netscape instead of the blocked image.
-       Read http://www.waldherr.org/junkbuster/ for
-       further info.
-
-* Tue Jun 16 1998 (1.3)
-       The program has been moved to /usr/sbin (from /usr/local/bin)
-       Init- and stopscripts (/etc/rc.d/rc*) have been added so
-       that the junkbuster starts automatically during bootup.
-       The /etc/blocklist file is much more sophisticated. Theoretically
-       one should e.g. browse all major US and German newspapers without
-       seeing one annoying ad.
-       junkbuster.init was modified. It now starts junkbuster with an
-       additional "-r @" flag.
-
-# $Log: privoxy-rh.spec,v $
-# Revision 1.16  2002/03/26 22:29:55  swa
-# we have a new homepage!
-#
-# Revision 1.15  2002/03/26 17:39:54  morcego
-# Adding comment on the specfile to remember the packager to update
-# the release number on the configure script
-#
-# Revision 1.14  2002/03/26 14:25:15  hal9
-# Added edit-actions-for-url-filter to templates in %%config
-#
-# Revision 1.13  2002/03/25 13:31:04  morcego
-# Bumping Release tag.
-#
-# Revision 1.12  2002/03/25 03:11:40  hal9
-# Do it right way this time :/
-#
-# Revision 1.11  2002/03/25 03:09:51  hal9
-# Added faq to docs.
-#
-# Revision 1.10  2002/03/24 22:16:14  morcego
-# Just removing some old commentaries.
-#
-# Revision 1.9  2002/03/24 22:03:22  morcego
-# Should be working now. See %changelog for details
-#
-# Revision 1.8  2002/03/24 21:13:01  morcego
-# Tis broken.
-#
-# Revision 1.7  2002/03/24 21:07:18  hal9
-# Add autoheader, etc.
-#
-# Revision 1.6  2002/03/24 19:56:40  hal9
-# /etc/junkbuster is now /etc/privoxy. Fixed ';' typo.
-#
-# Revision 1.4  2002/03/24 13:32:42  swa
-# name change related issues
-#
-# Revision 1.3  2002/03/24 12:56:21  swa
-# name change related issues.
-#
-# Revision 1.2  2002/03/24 11:40:14  swa
-# name change
-#
-# Revision 1.1  2002/03/24 11:23:44  swa
-# name change
-#
-# Revision 1.1  2002/03/22 20:53:03  morcego
-# - Ongoing process to change name to JunkbusterNG
-# - configure/configure.in: no change needed
-# - GNUmakefile.in:
-#         - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz
-#         - PROGRAM    = jbng@EXEEXT@
-#         - rh-spec now references as junkbusterng-rh.spec
-#         - redhat-upload: references changed to junkbusterng-* (package names)
-#         - tarball-dist: references changed to JunkbusterNG-distribution-*
-#         - tarball-src: now JunkbusterNG-*
-#         - install: initscript now junkbusterng.init and junkbusterng (when
-#                    installed)
-# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec
-# - junkbusterng.spec:
-#         - References to the expression ijb where changed where possible
-#         - New package name: junkbusterng (all in lower case, acording to
-#           the LSB recomendation)
-#         - Version changed to: 2.9.13
-#         - Release: 1
-#         - Added: junkbuster to obsoletes and conflicts (Not sure this is
-#           right. If it obsoletes, why conflict ? Have to check it later)
-#         - Summary changed: Stefan, please check and aprove it
-#         - Changes description to use the new name
-#         - Sed string was NOT changed. Have to wait to the manpage to
-#           change first
-#         - Keeping the user junkbuster for now. It will require some aditional
-#           changes on the script (scheduled for the next specfile release)
-#         - Added post entry to move the old logfile to the new log directory
-#         - Removing "chkconfig --add" entry (not good to have it automaticaly
-#           added to the startup list).
-#         - Added preun section to stop the service with the old name, as well
-#           as remove it from the startup list
-#         - Removed the chkconfig --del entry from the conditional block on
-#           the preun scriptlet (now handled on the %files section)
-# - junkbuster.init: renamed to junkbusterng.init
-# - junkbusterng.init:
-#         - Changed JB_BIN to jbng
-#         - Created JB_OBIN with the old value of JB_BIN (junkbuster), to
-#           be used where necessary (config dir)
-#
-# Aditional notes:
-# - The config directory is /etc/junkbuster yet. Have to change it on the
-# specfile, after it is changes on the code
-# - The only files that got renamed on the cvs tree were the rh specfile and
-# the init file. Some file references got changes on the makefile and on the
-# rh-spec (as listed above)
-#
-# Revision 1.43  2002/03/21 16:04:10  hal9
-# added ijb_docs.css to %doc
-#
-# Revision 1.42  2002/03/12 13:41:18  sarantis
-# remove hard-coded "ijbswa" string in build phase
-#
-# Revision 1.41  2002/03/11 22:58:32  hal9
-# Remove --enable-no-gifs
-#
-# Revision 1.39  2002/03/08 18:57:29  swa
-# remove user junkbuster after de-installation.
-#
-# Revision 1.38  2002/03/08 13:45:27  morcego
-# Adding libtool to Buildrequires
-#
-# Revision 1.37  2002/03/07 19:23:49  swa
-# i hate to scroll. suse: wrong configdir.
-#
-# Revision 1.36  2002/03/07 05:06:54  morcego
-# Fixed %pre scriptlet. And, as a bonus, you can even understand it now. :-)
-#
-# Revision 1.34  2002/03/07 00:11:57  morcego
-# Few changes on the %pre and %post sections of the rh specfile to handle
-# usernames more cleanly
-#
-# Revision 1.33  2002/03/05 13:13:57  morcego
-# - Added "make redhat-dok" to the build phase
-# - Added docbook-utils to BuildRequires
-#
-# Revision 1.32  2002/03/05 12:34:24  morcego
-# - Changing section internaly on the manpage from 1 to 8
-# - We now require packages, not files, to avoid issues with apt
-#
-# Revision 1.31  2002/03/04 18:06:09  morcego
-# SPECFILE: fixing permissing of the init script (broken by the last change)
-#
-# Revision 1.30  2002/03/04 16:18:03  morcego
-# General cleanup of the rh specfile.
-#
-# %changelog
-# * Mon Mar 04 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-# + junkbuster-2.9.11-2
-# - General specfile fixup, using the best recomended practices, including:
-#         - Adding -q to %%setup
-#         - Using macros whereever possible
-#         - Not using wildchars on %%files section
-#         - Doubling the percentage char on changelog and comments, to
-#           avoid rpm expanding them
-#
-# Revision 1.29  2002/03/03 19:21:22  hal9
-# Init script fails if shell is /bin/false.
-#
-# Revision 1.28  2002/01/09 18:34:03  hal9
-# nit.
-#
-# Revision 1.27  2002/01/09 18:32:02  hal9
-# Removed RPM_OPT_FLAGS kludge.
-#
-# Revision 1.26  2002/01/09 18:21:10  hal9
-# A few minor updates.
-#
-# Revision 1.25  2001/12/28 01:45:36  steudten
-# Add paranoia check and BuildReq: gzip
-#
-# Revision 1.24  2001/12/01 21:43:14  hal9
-# Allowed for new ijb.action file.
-#
-# Revision 1.23  2001/11/06 12:09:03  steudten
-# Compress doc files. Install README and AUTHORS at last as document.
-#
-# Revision 1.22  2001/11/05 21:37:34  steudten
-# Fix to include the actual version for name.
-# Let the 'real' packager be included - sorry stefan.
-#
-# Revision 1.21  2001/10/31 19:27:27  swa
-# consistent description. new name for suse since
-# we had troubles with rpms of identical names
-# on the webserver.
-#
-# Revision 1.20  2001/10/24 15:45:49  hal9
-# To keep Thomas happy (aka correcting my  mistakes)
-#
-# Revision 1.19  2001/10/15 03:23:59  hal9
-# Nits.
-#
-# Revision 1.17  2001/10/10 18:59:28  hal9
-# Minor change for init script.
-#
-# Revision 1.16  2001/09/24 20:56:23  hal9
-# Minor changes.
-#
-# Revision 1.13  2001/09/10 17:44:43  swa
-# integrate three pieces of documentation. needs work.
-# will not build cleanly under redhat.
-#
-# Revision 1.12  2001/09/10 16:25:04  swa
-# copy all templates. version updated.
-#
-# Revision 1.11  2001/07/03 11:00:25  sarantis
-# replaced permissionsfile with actionsfile
-#
-# Revision 1.10  2001/07/03 09:34:44  sarantis
-# bumped up version number.
-#
-# Revision 1.9  2001/06/12 18:15:29  swa
-# the %% in front of configure (see tag below) confused
-# the rpm build process on 7.1.
-#
-# Revision 1.8  2001/06/12 17:15:56  swa
-# fixes, because a clean build on rh6.1 was impossible.
-# GZIP confuses make, %% configure confuses rpm, etc.
-#
-# Revision 1.7  2001/06/11 12:17:26  sarantis
-# fix typo in %%post
-#
-# Revision 1.6  2001/06/11 11:28:25  sarantis
-# Further optimizations and adaptations in the spec file.
-#
-# Revision 1.5  2001/06/09 09:14:11  swa
-# shamelessly adapted RPM stuff from the newest rpm that
-# RedHat provided for the JB.
-#
-# Revision 1.4  2001/06/08 20:54:18  swa
-# type with status file. remove forward et. al from file list.
-#
-# Revision 1.3  2001/06/07 17:28:10  swa
-# cosmetics
-#
-# Revision 1.2  2001/06/04 18:31:58  swa
-# files are now prefixed with either `confdir' or `logdir'.
-# `make redhat-dist' replaces both entries confdir and logdir
-# with redhat values
-#
-# Revision 1.1  2001/06/04 10:44:57  swa
-# `make redhatr-dist' now works. Except for the paths
-# in the config file.
-#
-#
-#
diff --git a/privoxy-suse.spec b/privoxy-suse.spec
deleted file mode 100644 (file)
index 39aa6e0..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-# $Id: privoxy-suse.spec,v 1.6 2002/03/26 22:29:55 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-
-# do not set to %{name}
-%define ijbconf %{_sysconfdir}/privoxy
-
-Summary:      Privoxy - privacy enhancing proxy
-Vendor:       http://www.privoxy.org
-Name:         privoxy-suse
-Distribution: defineme
-Version: 2.9.13
-Release: 1
-Source: http://www.waldherr.org/%{name}/privoxy-%{version}.tar.gz
-# not sure if this works
-BuildRoot: %{_tmppath}/%{name}-%{version}-root
-Packager:     Stefan Waldherr <stefan@waldherr.org>
-Copyright:    GPL
-Group:        Networking/Utilities
-URL:          http://www.privoxy.org/
-Provides:     privoxy
-Obsoletes:    privoxy
-Autoreqprov:  on
-BuildRequires: perl gzip docbktls libtool
-Conflicts: junkbuster-raw junkbuster-blank junkbuster
-
-#
-# -----------------------------------------------------------------------------
-#
-%description
-Privoxy is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. Privoxy has a very flexible configuration and
-can be customized to suit individual needs and tastes. Privoxy has 
-application for both stand-alone systems and multi-user networks.
-
-Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-was originally written by JunkBusters Corporation, and was released as
-free open-source software under the GNU GPL. Stefan Waldherr made many
-improvements, and started the SourceForge project to continue
-development. Several other developers are now contributing.
-
-Authors:
---------
-    http://www.privoxy.org/
-
-SuSE series: n
-
-#
-# -----------------------------------------------------------------------------
-#
-%prep
-%setup -c
-
-#
-# -----------------------------------------------------------------------------
-#
-%build
-autoheader
-autoconf
-./configure
-make
-make dok
-
-## Explicitily stripping is not recomended.
-## This is handled altomaticaly by RPM, and can couse troubles if
-## anyone wants to build an unstriped version - morcego
-#strip privoxy
-
-#
-# -----------------------------------------------------------------------------
-#
-%install
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
-mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} \
-         ${RPM_BUILD_ROOT}%{_mandir}/man8 \
-         ${RPM_BUILD_ROOT}/var/log/privoxy \
-         ${RPM_BUILD_ROOT}%{ijbconf}/templates \
-         ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d \
-         ${RPM_BUILD_ROOT}%{_sysconfdir}/init.d
-gzip README AUTHORS ChangeLog privoxy.1 || /bin/true
-install -s -m 744 privoxy $RPM_BUILD_ROOT%{_sbindir}/privoxy
-cp -f privoxy.1.gz $RPM_BUILD_ROOT%{_mandir}/man8/privoxy.8.gz
-cp -f *.action $RPM_BUILD_ROOT%{ijbconf}/
-cp -f default.filter $RPM_BUILD_ROOT%{ijbconf}/default.filter
-cp -f trust $RPM_BUILD_ROOT%{ijbconf}/trust
-cp -f templates/*  $RPM_BUILD_ROOT%{ijbconf}/templates/
-cp -f privoxy.logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/privoxy
-install -m 755 privoxy.init.suse $RPM_BUILD_ROOT%{_sysconfdir}/init.d/privoxy
-install -m 711 -d $RPM_BUILD_ROOT/var/log/privoxy
-ln -sf /etc/init.d/privoxy $RPM_BUILD_ROOT/usr/sbin/rcprivoxy
-
-# verify all file locations, etc. in the config file
-# don't start with ^ or commented lines are not replaced
-cat config | \
-    sed 's/^confdir.*/confdir \/etc\/privoxy/g' | \
-#    sed 's/^permissionsfile.*/permissionsfile \/etc\/privoxy\/permissionsfile/g' | \
-#    sed 's/^filterfile.*/default.filter \/etc\/privoxy\/default.filter/g' | \
-#    sed 's/^logfile.*/logfile \/var\/log\/privoxy\/logfile/g' | \
-#    sed 's/^jarfile.*/jarfile \/var\/log\/privoxy\/jarfile/g' | \
-#    sed 's/^forward.*/forward \/etc\/privoxy\/forward/g' | \
-#    sed 's/^aclfile.*/aclfile \/etc\/privoxy\/aclfile/g' > \
-    sed 's/^logdir.*/logdir \/var\/log\/privoxy/g' > \
-    $RPM_BUILD_ROOT%{ijbconf}/config
-
-#
-# -----------------------------------------------------------------------------
-#
-%pre
-# We check to see if the user privoxy exists.
-# If it does, we do nothing
-# If we don't, we check to see if the user junkbust exist and, in case it
-# does, we change it do privoxy. If it also does not exist, we create the
-# privoxy user -- morcego
-id privoxy > /dev/null 2>&1 
-if [ $? -eq 1 ]; then
-       id junkbust > /dev/null 2>&1 
-       if [ $? -eq 0 ]; then
-               /usr/sbin/usermod -l privoxy -d %{_sysconfdir}/privoxy -s "" junkbust  > /dev/null 2>&1
-       else
-# -r does not work on suse.
-               /usr/sbin/groupadd privoxy
-               /usr/sbin/useradd -d %{_sysconfdir}/privoxy -g privoxy -s "" privoxy > /dev/null 2>&1 
-       fi
-fi
-
-#
-# -----------------------------------------------------------------------------
-#
-%post
-[ -f /var/log/privoxy/privoxy ] &&\
- mv -f /var/log/privoxy/privoxy /var/log/privoxy/logfile || /bin/true
-chown -R privoxy:privoxy /var/log/privoxy 2>/dev/null
-chown -R privoxy:privoxy /etc/privoxy 2>/dev/null
-# not available on suse
-#if [ "$1" = "1" ]; then
-#     /sbin/chkconfig --add privoxy
-#      /sbin/service privoxy condrestart > /dev/null 2>&1
-#fi
-# 01/09/02 HB, getting rid of any user=junkbust
-# Changed by morcego to use the id command.
-id junkbust > /dev/null 2>&1 && /usr/sbin/userdel junkbust || /bin/true
-sbin/insserv etc/init.d/privoxy
-
-#
-# -----------------------------------------------------------------------------
-#
-%preun
-# need to stop the service on suse. swa.
-#if [ "$1" = "0" ]; then
-#      /sbin/service privoxy stop > /dev/null 2>&1 ||:
-#fi
-
-#
-# -----------------------------------------------------------------------------
-#
-%postun
-sbin/insserv etc/init.d/
-# dont forget to remove user and group privoxy
-id privoxy > /dev/null 2>&1 && /usr/sbin/userdel privoxy || /bin/true
-
-#
-# -----------------------------------------------------------------------------
-#
-%clean
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
-
-#
-# -----------------------------------------------------------------------------
-#
-%files
-%defattr(-,root,root)
-%doc README.gz AUTHORS.gz ChangeLog.gz
-%doc doc/webserver/developer-manual doc/webserver/user-manual
-%doc doc/webserver/user-manual
-%doc doc/webserver/faq
-%doc doc/webserver/ijb_docs.css
-#%doc privoxy.weekly privoxy.monthly AUTHORS
-%dir %{ijbconf}
-%config %{ijbconf}/*
-%attr(0744,privoxy,privoxy) %dir /var/log/privoxy
-%config %{_sysconfdir}/logrotate.d/privoxy
-%attr(0755,root,root)/usr/sbin/privoxy
-%{_mandir}/man8/*
-%config %{_sysconfdir}/init.d/privoxy
-/usr/sbin/rcprivoxy
-
-#
-# -----------------------------------------------------------------------------
-#
-%changelog
-* Tue Mar 25 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-3
-- Minor fix to description.
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-- added faq to docs.
-
-* Thu Mar 21 2002 Hal Burgiss <hal@foobox.net>
-- added ijb_docs.css to docs.
-
-* Mon Mar 11 2002 Hal Burgiss <hal@foobox.net>
-- Remove --enable-no-gifs from configure.
-
-* Sun Mar 03 2002 Hal Burgiss <hal@foobox.net>
-- /bin/false for shell causes init script to fail. Reverting.
-
-* Wed Jan 09 2002 Hal Burgiss <hal@foobox.net>
-- Removed UID 73. Included user-manual and developer-manual in docs.
-  Include other actions files. Default shell is now /bin/false.
-  Userdel user=junkbust. ChangeLog was not zipped. Removed
-  RPM_OPT_FLAGS kludge.
-
-* Fri Dec 28 2001 Thomas Steudten <thomas@steudten.ch>
-- add paranoia check for 'rm -rf $RPM_BUILD_ROOT'
-- add gzip to 'BuildRequires'
-
-* Sat Dec  1 2001 Hal Burgiss <hal@foobox.net>
-- actionsfile is now ijb.action.
-
-* Tue Nov  6 2001 Thomas Steudten <thomas@steudten.ch>
-- Compress manpage
-- Add more documents for installation
-- Add version string to name and source
-
-* Wed Oct 24 2001 Hal Burigss <hal@foobox.net>
-- Back to user 'junkbuster' and fix configure macro.
-
-* Wed Oct 10 2001 Hal Burigss <hal@foobox.net>
-- More changes for user 'junkbust'. Init script had 'junkbuster'.
-
-* Sun Sep 23 2001 Hal Burgiss <hal@foobox.net>
-- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files.
-- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise.
-
-* Thu Sep 13 2001 Hal Burgiss <hal@foobox.net>
-- Added $RPM_OPT_FLAGS support, renaming of old logfile, and
-- made sure no default shell exists for user junkbust.
-
-* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
-- rework of RPM
-* Wed Feb 14 2001 - uli@suse.de
-- fixed init script
-* Wed Dec 06 2000 - bjacke@suse.de
-- renamed package to junkbuster
-- fixed copyright tag
-* Thu Nov 30 2000 - uli@suse.de
-- moved init script to /etc/init.d
-* Wed Feb 16 2000 - kukuk@suse.de
-- Move /usr/man -> /usr/share/man
-- Mark /etc/ijb as "config(noreplace)"
-* Mon Sep 20 1999 - uli@suse.de
-- fixed init script
-* Mon Sep 13 1999 - bs@suse.de
-- ran old prepare_spec on spec file to switch to new prepare_spec.
-* Thu Apr 01 1999 - daniel@suse.de
-- do not start ijb as root (security)
-* Tue Mar 30 1999 - daniel@suse.de
-- don´t use saclfile.ini
-* Tue Mar 30 1999 - daniel@suse.de
-- small fix to whitelist-configuration,
-  version is and was 2.0.2 WITHOUT Stefan Waldherr's patches
-  (http://www.waldherr.org/junkbuster/)
-* Mon Mar 01 1999 - daniel@suse.de
-- new package: version 2.0
-
-# $Log: privoxy-suse.spec,v $
-# Revision 1.6  2002/03/26 22:29:55  swa
-# we have a new homepage!
-#
-# Revision 1.5  2002/03/25 03:10:50  hal9
-# Added faq to docs.
-#
-# Revision 1.4  2002/03/24 12:56:21  swa
-# name change related issues.
-#
-# Revision 1.3  2002/03/24 12:44:31  swa
-# new version string
-#
-# Revision 1.2  2002/03/24 11:40:14  swa
-# name change
-#
-# Revision 1.1  2002/03/24 11:23:44  swa
-# name change
-#
-# Revision 1.21  2002/03/21 16:04:33  hal9
-# added ijb_docs.css to %%doc
-#
-# Revision 1.20  2002/03/12 13:42:14  sarantis
-# remove hardcoded "ijbswa" from build phase
-#
-# Revision 1.19  2002/03/11 22:59:05  hal9
-# Remove --enable-no-gifs
-#
-# Revision 1.18  2002/03/11 12:30:31  swa
-# be consistent with rh spec file
-#
-# Revision 1.17  2002/03/08 19:30:23  swa
-# remove user junkbuster after de-installation.
-# synced suse with rh-specfile. installation
-# and de-installation seem to work.
-#
-# Revision 1.16  2002/03/08 18:40:44  swa
-# build requires tools. useradd and del works
-# now.
-#
-# Revision 1.15  2002/03/07 19:23:50  swa
-# i hate to scroll. suse: wrong configdir.
-#
-# Revision 1.14  2002/03/07 19:10:21  swa
-# builds cleanly. thanks to kukuk@suse.de
-# not yet tested.
-#
-# Revision 1.13  2002/03/07 18:25:56  swa
-# synced redhat and suse build process
-#
-# Revision 1.12  2002/03/02 15:50:04  swa
-# 2.9.11 version. more input for docs.
-#
-# Revision 1.11  2001/12/02 10:29:26  swa
-# New version made these changes necessary.
-#
-# Revision 1.10  2001/10/31 19:27:27  swa
-# consistent description. new name for suse since
-# we had troubles with rpms of identical names
-# on the webserver.
-#
-# Revision 1.9  2001/10/26 18:17:23  swa
-# new version string
-#
-# Revision 1.8  2001/09/13 16:22:42  swa
-# man page is legacy. suse rpm now contains html
-# documentation.
-#
-# Revision 1.7  2001/09/10 17:44:22  swa
-# integrate three pieces of documentation.
-#
-# Revision 1.6  2001/09/10 16:29:23  swa
-# binary contained debug info.
-# buildroot definition fucks up the build process under suse.
-# program needs to write in varlogjunkbuster
-# install all templates
-# create varlogjunkbuster
-#
-# Revision 1.5  2001/06/09 09:13:29  swa
-# description shorter
-#
-# Revision 1.4  2001/06/08 20:53:36  swa
-# use buildroot, export init to separate file (better manageability)
-#
-# Revision 1.3  2001/06/07 17:28:10  swa
-# cosmetics
-#
-# Revision 1.2  2001/06/07 17:18:44  swa
-# header fixed
-#
-#
diff --git a/privoxy.1 b/privoxy.1
deleted file mode 100644 (file)
index 0afd892..0000000
--- a/privoxy.1
+++ /dev/null
@@ -1,334 +0,0 @@
-.\" Revised man page 10/13/01, for development version.
-.\" Hal Burgiss <hal@foobox.net> 
-.\" for Privoxy developers: ijbswa-developers@lists.sourceforge.net
-.\"
-.TH PRIVOXY 1 "v2.9.13 (beta) Date: 2002/03/24"
-
-.SH NAME
-\fBprivoxy\fP
-- Privacy enhancing
-Proxy
-.\"\s-2(TM)\s+2
-.SH SYNOPSIS
-\fBprivoxy\fP
-[--help] [--version] [--no-daemon] [--pidfile \fIpidfile\fP] [--user \fIuser\fP[.\fIgroup\fP]] 
-\fI\&[configfile]\fP (Unix)
-.TP
-\fBprivoxy.exe\fP \fI[configfile]\fP (Windows)
-.br
-
-.SH OPTIONS
-\fBPrivoxy\fP may be invoked with the following command-line options:
-.TP
-.BR --version " (unix only)"
-Print version info and exit.
-.TP
-.BR --help " (unix only)"
-Print a short usage info and exit.
-.TP
-.BR --no-daemon " (unix only)"
-Don't become a daemon, i.e. don't fork and become process group
-leader, don't detach from controlling tty, and do all logging
-there.
-.TP
-\fB --pidfile\fP \fIpidfile\fP (unix only)
-On startup, write the process ID to \fIpidfile\fP. Delete the
-\fIpidfile\fP on exit. Failiure to create or delete the
-\fIpidfile\fP is non-fatal. If no \fB--pidfile\fP option
-is given, no PID file will be used.
-.TP
-\fB --user\fP \fIuser\fP[.\fIgroup\fP] (unix only)
-After (optionally) writing the PID file, assume the user ID
-of \fIuser\fP and the GID of \fIgroup\fP, or, if the optional
-\fIgroup\fP was not given, the default group of \fIuser\fP.
-Exit if the privileges are not sufficient to do so.
-
-.PP
-If the \fIconfigfile\fP is not specified on the command line,
-\fBPrivoxy\fP will look for a file named \fBconfig\fP in the 
-current directory (except on Win32 where it will try \fBconfig.txt\fP).
-
-
-.SH DESCRIPTION
-\fBPrivoxy\fP is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. \fBPrivoxy\fP has a very flexible configuration and
-can be customized to suit individual needs and tastes. \fBPrivoxy\fP has
-application for both stand-alone systems and multi-user networks.
-.PP
-\fBPrivoxy\fP is based on code of the \fBInternet Junkbuster (tm)\fP 
-\fBJunkbuster\fP was originally written by JunkBusters Corporation, and was
-released as free open-source software under the GNU GPL. Stefan Waldherr made
-many improvements, and started the SourceForge project to continue
-development.
-
-.SH INSTALLATION AND USE
-Browsers must be individually configured to use 
-\fBPrivoxy\fP as a HTTP proxy.
-The default setting is for localhost, 
-on port 8118 (configurable in the main config file).
-To set the 
-\s-2HTTP\s0
-proxy in Netscape and Mozilla,
-go through:
-\fB\&Edit\fP;
-\fB\&Preferences\fP;
-\fB\&Advanced\fP;
-\fB\&Proxies\fP;
-\fB\&Manual Proxy Configuration\fP;
-\fB\&View\fP.
-.PP
-For Internet Explorer,
-go through:
-\fB\&Tools\fP;
-\fB\&Internet Properties\fP;
-\fB\&Connections\fP;
-\fB\&LAN Settings\fP.
-.PP
-The
-Secure (SSL) Proxy \" ijbfaq.html#security
-should also be set to the same values,
-otherwise
-\fB\&https:\fP
-\s-2URL\s0s
-will not be proxied.
-.PP
-For other browsers, check the documentation.
-
-.SH CONFIGURATION
-\fBPrivoxy\fP can be configured with the various configuration 
-files. The default configuration files are: \fIconfig\fP, 
-\fIdefault.action\fP, and \fIdefault.filter\fP. These are well commented. 
-On Unix and Unix-like systems, these are located in \fI/etc/privoxy/\fP 
-by default. On Windows, OS/2 and AmigaOS, these files are in the same directory 
-as the \fBPrivoxy\fP executable. 
-.PP
-The name and number of configuration files has changed from previous versions,
-and is subject to change as development progresses. In fact, the configuration
-itself is changed and much more sophisticated. See the user-manual for a brief
-explanation of all configuration options.
-.PP
-The actions list (ad blocks, etc) can also be configured with your 
-web browser at \fIhttp://www.privoxy.org/config\fP.
-\fBPrivoxy's\fP configuration parameters can also be viewed 
-at the same page. In addition, \fBPrivoxy\fP can be toggled on/off.
-This is an internal page. 
-
-.SH "SAMPLE CONFIGURATION"
-.PP
-A brief example of what a \fIdefault.action\fP configuration might look like:
-.PP
-.nf
-
-# Define a few useful custom aliases for later use
-{{alias}}
-
-# Don't accept cookies
-+no-cookies = +no-cookies-set +no-cookies-read
-
-# Do accept cookies
--no-cookies = -no-cookies-set -no-cookies-read
-
-# Treat these blocked URLs as images.
-+imageblock = +block +image
-
-# Define page filters we want to use.
-myfilters = +filter{html-annoyances} +filter{js-annoyances}\\
-            +filter{no-popups} +filter{webbugs}
-
-## Default Policies (actions) ############################
-{ \\
- -block \\
- -downgrade \\
- +fast-redirects \\
- myfilters \\
- +no-compression \\
- +hide-forwarded \\
- +hide-from{block} \\
- +hide-referer{forge} \\
- -hide-user-agent \\
- -image \\
- +image-blocker{blank} \\
- +no-cookies-keep \\
- -no-cookies-read \\
- -no-cookies-set \\
- +no-popups \\
- -vanilla-wafer \\
- -wafer \\
-}
-/
-
-# Now set exceptions to the above defined policies #######
-
-# Sites where we want persistant cookies
-{-no-cookies -no-cookies-keep}
- .redhat.com
- .sun.com
- .yahoo.com
- .msdn.microsoft.com
-
-# This site requires cookies AND 'fast-redirects' on
-{-no-cookies -no-cookies-keep -fast-redirects}
- .nytimes.com
-
-# Add custom headers, and turn off filtering of page source
-{+add-header{X-Privacy: Yes please} #-add-header{*} \\
- +add-header{X-User-Tracking: No thanks!} -filter}
- privacy.net
-
-# Block, and treat these URLs as 'images'.
-{+imageblock}
- .adforce.imgis.com
- .ad.preferences.com/image.*
- .ads.web.aol.com
- .ad-adex3.flycast.com
- .ad.doubleclick.net
- .ln.doubleclick.net
- .ad.de.doubleclick.net
- /.*/count\\.cgi\\?.*df=
- 194.221.183.22[1-7]
- a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/
-
-# Block any URLs that match these patterns
-{+block}
- /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\\.(gif|jpe?g))
- /.*/(plain|live|rotate)[-_.]?ads?/
- /.*/(sponsor)s?[0-9]?/
- /.*/ad(server|stream|juggler)\\.(cgi|pl|dll|exe)
- /.*/adbanners/
- /.*/adv((er)?ts?|ertis(ing|ements?))?/
- /.*/banners?/
- /.*/popupads/
- /.*/advert[0-9]+\\.jpg
- /ad_images/
- /.*/ads/
- /images/.*/.*_anim\\.gif
- /rotations/ 
- /.*(ms)?backoff(ice)?.*\\.(gif|jpe?g)
- 195.63.104.*/(inbox|log|meld|folderlu|folderru|log(in|out)[lmr]u|)
- .images.nytimes.com
- .images.yahoo.com/adv/
- /.*cnnstore\\.gif
-
-.fi
-.sp
-.PP
-See the comments in the configuration files themselves, or the user-manual 
-for explanations of the above syntax, and other \fBPrivoxy\fP configuration 
-options.
-
-.SH "FILES"
-\fI/usr/sbin/privoxy\fP
-.br
-\fI/etc/privoxy/config\fP
-.br
-\fI/etc/privoxy/default.action\fP
-.br
-\fI/etc/privoxy/advanced.action\fP
-.br
-\fI/etc/privoxy/basic.action\fP
-.br
-\fI/etc/privoxy/intermediate.action\fP
-.br
-\fI/etc/privoxy/default.filter\fP
-.br
-\fI/etc/privoxy/trust\fP
-.br
-\fI/etc/privoxy/templates/*\fP
-.br
-\fI/var/log/privoxy/logfile\fP
-
-.PP
-Various other files should be included, but may vary depending on platform 
-and build configuration. More documentation should be included in the local
-documentation directory, though is not complete at this time.
-
-.SH SIGNALS
-\fBPrivoxy\fP terminates on the \fBSIGINT\fP, \fBSIGTERM\fP and \fBSIGABRT\fP
-signals. Log rotation scripts may cause a re-opening of the logfile by sending
-a \fBSIGHUP\fP to \fBPrivoxy\fP. Note that unlike other daemons, \fBPrivoxy\fP
-does not need to be made aware of config file changes by \fBSIGHUP\fP -- it will
-detect them automatically.
-.SH NOTES
-This is a \fBBETA\fP version of \fBPrivoxy\fP. Not all features are  
-complete or well tested.
-.PP
-Please see the user-maual on how to contact the developers for 
-feature requests, reporting problems, and other questions.
-
-.SH BUGS
-Probably. Please see the user-manual for how and where to report bugs.
-
-.SH SEE ALSO
-.br
-http://www.privoxy.org/config
-.br
-http://www.privoxy.org/
-.br
-http://sourceforge.net/projects/ijbswa
-.br
-http://www.waldherr.org/junkbuster/\" waldherr.org#
-.br
-http://www.junkbusters.com/ht/en/cookies.html\" cookies.html#
-.br
-http://privacy.net/analyze/
-.br
-http://www.squid-cache.org/
-.br
-http://linuxalpha.ch/packages/
-
-.SH DEVELOPMENT TEAM
-.br
- Stefan Waldherr 
-.br
- Andreas Oesterhelt 
-.br
- Jon Foster 
-.br
- Markus Breitenbach
-.br
- Thomas Steudten
-.br
- David Schmidt
-.br
- Haroon Rafique
-.br
- Joerg Strohmayer
-.br
- Shamim Mohamed
-.br
- Sarantis Paskalis
-.br
- Gabriel L. Somlo
-.br
- John Venvertloh
-.br
- Hal Burgiss
-.br
- Rodrigo Barbosa
-
-.SH COPYRIGHT AND LICENSE
-\"Orginally written by, and copyrighted by, the Anonymous Coders and Junkbusters
-\"Corporation. 
-\".PP
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-.PP
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-.PP
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-.PP
-Internet Junkbuster
-Proxy
-is a
-trademark \" legal.html#marks
-of Junkbusters Corporation.
diff --git a/privoxy.init b/privoxy.init
deleted file mode 100644 (file)
index a835405..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-#  ********************************************************************
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.init,v $
-# 
-#  Purpose     :  This shell script takes care of starting and stopping
-#                 privoxy.
-# 
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
-# 
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-# 
-#                 This program is free software; you can redistribute it
-#                 and/or modify it under the terms of the GNU General
-#                 Public License as published by the Free Software
-#                 Foundation; either version 2 of the License, or (at
-#                 your option) any later version.
-# 
-#                 This program is distributed in the hope that it will
-#                 be useful, but WITHOUT ANY WARRANTY; without even the
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                 PARTICULAR PURPOSE.  See the GNU General Public
-#                 License for more details.
-# 
-#                 The GNU General Public License should be included with
-#                 this file.  If not, you can view it at
-#                 http://www.gnu.org/copyleft/gpl.html
-#                 or write to the Free Software Foundation, Inc., 59
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-# 
-#  Revisions   :
-#     $Log: privoxy.init,v $
-#     Revision 1.5  2002/03/25 06:14:18  morcego
-#     Removing the OPRG definition (no longer needed)
-#
-#     Revision 1.4  2002/03/25 04:16:48  hal9
-#     Fix proper config file location.
-#
-#     Revision 1.3  2002/03/24 19:12:15  hal9
-#     Fixed some naming conflicts.
-#
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.1  2002/03/22 20:53:03  morcego
-#     - Ongoing process to change name to JunkbusterNG
-#     - configure/configure.in: no change needed
-#     - GNUmakefile.in:
-#             - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz
-#             - PROGRAM    = jbng@EXEEXT@
-#             - rh-spec now references as junkbusterng-rh.spec
-#             - redhat-upload: references changed to junkbusterng-* (package names)
-#             - tarball-dist: references changed to JunkbusterNG-distribution-*
-#             - tarball-src: now JunkbusterNG-*
-#             - install: initscript now junkbusterng.init and junkbusterng (when
-#                        installed)
-#     - junkbuster-rh.spec: renamed to junkbusterng-rh.spec
-#     - junkbusterng.spec:
-#             - References to the expression ijb where changed where possible
-#             - New package name: junkbusterng (all in lower case, acording to
-#               the LSB recomendation)
-#             - Version changed to: 2.9.13
-#             - Release: 1
-#             - Added: junkbuster to obsoletes and conflicts (Not sure this is
-#               right. If it obsoletes, why conflict ? Have to check it later)
-#             - Summary changed: Stefan, please check and aprove it
-#             - Changes description to use the new name
-#             - Sed string was NOT changed. Have to wait to the manpage to
-#               change first
-#             - Keeping the user junkbuster for now. It will require some aditional
-#               changes on the script (scheduled for the next specfile release)
-#             - Added post entry to move the old logfile to the new log directory
-#             - Removing "chkconfig --add" entry (not good to have it automaticaly
-#               added to the startup list).
-#             - Added preun section to stop the service with the old name, as well
-#               as remove it from the startup list
-#             - Removed the chkconfig --del entry from the conditional block on
-#               the preun scriptlet (now handled on the %files section)
-#     - junkbuster.init: renamed to junkbusterng.init
-#     - junkbusterng.init:
-#             - Changed JB_BIN to jbng
-#             - Created JB_OBIN with the old value of JB_BIN (junkbuster), to
-#               be used where necessary (config dir)
-#
-#     Aditional notes:
-#     - The config directory is /etc/junkbuster yet. Have to change it on the
-#     specfile, after it is changes on the code
-#     - The only files that got renamed on the cvs tree were the rh specfile and
-#     the init file. Some file references got changes on the makefile and on the
-#     rh-spec (as listed above)
-#
-#     Revision 1.15  2002/03/09 15:05:58  swa
-#     wrong user.group
-#
-#     Revision 1.14  2002/03/06 06:13:40  hal9
-#     Adapted for Andreas' changes for --user and --pidfile.
-#
-#     Revision 1.13  2002/03/05 05:10:10  oes
-#     Changed pidfile path to conform with FHS
-#
-#     Revision 1.12  2002/03/04 20:44:36  oes
-#     Changed to new cmdline syntax
-#
-#     Revision 1.11  2001/12/30 14:07:32  steudten
-#     - Add signal handling (unix)
-#     - Add SIGHUP handler (unix)
-#     - Add creation of pidfile (unix)
-#     - Add action 'top' in rc file (RH)
-#     - Add entry 'SIGNALS' to manpage
-#     - Add exit message to logfile (unix)
-#
-#     Revision 1.10  2001/11/05 21:30:23  steudten
-#     Make JB startup without & due to be a 'real' daemon right now.
-#     Make the script easy to change.
-#
-#     Revision 1.9  2001/09/15 01:53:12  steudten
-#
-#     Remove test for subsys flag in start. Some minor changes.
-#
-#     Revision 1.8  2001/06/28 13:50:36  sarantis
-#     swap ?$ with $?; remove bogus ";;"
-#
-#     Revision 1.7  2001/06/28 13:40:26  sarantis
-#     remove single quotes from $JB; it was not expanded.
-#
-#     Revision 1.6  2001/06/28 13:38:42  sarantis
-#     formatting changes; individual return values are returned from the init script.
-#
-#     Revision 1.5  2001/06/11 11:37:40  sarantis
-#     Minor editing changes.
-#
-#     Revision 1.4  2001/06/09 09:14:11  swa
-#     shamelessly adapted RPM stuff from the newest rpm that
-#     RedHat provided for the JB.
-#
-#     Revision 1.3  2001/05/25 10:12:44  oes
-#     Fixed default case in switch statement (# -> *)
-#
-#     Revision 1.2  2001/05/24 07:52:24  swa
-#     added header. removed ^M.
-#
-# 
-# ********************************************************************/
-
-# This is file /etc/rc.d/init.d/privoxy and was put here 
-# by the privoxy rpm
-#
-# chkconfig: 235 84 09
-#
-# description: This shell script takes care of starting and stopping \
-#              privoxy.
-#
-
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-. /etc/sysconfig/network
-
-#  Check that networking is up.
-[ ${NETWORKING} = "no" ] && exit 0
-
-JB_PRG="privoxy"
-JB_BIN="/usr/sbin/$JB_PRG"
-JB_CONF="/etc/$JB_PRG/config"
-JB_USER="privoxy"
-JB_PID=/var/run/$JB_PRG.pid
-JB_LOCK=/var/lock/subsys/$JB_PRG
-JB="$JB_BIN --user $JB_USER.$JB_USER --pidfile $JB_PID $JB_CONF"
-
-# some checks for us
-! [ -x $JB_BIN  ] && echo "Can't find $JB_BIN, exit." && exit 0
-! [ -f $JB_CONF ] && echo "Can't find $JB_CONF, exit." && exit 0
-
-# See how we were called.
-
-start () {
-       # start daemon
-       echo -n $"Starting $JB_PRG: "
-     if [ -f $JB_PID ]; then 
-        killproc $JB_PRG && rm -f $JB_LOCK $JB_PID
-        RETVAL=$?
-        [ $RETVAL != 0 ] && return $RETVAL
-     fi
-       daemon $JB 
-       RETVAL=$?
-       echo
-       [ $RETVAL = 0 ] && touch $JB_LOCK
-       return $RETVAL
-}
-
-stop () {
-       # stop daemon
-       echo -n $"Stopping $JB_PRG: "
-       killproc $JB_PRG && rm -f $JB_LOCK $JB_PID
-       RETVAL=$?
-       echo
-       return $RETVAL
-}
-
-case "$1" in
-  start)
-       start   
-       ;;
-  stop)
-       stop
-       ;;
-  reload)
-       if [ -f $JB_PID ] ; then
-        kill -HUP `cat $JB_PID`
-        RETVAL=$?
-     fi
-       ;;
-  restart)
-       stop
-       start
-       RETVAL=$?
-       ;;
-  condrestart)
-       # restart only if already running
-       if [ -f $JB_PID ] ; then
-        stop
-        start
-        RETVAL=$?
-       fi 
-       ;;
-  status)
-       status $JB_PRG 
-       RETVAL=$?
-       ;;
-  top)
-     if [ -f $JB_PID ]; then
-                a=""
-                for i in `pidof $JB_PRG` ; do
-                        a="$a -p $i"
-                done
-                top $a
-     fi
-       ;;
-  *)
-       echo $"Usage: $JB_PRG {start|stop|reload|restart|condrestart|status|top}"
-       exit 1
-esac
-
-exit $RETVAL
diff --git a/privoxy.init.suse b/privoxy.init.suse
deleted file mode 100644 (file)
index 7bab6de..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#! /bin/sh
-#  ********************************************************************
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.init.suse,v $
-# 
-#  Purpose     :  This shell script takes care of starting and stopping
-#                 privoxy.
-# 
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
-# 
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-# 
-#                 This program is free software; you can redistribute it
-#                 and/or modify it under the terms of the GNU General
-#                 Public License as published by the Free Software
-#                 Foundation; either version 2 of the License, or (at
-#                 your option) any later version.
-# 
-#                 This program is distributed in the hope that it will
-#                 be useful, but WITHOUT ANY WARRANTY; without even the
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                 PARTICULAR PURPOSE.  See the GNU General Public
-#                 License for more details.
-# 
-#                 The GNU General Public License should be included with
-#                 this file.  If not, you can view it at
-#                 http://www.gnu.org/copyleft/gpl.html
-#                 or write to the Free Software Foundation, Inc., 59
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-# 
-#  Revisions   :
-#     $Log: privoxy.init.suse,v $
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.7  2002/03/11 11:44:46  oes
-#     Working in suggestions by Thorsten Kukuk <kukuk@suse.de>
-#
-#     Revision 1.6  2002/03/09 14:56:34  swa
-#     wrong user.group
-#
-#     Revision 1.5  2002/03/08 21:39:59  oes
-#     setgid to nogroup
-#
-#     Revision 1.4  2002/03/05 19:54:37  oes
-#     Preliminary version of SuSE 8.0-certified init script ,-)
-#
-#     Revision 1.3  2002/03/05 05:28:05  oes
-#     Added pidfile creation
-#
-#     Revision 1.2  2001/09/10 16:25:46  swa
-#     jb did not start. none of the arguments worked. fixed.
-#
-#     Revision 1.1  2001/06/08 20:53:36  swa
-#     use buildroot, export init to separate file (better manageability)
-#
-#
-# 
-# ********************************************************************/
-### BEGIN INIT INFO
-# Provides:       privoxy
-# Required-Start: $network $syslog $remote_fs
-# Required-Stop:
-# Default-Start:  3 5
-# Default-Stop:   0 1 2 6
-# Description:    Starts Privoxy
-### END INIT INFO
-
-. /etc/rc.config
-rc_reset  
-
-case "$1" in
-    start)
-        echo -n "Starting Privoxy"
-        if [ ! -f /var/run/privoxy.pid ] || ! kill -0 `cat /var/run/privoxy.pid` 2> /dev/null; then
-           /usr/sbin/privoxy --user privoxy.privoxy --pidfile /var/run/privoxy.pid /etc/privoxy/config 2> /dev/null
-        else     
-           false 
-        fi
-       rc_status -v
-        ;;
-    stop)
-        echo -n "Shutting down Privoxy"
-        killproc -TERM /usr/sbin/privoxy && rm -f /var/run/privoxy.pid
-       rc_status -v
-        ;;
-    reload)
-        echo -n "Reloading Privoxy"
-        kill -HUP `cat /var/run/privoxy.pid`
-        rc_status -v
-        ;;
-    try-restart)
-        $0 stop && $0 start
-       rc_status
-        ;;
-    restart)
-        $0 stop
-        $0 start
-        rc_status
-        ;;           
-    status)
-       echo -n "Checking for Privoxy"
-        checkproc /usr/sbin/privoxy
-       rc_status -v
-        ;;
-    *)
-        echo "Usage: $0 {start|restart|reload|status|stop}"
-        exit 1
-esac
-
-rc_exit
index 6ba5c57..2f14079 100644 (file)
--- a/project.h
+++ b/project.h
@@ -1,6 +1,6 @@
-#ifndef PROJECT_H_INCLUDED
-#define PROJECT_H_INCLUDED
-#define PROJECT_H_VERSION "$Id: project.h,v 1.61 2002/03/26 22:29:55 swa Exp $"
+#ifndef _PROJECT_H
+#define _PROJECT_H
+#define PROJECT_H_VERSION "$Id: project.h,v 1.22 2001/07/15 17:51:41 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
  *                (though it does declare some macros).
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
  *
  * Revisions   :
  *    $Log: project.h,v $
- *    Revision 1.61  2002/03/26 22:29:55  swa
- *    we have a new homepage!
- *
- *    Revision 1.60  2002/03/24 15:52:17  jongfoster
- *    Changing CGI URL prefixes for new name
- *
- *    Revision 1.59  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.58  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.57  2002/03/16 20:28:34  oes
- *    Added descriptions to the filters so users will know what they select in the cgi editor
- *
- *    Revision 1.56  2002/03/13 20:27:30  oes
- *    Fixing bug with CT_TABOO
- *
- *    Revision 1.55  2002/03/12 01:42:50  oes
- *    Introduced modular filters
- *
- *    Revision 1.54  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.53  2002/03/08 16:48:55  oes
- *    Added FEATURE_NO_GIFS and BUILTIN_IMAGE_MIMETYPE
- *
- *    Revision 1.52  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.51  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.50  2002/03/04 19:32:07  oes
- *    Changed default port to 8118
- *
- *    Revision 1.49  2002/03/04 18:28:55  oes
- *    Deleted PID_FILE_NAME
- *
- *    Revision 1.48  2002/03/03 14:50:40  oes
- *    Fixed CLF logging: Added ocmd member for client's request to struct http_request
- *
- *    Revision 1.47  2002/02/20 23:15:13  jongfoster
- *    Parsing functions now handle out-of-memory gracefully by returning
- *    an error code.
- *
- *    Revision 1.46  2002/01/17 21:06:09  jongfoster
- *    Now #defining the URLs of the config interface
- *
- *    Minor changes to struct http_request and struct url_spec due to
- *    standardizing that struct http_request is used to represent a URL, and
- *    struct url_spec is used to represent a URL pattern.  (Before, URLs were
- *    represented as seperate variables and a partially-filled-in url_spec).
- *
- *    Revision 1.45  2002/01/09 14:33:27  oes
- *    Added HOSTENT_BUFFER_SIZE
- *
- *    Revision 1.44  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.43  2001/11/22 21:57:51  jongfoster
- *    Making action_spec->flags into an unsigned long rather than just an
- *    unsigned int.
- *    Adding ACTION_NO_COOKIE_KEEP
- *
- *    Revision 1.42  2001/11/05 21:42:41  steudten
- *    Include DBG() macro.
- *
- *    Revision 1.41  2001/10/28 19:12:06  jongfoster
- *    Adding ijb_toupper()
- *
- *    Revision 1.40  2001/10/26 17:40:47  oes
- *    Moved ijb_isspace and ijb_tolower to project.h
- *    Removed http->user_agent, csp->referrer and csp->accept_types
- *
- *    Revision 1.39  2001/10/25 03:45:02  david__schmidt
- *    Adding a (void*) cast to freez() because Visual Age C++ won't expand the
- *    macro when called with a cast; so moving the cast to the macro def'n
- *    seems to both eliminate compiler warnings (on darwin and OS/2, anyway) and
- *    doesn't make macro expansion complain.  Hope this works for everyone else
- *    too...
- *
- *    Revision 1.38  2001/10/23 21:19:04  jongfoster
- *    New error-handling support: jb_err type and JB_ERR_xxx constants
- *    CGI functions now return a jb_err, and their parameters map is const.
- *    Support for RUNTIME_FEATUREs to enable/disable config editor
- *    Adding a few comments
- *
- *    Revision 1.37  2001/10/14 22:14:01  jongfoster
- *    Removing name_length field from struct cgi_dispatcher, as this is
- *    now calculated at runtime from the "name" field.
- *
- *    Revision 1.36  2001/10/10 16:45:15  oes
- *    Added LIMIT_CONNECT action and string
- *    Fixed HTTP message line termination
- *    Added CFORBIDDEN HTTP message
- *
- *    Revision 1.35  2001/10/07 18:06:43  oes
- *    Added status member to struct http_request
- *
- *    Revision 1.34  2001/10/07 15:45:25  oes
- *    Added url member to struct http_request and commented all
- *      members
- *
- *    Added CT_TABOO
- *
- *    Added ACTION_DOWNGRADE and ACTION_NO_COMPRESSION
- *
- *    Replaced struct client_state members rejected,
- *      force, active and toggled_on with "flags" bitmap.
- *
- *    Added CSP_FLAG_MODIFIED and CSP_FLAG_CHUNKED
- *
- *    Added buffer_limit to struct configuration_spec
- *
- *    Revision 1.33  2001/09/20 13:30:08  steudten
- *
- *    Make freez() more secure in case of: if (exp) { free(z) ; a=*z }
- *    Last case will set z to NULL in free(z) and thats bad..
- *
- *    Revision 1.32  2001/09/16 23:02:51  jongfoster
- *    Fixing warning
- *
- *    Revision 1.31  2001/09/16 13:20:29  jongfoster
- *    Rewrite of list library.  Now has seperate header and list_entry
- *    structures.  Also added a large sprinking of assert()s to the list
- *    code.
- *
- *    Revision 1.30  2001/09/13 23:52:00  jongfoster
- *    Support for both static and dynamically generated CGI pages
- *
- *    Revision 1.29  2001/09/13 23:29:43  jongfoster
- *    Defining FORWARD_SPEC_INITIALIZER
- *
- *    Revision 1.28  2001/09/13 23:05:50  jongfoster
- *    Changing the string paramater to the header parsers a "const".
- *
- *    Revision 1.27  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.26  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.25  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.24  2001/07/25 17:20:27  oes
- *    Introduced http->user_agent
- *
- *    Revision 1.23  2001/07/18 12:32:23  oes
- *    - Added ACTION_STRING_DEANIMATE
- *    - moved #define freez from jcc.h to project.h
- *
  *    Revision 1.22  2001/07/15 17:51:41  jongfoster
  *    Renaming #define STATIC to STATIC_PCRE
  *
 #endif
 
 #ifdef STATIC_PCRS
-#  include "pcrs.h"
+#  include "pcrs.h" 
 #else
-#  include <pcrs.h>
+#  include <pcrs.h> 
 #endif
 
 #if defined(REGEX_PCRE)
 #  include "gnu_regex.h"
 #endif
 
-#ifdef AMIGA
-#include "amiga.h"
+#ifdef AMIGA 
+#include "amiga.h" 
 #endif /* def AMIGA */
 
-#ifdef _WIN32
-/*
- * I don't want to have to #include all this just for the declaration
- * of SOCKET.  However, it looks like we have to...
- */
-#include <windows.h>
-#endif
-
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/*
- * The type used by sockets.  On UNIX it's an int.  Microsoft decided to
- * make it an unsigned.
- */
-#ifdef _WIN32
-typedef SOCKET jb_socket;
-#define JB_INVALID_SOCKET INVALID_SOCKET
-#else /* ndef _WIN32 */
-typedef int jb_socket;
-#define JB_INVALID_SOCKET (-1)
-#endif /* ndef _WIN32 */
+#define freez(X)  if(X) free(X); X = NULL
 
-
-/*
- * Error codes.  Functions returning these should return a jb_err
- */
-#define JB_ERR_OK         0 /* Success, no error                        */
-#define JB_ERR_MEMORY     1 /* Out of memory                            */
-#define JB_ERR_CGI_PARAMS 2 /* Missing or corrupt CGI parameters        */
-#define JB_ERR_FILE       3 /* Error opening, reading or writing a file */
-#define JB_ERR_PARSE      4 /* Error parsing file                       */
-#define JB_ERR_MODIFIED   5 /* File has been modified outside of the    */
-                            /* CGI actions editor.                      */
-typedef int jb_err;
-
-
-/*
- * This macro is used to free a pointer that may be NULL
- */
-#define freez(X)  { if(X) { free((void*)X); X = NULL ; } }
-
-
-/* Fix a problem with Solaris.  There should be no effect on other
- * platforms.
- * Solaris's isspace() is a macro which uses it's argument directly
- * as an array index.  Therefore we need to make sure that high-bit
- * characters generate +ve values, and ideally we also want to make
- * the argument match the declared parameter type of "int".
- *
- * Note: Remember to #include <ctype.h> if you use these macros.
- */
-#define ijb_toupper(__X) toupper((int)(unsigned char)(__X))
-#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
-#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))  
-
-/*
- * Use for statically allocated buffers if you have no other choice.
- * Remember to check the length of what you write into the buffer
- * - we don't want any buffer overflows!
- */
 #define BUFFER_SIZE 5000
 
-/*
- * Buffer size for capturing struct hostent data in the
- * gethostby(name|addr)_r library calls. Since we don't
- * loop over gethostbyname_r, the buffer must be sufficient
- * to accomodate multiple IN A RRs, as used in DNS round robin
- * load balancing. W3C's wwwlib uses 1K, so that should be
- * good enough for us, too.
- */
-#define HOSTENT_BUFFER_SIZE 1024
-
-/*
- * So you can say "while (FOREVER) { ...do something... }"
- */
 #define FOREVER 1
 
 /* Default IP and port to listen on */
 #define HADDR_DEFAULT   "127.0.0.1"
-#define HADDR_PORT      8118
+#define HADDR_PORT      8000
 
-/* Forward defs for various structures */
 
 /* Need this for struct client_state */
 struct configuration_spec;
 
-
 /* Generic linked list of strings */
-
-struct list_entry
-{
-   const char *str;
-   struct list_entry *next;
-};
-
-struct list
+struct list /* FIXME: Why not separate entries and header? */
 {
-   struct list_entry *first;
-   struct list_entry *last;
-};
-
-
-/* A map from a string to another string */
-
-struct map_entry
-{
-   const char *name;
-   const char *value;
-   struct map_entry *next;
+   char *       str;  /* valid in an entry */
+   struct list *last; /* valid in header */
+   struct list *next;
 };
 
 struct map
 {
-   struct map_entry *first;
-   struct map_entry *last;
+  char *name;
+  char *value;
+  struct map *next;
 };
 
-
 struct http_request
 {
-   char *cmd;      /* Whole command line: method, URL, Version */
-   char *ocmd;     /* Backup of original cmd for CLF logging */
-   char *gpc;      /* HTTP method: GET, POST, .. */
-   char *url;      /* The URL */
-   char *ver;      /* Protocol version */
-   int status;     /* HTTP Status */
-
-   char *host;     /* Host part of URL */
-   int   port;     /* Port of URL or 80 (default) */
-   char *path;     /* Path of URL */
-   char *hostport; /* host[:port] */
-   int   ssl;      /* Flag if protocol is https */
-
-   char *host_ip_addr_str; /* String with dotted decimal representation
-                            * of host's IP. NULL before connect_to() */
-
-   char  *dbuffer;     /* Buffer with '\0'-delimited domain name.           */
-   char **dvec;        /* List of pointers to the strings in dbuffer.       */
-   int    dcount;      /* How many parts to this domain? (length of dvec)   */
+   char *cmd;
+   char *gpc;
+   char *host;
+   char *host_ip_addr_str; /* NULL before connect_to() */
+   int   port;
+   char *path;
+   char *ver;
+   char *hostport; /* "host[:port]" */
+   int   ssl;
 };
 
-/* 
- * Response generated by CGI, blocker, or error handler
- */
+/* Response generated by CGI, blocker, or error handler */
 struct http_response
 {
-  char  *status;          /* HTTP status (string) */
+  char *status;           /* HTTP status (string)*/
   struct list headers[1]; /* List of header lines */
-  char  *head;            /* Formatted http response head */
-  size_t head_length;     /* Length of http response head */
-  char  *body;            /* HTTP document body */
-  size_t content_length;  /* Length of body, REQUIRED if binary body */
-  int    is_static;       /* Nonzero if the content will never change and
-                           * should be cached by the brwoser (e.g. images) */
+  char *head;             /* Formatted http response head */
+  int   head_length;      /* Length of http response head */
+  char *body;             /* HTTP document body */
+  int   content_length;   /* Length of body, REQUIRED if binary body*/
 };
 
 /* A URL pattern */
@@ -614,11 +325,13 @@ struct url_spec
    char  *spec;        /* The string which was parsed to produce this       */
                        /* url_spec.  Used for debugging or display only.    */
 
-   /* Hostname matching, or dbuffer == NULL to match all hosts */
-   char  *dbuffer;     /* Buffer with '\0'-delimited domain name.           */
-   char **dvec;        /* List of pointers to the strings in dbuffer.       */
-   int    dcount;      /* How many parts to this domain? (length of dvec)   */
-   int    unanchored;  /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT.  */
+   /* Hostname matching: */
+   char  *domain;      /* Fully qalified domain name (FQDN) pattern.        */
+                       /* May contain "*".                                  */
+   char  *dbuf;        /* Buffer with '\0'-delimited fqdn                   */
+   char **dvec;        /* Domain ptr vector into dbuf                       */
+   int    dcnt;        /* How many domains in fqdn?                         */
+   int    unanchored;  /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT   */
 
    /* Port matching: */
    int   port;         /* The port number, or 0 to match all ports.         */
@@ -631,17 +344,12 @@ struct url_spec
    regex_t *preg;      /* Regex for matching path part                      */
 #endif
 };
-#ifdef REGEX
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL }
-#else /* ifndef REGEX */
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0 }
-#endif /* ndef REGEX */
 
-/* Constants for host part matching in URLs */
 #define ANCHOR_LEFT  1
 #define ANCHOR_RIGHT 2
 
 
+
 /* An I/O buffer */
 struct iob
 {
@@ -654,46 +362,40 @@ struct iob
 #define IOB_PEEK(CSP) ((CSP->iob->cur > CSP->iob->eod) ? (CSP->iob->eod - CSP->iob->cur) : 0)
 #define IOB_RESET(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob));
 
-/* Bits for csp->content_type */
-#define CT_TEXT   1 /* Suitable for pcrs filtering */
-#define CT_GIF    2 /* Suitable for GIF filtering */
-#define CT_TABOO  4 /* DONT filter */
+/* Keys for csp->content_type */
+#define CT_TEXT 0x01U
+#define CT_GIF  0x02U
 
 #define ACTION_MASK_ALL        (~0U)
 
-#define ACTION_MOST_COMPATIBLE 0x00000000UL
-
-#define ACTION_BLOCK           0x00000001UL
-#define ACTION_DEANIMATE       0x00000002UL
-#define ACTION_DOWNGRADE       0x00000004UL
-#define ACTION_FAST_REDIRECTS  0x00000008UL
-#define ACTION_HIDE_FORWARDED  0x00000010UL
-#define ACTION_HIDE_FROM       0x00000020UL
-#define ACTION_HIDE_REFERER    0x00000040UL /* sic - follow HTTP, not English */
-#define ACTION_HIDE_USER_AGENT 0x00000080UL
-#define ACTION_IMAGE           0x00000100UL
-#define ACTION_IMAGE_BLOCKER   0x00000200UL
-#define ACTION_NO_COMPRESSION  0x00000400UL
-#define ACTION_NO_COOKIE_KEEP  0x00000800UL
-#define ACTION_NO_COOKIE_READ  0x00001000UL
-#define ACTION_NO_COOKIE_SET   0x00002000UL
-#define ACTION_NO_POPUPS       0x00004000UL
-#define ACTION_VANILLA_WAFER   0x00008000UL
-#define ACTION_LIMIT_CONNECT   0x00010000UL
+#define ACTION_MOST_COMPATIBLE 0x0000U
+
+#define ACTION_BLOCK           0x0001U
+#define ACTION_DEANIMATE       0x2000U
+#define ACTION_FAST_REDIRECTS  0x0002U
+#define ACTION_FILTER          0x0004U
+#define ACTION_HIDE_FORWARDED  0x0008U
+#define ACTION_HIDE_FROM       0x0010U
+#define ACTION_HIDE_REFERER    0x0020U /* sic - follow HTTP, not English */
+#define ACTION_HIDE_USER_AGENT 0x0040U
+#define ACTION_IMAGE           0x0080U
+#define ACTION_IMAGE_BLOCKER   0x0100U
+#define ACTION_NO_COOKIE_READ  0x0200U
+#define ACTION_NO_COOKIE_SET   0x0400U
+#define ACTION_NO_POPUPS       0x0800U
+#define ACTION_VANILLA_WAFER   0x1000U
 
 #define ACTION_STRING_DEANIMATE     0
 #define ACTION_STRING_FROM          1
 #define ACTION_STRING_IMAGE_BLOCKER 2
 #define ACTION_STRING_REFERER       3
 #define ACTION_STRING_USER_AGENT    4
-#define ACTION_STRING_LIMIT_CONNECT 5
-#define ACTION_STRING_COUNT         6
+#define ACTION_STRING_COUNT         5
+
 
 #define ACTION_MULTI_ADD_HEADER     0
 #define ACTION_MULTI_WAFER          1
-#define ACTION_MULTI_FILTER         2
-#define ACTION_MULTI_COUNT          3
-
+#define ACTION_MULTI_COUNT          2
 
 /*
  * This structure contains a list of actions to apply to a URL.
@@ -703,7 +405,7 @@ struct iob
  */
 struct current_action_spec
 {
-   unsigned long flags;    /* a bit set to "1" = add action    */
+   unsigned flags;    /* a bit set to "1" = add action    */
 
    /* For those actions that require parameters: */
 
@@ -722,8 +424,8 @@ struct current_action_spec
  */
 struct action_spec
 {
-   unsigned long mask;   /* a bit set to "0" = remove action */
-   unsigned long add;    /* a bit set to "1" = add action    */
+   unsigned mask;   /* a bit set to "0" = remove action */
+   unsigned add;    /* a bit set to "1" = add action    */
 
    /* For those actions that require parameters: */
 
@@ -756,23 +458,29 @@ struct url_actions
 };
 
 
+/* Constants defining bitmask for csp->accept_types */
+
+#ifdef DETECT_MSIE_IMAGES
+
+/* MSIE detected by user-agent string */
+#define ACCEPT_TYPE_IS_MSIE     0x0001
+
 /*
- * Flags for use in csp->flags
+ * *If* this is MSIE, it wants an image.  (Or this is a shift-reload, or
+ * it's got an image from this URL before...  yuck!)
+ * Only meaningful if ACCEPT_TYPE_IS_MSIE set 
  */
-#define CSP_FLAG_ACTIVE     0x01 /* Set if this client is processing data.
-                                  * Cleared when the thread associated with
-                                  * this structure dies. */
-#define CSP_FLAG_CHUNKED    0x02 /* Set if the server's reply is in "chunked"
-                                  * transfer encoding */
-#define CSP_FLAG_FORCED     0x04 /* Set if this request was enforced, although
-                                  * it would normally have been blocked. */
-#define CSP_FLAG_MODIFIED   0x08 /* Set if any modification to the body was done */
-#define CSP_FLAG_REJECTED   0x10 /* Set if request was blocked.  */
-#define CSP_FLAG_TOGGLED_ON 0x20 /* Set if we are toggled on (FEATURE_TOGGLE) */
+#define ACCEPT_TYPE_MSIE_IMAGE  0x0002
 
 /*
- * The state of a Privoxy processing thread.
+ * *If* this is MSIE, it wants a HTML document.
+ * Only meaningful if ACCEPT_TYPE_IS_MSIE set
  */
+#define ACCEPT_TYPE_MSIE_HTML   0x0004
+
+#endif /* def DETECT_MSIE_IMAGES */
+
+
 struct client_state
 {
    /* The proxy's configuration */
@@ -782,13 +490,26 @@ struct client_state
    struct current_action_spec  action[1];
 
    /* socket to talk to client (web browser) */
-   jb_socket cfd;
+   int  cfd;
 
    /* socket to talk to server (web server or proxy) */
-   jb_socket sfd;
+   int  sfd;
 
-   /* Multi-purpose flag container, see CSP_FLAG_* above */
-   unsigned short int flags;
+
+#ifdef STATISTICS
+   /* 1 if this URL was rejected, 0 otherwise. Allows actual stats inc to 
+    * occur in main thread only for thread-safety. 
+    */
+   int  rejected;
+#endif /* def STATISTICS */
+
+#ifdef FORCE_LOAD
+   int force;
+#endif /* def FORCE_LOAD */
+
+#ifdef TOGGLE
+   int   toggled_on;
+#endif /* def TOGGLE */
 
    /*
     * Client PC's IP address, as reported by the accept()_ function.
@@ -805,6 +526,18 @@ struct client_state
    char *my_ip_addr_str;
    char *my_hostname;
 
+#ifdef TRUST_FILES
+   /* The referer in this request, if one was specified. */
+   char *referrer;
+#endif /* def TRUST_FILES */
+
+#if defined(DETECT_MSIE_IMAGES)
+   /* Types the client will accept.
+    * Bitmask - see ACCEPT_TYPE_XXX constants.
+    */
+   int accept_types;
+#endif /* defined(DETECT_MSIE_IMAGES) */
+
    /* The URL that was requested */
    struct http_request http[1];
 
@@ -817,61 +550,47 @@ struct client_state
    /* List of all cookies for this request */
    struct list cookie_list[1];
 
-   /* MIME-Type key, see CT_* above */
-   unsigned short int content_type;
+   /* MIME-Type bitmap, see CT_* above */
+   unsigned char content_type;
 
    /* The "X-Forwarded-For:" header sent by the client */
    char   *x_forwarded;
 
+   /*
+    * Nonzero if this client is processing data.
+    * Set to zero when the thread associated with this structure dies.
+    */
+   int active;
+
    /* files associated with this client */
    struct file_list *actions_list;
 
    struct file_list *rlist;   /* pcrs job file */
-   size_t content_length;     /* Length after content modification */
+   size_t content_length;     /* Length after content modification */ 
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
    struct file_list *tlist;   /* trustfile */
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
    struct client_state *next;
 };
 
 
-/*
- * A function to add a header
- */
-typedef jb_err (*add_header_func_ptr)(struct client_state *);
-
-/*
- * A function to process a header
- */
-typedef jb_err (*parser_func_ptr    )(struct client_state *, char **);
-
-/*
- * List of functions to run on a list of headers
- */
 struct parsers
 {
-   char   *str;
-   size_t len;
-   parser_func_ptr parser;
+   char *str;
+   char  len;
+   char *(*parser)(const struct parsers *, char *, struct client_state *);
 };
 
-
-/*
- * List of available CGI functions.
- */
 struct cgi_dispatcher
 {
-   const char * const name;
-   jb_err    (* const handler)(struct client_state *csp, struct http_response *rsp, const struct map *parameters);
-   const char * const description;
+   const char *name;
+   int         name_length;
+   int         (*handler)(struct client_state *csp, struct http_response *rsp, struct map *parameters);
+   const char *description;
 };
 
-
-/*
- * A data file used by Privoxy.  Kept in a linked list.
- */
 struct file_list
 {
    /*
@@ -879,11 +598,11 @@ struct file_list
     * Read-only once the structure has been created.
     */
    void *f;
-
+   
    /* Normally NULL.  When we are finished with file (i.e. when we have
     * loaded a new one), set to a pointer to an unloader function.
     * Unloader will be called by sweep() (called from main loop) when
-    * all clients using this file are done.  This prevents threading
+    * all clients using this file are done.  This prevents threading 
     * problems.
     */
    void (*unloader)(void *);
@@ -891,6 +610,13 @@ struct file_list
    /* Used internally by sweep().  Do not access from elsewhere. */
    int active;
 
+#ifndef SPLIT_PROXY_ARGS
+   /* String to be displayed as part of show-proxy-args display.
+    * Read-only once the structure has been created.
+    */
+   char *proxy_args;
+#endif /* ndef SPLIT_PROXY_ARGS */
+
    /* Following variables allow us to check if file has been changed.
     * Read-only once the structure has been created.
     */
@@ -907,14 +633,14 @@ struct file_list
 };
 
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 struct block_spec
 {
    struct url_spec url[1];
    int    reject;
    struct block_spec *next;
 };
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
 #define SOCKS_NONE    0    /* Don't use a SOCKS server */
@@ -939,25 +665,14 @@ struct forward_spec
    /* For the linked list */
    struct forward_spec *next;
 };
-#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL }
 
-
-/*
- * This struct represents one filter (one block) from
- * the re_filterfile. If there is more than one filter
- * in the file, the file will be represented by a
- * chained list of re_filterfile specs.
- */
 struct re_filterfile_spec
 {
-   char *name;                      /* Name from FILTER: statement in re_filterfile */
-   char *description;               /* Description from FILTER: statement in re_filterfile */
-   struct list patterns[1];         /* The patterns from the re_filterfile */
-   pcrs_job *joblist;               /* The resulting compiled pcrs_jobs */
-   struct re_filterfile_spec *next; /* The pointer for chaining */
+   struct list patterns[1];
+   pcrs_job *joblist;
 };
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
 #define ACL_PERMIT   1  /* accept connection request */
 #define ACL_DENY     2  /* reject connection request */
 
@@ -976,17 +691,12 @@ struct access_control_list
    short action;
    struct access_control_list *next;
 };
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
 
 /* Maximum number of loaders (actions, re_filter, ...) */
 #define NLOADERS 8
 
-
-#define RUNTIME_FEATURE_CGI_EDIT_ACTIONS  1
-#define RUNTIME_FEATURE_CGI_TOGGLE        2
-
-
 /*
  * Data loaded from the configuration file.
  *
@@ -997,9 +707,6 @@ struct configuration_spec
    int debug;
    int multi_threaded;
 
-   /* Features that can be enabled/disabled throuigh the config file */
-   unsigned feature_flags;
-
    const char *logfile;
 
    const char *confdir;
@@ -1014,31 +721,37 @@ struct configuration_spec
 
    const char *re_filterfile;
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef JAR_FILES
    const char * jarfile;
    FILE * jar;
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
    /*
     * Port and IP to bind to.
-    * Defaults to HADDR_DEFAULT:HADDR_PORT == 127.0.0.1:8118
+    * Defaults to HADDR_DEFAULT:HADDR_PORT == 127.0.0.1:8000
     */
    const char *haddr;
    int         hport;
 
-   /* Size limit for IOB */
-   size_t buffer_limit;
+#ifndef SPLIT_PROXY_ARGS
+   const char *suppress_message;
+#endif /* ndef SPLIT_PROXY_ARGS */
 
-#ifdef FEATURE_TRUST
+#ifndef SPLIT_PROXY_ARGS
+   /* suppress listing config files */
+   int suppress_blocklists;
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+#ifdef TRUST_FILES
    const char * trustfile;
 
    struct list trust_info[1];
    struct url_spec *trust_list[64];
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
    struct access_control_list *acl;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    struct forward_spec *forward;
 
@@ -1058,57 +771,28 @@ struct configuration_spec
 
 #define SZ(X)  (sizeof(X) / sizeof(*X))
 
-#ifdef FEATURE_FORCE_LOAD
-#define FORCE_PREFIX "/PRIVOXY-FORCE"
-#endif /* def FEATURE_FORCE_LOAD */
-
-#ifdef FEATURE_NO_GIFS
-#define BUILTIN_IMAGE_MIMETYPE "image/png"
-#else
-#define BUILTIN_IMAGE_MIMETYPE "image/gif"
-#endif /* def FEATURE_NO_GIFS */
-
+#ifdef FORCE_LOAD
+#define FORCE_PREFIX "/IJB-FORCE-LOAD"
+#endif /* def FORCE_LOAD */
 
 /* Hardwired URLs */
-#define HOME_PAGE_URL       "http://www.privoxy.org"
-#define REDIRECT_URL        HOME_PAGE_URL "/redirect.php?v=" VERSION "&to="
-
-/*
- * The "hosts" to intercept and display CGI pages.
- * First one is a hostname only, second one can specify host and path.
- *
- * Notes:
- * 1) Do not specify the http: prefix
- * 2) CGI_SITE_2_PATH must not end with /, one will be added automatically.
- * 3) CGI_SITE_2_PATH must start with /, unless it is the empty string.
- */
-#define CGI_SITE_1_HOST "p.p"
-#define CGI_SITE_2_HOST "config.privoxy.org"
-#define CGI_SITE_2_PATH ""
-
-/*
- * The prefix for CGI pages.  Written out in generated HTML.
- * INCLUDES the trailing slash.
- */
-#define CGI_PREFIX  "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
-
+#define HOME_PAGE_URL  "http://ijbswa.sourceforge.net"
+#define REDIRECT_URL HOME_PAGE_URL "/redirect.php?v=" VERSION "&to="
+#define CGI_PREFIX_HOST "i.j.b"
 
 /* HTTP snipplets */
 static const char CSUCCEED[] =
    "HTTP/1.0 200 Connection established\n"
-   "Proxy-Agent: Privoxy/" VERSION "\r\n\r\n";
+   "Proxy-Agent: IJ/" VERSION "\n\n";
 
 static const char CHEADER[] =
-   "HTTP/1.0 400 Invalid header received from browser\r\n\r\n";
-
-static const char CFORBIDDEN[] =
-   "HTTP/1.0 403 Connection not allowable\r\nX-Hint: If you read this message interactively, then you know why this happens ,-)\r\n\r\n";
+   "HTTP/1.0 400 Invalid header received from browser\n\n";
 
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
 
-#endif /* ndef PROJECT_H_INCLUDED */
+#endif /* ndef _PROJECT_H */
 
 /*
   Local Variables:
diff --git a/re_filterfile b/re_filterfile
new file mode 100644 (file)
index 0000000..a9097e9
--- /dev/null
@@ -0,0 +1,175 @@
+# ********************************************************************
+# 
+#  File        :  $Source: /cvsroot/ijbswa/current/re_filterfile,v $
+# 
+#  Purpose     :  Rules to process the content of web pages
+# 
+#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
+# 
+#                 This program is free software; you can redistribute it
+#                 and/or modify it under the terms of the GNU General
+#                 Public License as published by the Free Software
+#                 Foundation; either version 2 of the License, or (at
+#                 your option) any later version.
+# 
+#                 This program is distributed in the hope that it will
+#                 be useful, but WITHOUT ANY WARRANTY; without even the
+#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
+#                 PARTICULAR PURPOSE.  See the GNU General Public
+#                 License for more details.
+# 
+#                 The GNU General Public License should be included with
+#                 this file.  If not, you can view it at
+#                 http://www.gnu.org/copyleft/gpl.html
+#                 or write to the Free Software Foundation, Inc., 59
+#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+# 
+#  Revisions   :
+#     $Log: re_filterfile,v $
+#     Revision 1.9  2001/07/13 14:03:48  oes
+#     Elimiated yet another bug in the banner-by-size jobs. Shame on me!
+#
+#     Revision 1.8  2001/06/29 13:34:00  oes
+#     - Added explanation for U and T options
+#     - Added hint on image replacement by CGI call
+#     - Fixed bug in banner-by-size jobs
+#
+#     Revision 1.7  2001/06/19 14:21:56  oes
+#     Fixed microsuck line
+#
+#     Revision 1.6  2001/06/09 14:01:57  swa
+#     header. cosmetics. default: no messing ala microsuck.
+#
+#
+# 
+# ********************************************************************/
+#
+# Syntax: One Perl-Style substitution per line.
+# For Details see the perlre, perlop and pcre manpages.
+# Note that you are free to choose the delimter as you see fit.
+#
+# Note: In addidion to the Perl options egimosx, the following nonstandard
+# options are supported:
+# 
+# 'U' turns the default to ungreedy matching.  Add ? to quantifiers to
+#     switch back to greedy.
+# 'T' (trivial) prevents parsing for backreferences in the substitute.
+#     Use if you want to include text like '$&' in your substitute without
+#     quoting.
+# 
+
+# ********************************************************************/
+#
+# Kill OnUnload popups. Yummy.
+# check it out on http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
+#
+# ********************************************************************/
+s/(<body .*?)onunload(.*?>)/$1never$2/i
+
+# ********************************************************************/
+#
+# Kill refresh tags. I like to refresh myself. Manually.
+# check it out on http://www.airport-cgn.de/ and go to the arrivals page.
+#
+# ********************************************************************/
+s/<meta[^>]*http-equiv[^>]*refresh.*URL=([^>]*?)"?>/<link rev="x-refresh" href=$1>/i
+s/<meta[^>]*http-equiv="?page-enter"?[^>]*content=[^>]*>/<!--no page enter for me-->/i
+
+# ********************************************************************/
+#
+# If I allow popups, I want them to be resizeable and have a location
+# and status bar: check it out on http://www.airport-cgn.de/ and go to
+# the arrivals page.
+#
+# ********************************************************************/
+# s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig
+# s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig
+# s/scrolling="?(no|0|Auto)"?/scrolling=1/ig
+# s/menubar="?(no|0)"?/menubar=1/ig #s/framespacing="?(no|0)"?//ig
+# #s/margin(height|width)=[0-9]*//gi
+
+# ********************************************************************/
+#
+# Remove frameborder=0 and border=0 from framesets
+#
+# ********************************************************************/
+s/(<frameset[^>]+?)border=['"]?(no|0)['"]?/$1/ig
+s/(<frameset[^>]+?)frameborder=['"]?(no|0)['"]?/$1/ig
+
+# ********************************************************************/
+#
+# The status bar is for displaying link targets, not pointless buzzwords.
+# Again, check it out on http://www.airport-cgn.de/
+#
+# ********************************************************************/
+s/status='.*?';*//ig
+
+# ********************************************************************/
+#
+# Get rid of Javascript cookies, like found on privacy.net:
+#
+# ********************************************************************/
+
+#s|document.cookie|c\?\?kie_what\?|sig
+
+# ********************************************************************/
+#
+# Kill *all* popups a la popup.c. (But for *all* sites, so I wouldn't do that.)
+#
+# JavaScript: s/window\.open\(/who_wants_this_to.open(/ig
+# HTML      : s/target=['"]?_blank['"]?/target_who/g
+#
+# Kill banners by size:
+# (Sizes from http://www.iab.net/iab_banner_standards/bannersizes.html)
+# Note: Use http://i.j.b/send-banner?type=trans for a transparent 1x1 gif
+# ********************************************************************/
+s|<img\s+[^>]*?(width=['"]?468\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?234\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?88\D)[^>]*(height=['"]?31[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?90[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?600[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?160\D)[^>]*(height=['"]?600[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?125\D)[^>]*(height=['"]?125[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?240[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?180\D)[^>]*(height=['"]?150[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?300\D)[^>]*(height=['"]?250[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?250\D)[^>]*(height=['"]?250[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?240\D)[^>]*(height=['"]?400[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?336\D)[^>]*(height=['"]?280[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+
+# Where is that from?
+s|<img\s+[^>]*?(width=['"]?200\D)[^>]*(height=['"]?50[^>]*?)>|<img src=http://i.j.b/send-banner $1 $2>|sig
+
+# ********************************************************************/
+#
+# Squish WebBugs:
+#
+# ********************************************************************/
+s/<img\s+[^>]*?(width|height)\s+=\s+['"]?1\D[^>]*?(width|height)\s+=\s+['"]?1\D[^>]*?>/<!-- Squished WebBug -->/sig
+
+# ********************************************************************/
+#
+# Fun stuff
+#
+# ********************************************************************/
+s/microsoft(?!.com)/MicroSuck/ig
+
+# ********************************************************************/
+#
+# Crude parental filtering?  (Use along with a suitable blocklist).
+# Shows how to deny access to whole page based on a keyword.
+#
+# (Note: Middlesex, Sussex and Essex are counties in the UK, not rude words)
+# (Note #2: Is 'sex' a rude word?!)
+#
+#s%^.*(?<!middle)(?<!sus)(?<!es)sex.*$%<html><head><title>Blocked</title></head><body><h3>Blocked due to possible adult content. Please see <a href="http://dmoz.org/Kids_and_Teens/">this site</a>.</h3></body></html>%is
+#s+^.*warez.*$+<html><head><title>No Warez</title></head><body><h3>You're not searching for illegal stuff, are you?</h3></body></html>+is
+
+# ********************************************************************/
+#
+# http://www.farscapezone.com/wwwboard/messages/1451.html
+#
+# ********************************************************************/
+s/(\w+) was tired/<b>$1 needed more coffee<\/b>/ig
diff --git a/showargs.c b/showargs.c
new file mode 100644 (file)
index 0000000..ea83855
--- /dev/null
@@ -0,0 +1,486 @@
+const char showargs_rcs[] = "$Id: showargs.c,v 1.19 2001/07/13 14:11:36 oes Exp $";
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/showargs.c,v $
+ *
+ * Purpose     :  Contains various utility routines needed to 
+ *                generate the show-proxy-args page.
+ *                FIXME: Is this really stuff for a separate file?
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: showargs.c,v $
+ *    Revision 1.19  2001/07/13 14:11:36  oes
+ *     - Included SHOW_RCS for deanimate.*
+ *     - Removed all #ifdef PCRS
+ *
+ *
+ *    Revision 1.18  2001/07/02 02:55:16  iwanttokeepanon
+ *    Apended " on some sites" to the HTML generating function `show_defines' (@ line
+ *    392); since "DENY_GZIP" is not *really* necessary for all PCRS functionallity.
+ *
+ *    Revision 1.17  2001/06/29 21:45:41  oes
+ *    Indentation, CRLF->LF, Tab-> Space
+ *
+ *    Revision 1.16  2001/06/29 13:35:07  oes
+ *    - Adapted
+ *    - Improved comments
+ *    - Removed init_proxy_args
+ *    - Renamed end_proxy_args(csp) to show_rcs(void)
+ *    - Removed logentry from cancelled commit
+ *    - Destroyed support for ndef SPLIT_PROXY_ARGS (Ooops)
+ *    - Separated the #define list into show_defines()
+ *
+ *    Revision 1.15  2001/06/09 10:55:28  jongfoster
+ *    Changing BUFSIZ ==> BUFFER_SIZE
+ *
+ *    Revision 1.14  2001/06/07 23:15:40  jongfoster
+ *    Removing config->proxy_args_gateways
+ *    Missing return statement added to end_proxy_args().
+ *
+ *    Revision 1.13  2001/06/06 09:37:59  sarantis
+ *    Fix misplaced comment start.
+ *
+ *    Revision 1.12  2001/06/04 10:41:52  swa
+ *    show version string of cgi.h and cgi.c
+ *
+ *    Revision 1.11  2001/06/03 11:03:48  oes
+ *    moved stuff to cgi.c
+ *
+ *    Revision 1.10  2001/05/31 21:36:07  jongfoster
+ *    Added RCS for actions.[ch] and list.[ch]
+ *
+ *    Revision 1.9  2001/05/29 23:11:38  oes
+ *
+ *     - Moved strsav() from showargs to miscutil
+ *
+ *    Revision 1.8  2001/05/29 09:50:24  jongfoster
+ *    Unified blocklist/imagelist/permissionslist.
+ *    File format is still under discussion, but the internal changes
+ *    are (mostly) done.
+ *
+ *    Also modified interceptor behaviour:
+ *    - We now intercept all URLs beginning with one of the following
+ *      prefixes (and *only* these prefixes):
+ *        * http://i.j.b/
+ *        * http://ijbswa.sf.net/config/
+ *        * http://ijbswa.sourceforge.net/config/
+ *    - New interceptors "home page" - go to http://i.j.b/ to see it.
+ *    - Internal changes so that intercepted and fast redirect pages
+ *      are not replaced with an image.
+ *    - Interceptors now have the option to send a binary page direct
+ *      to the client. (i.e. ijb-send-banner uses this)
+ *    - Implemented show-url-info interceptor.  (Which is why I needed
+ *      the above interceptors changes - a typical URL is
+ *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
+ *      The previous mechanism would not have intercepted that, and
+ *      if it had been intercepted then it then it would have replaced
+ *      it with an image.)
+ *
+ *    Revision 1.7  2001/05/26 00:28:36  jongfoster
+ *    Automatic reloading of config file.
+ *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
+ *    Most of the global variables have been moved to a new
+ *    struct configuration_spec, accessed through csp->config->globalname
+ *    Most of the globals remaining are used by the Win32 GUI.
+ *
+ *    Revision 1.6  2001/05/25 22:32:56  jongfoster
+ *    CRLF->LF
+ *
+ *    Revision 1.5  2001/05/22 18:54:49  oes
+ *
+ *    - Enabled filtering banners by size rather than URL
+ *      by adding patterns that replace all standard banner
+ *      sizes with the "Junkbuster" gif to the re_filterfile
+ *
+ *    - Enabled filtering WebBugs by providing a pattern
+ *      which kills all 1x1 images
+ *
+ *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
+ *      which is selected by the (nonstandard and therefore
+ *      capital) letter 'U' in the option string.
+ *      It causes the quantifiers to be ungreedy by default.
+ *      Appending a ? turns back to greedy (!).
+ *
+ *    - Added a new interceptor ijb-send-banner, which
+ *      sends back the "Junkbuster" gif. Without imagelist or
+ *      MSIE detection support, or if tinygif = 1, or the
+ *      URL isn't recognized as an imageurl, a lame HTML
+ *      explanation is sent instead.
+ *
+ *    - Added new feature, which permits blocking remote
+ *      script redirects and firing back a local redirect
+ *      to the browser.
+ *      The feature is conditionally compiled, i.e. it
+ *      can be disabled with --disable-fast-redirects,
+ *      plus it must be activated by a "fast-redirects"
+ *      line in the config file, has its own log level
+ *      and of course wants to be displayed by show-proxy-args
+ *      Note: Boy, all the #ifdefs in 1001 locations and
+ *      all the fumbling with configure.in and acconfig.h
+ *      were *way* more work than the feature itself :-(
+ *
+ *    - Because a generic redirect template was needed for
+ *      this, tinygif = 3 now uses the same.
+ *
+ *    - Moved GIFs, and other static HTTP response templates
+ *      to project.h
+ *
+ *    - Some minor fixes
+ *
+ *    - Removed some >400 CRs again (Jon, you really worked
+ *      a lot! ;-)
+ *
+ *    Revision 1.4  2001/05/20 16:44:47  jongfoster
+ *    Removing last hardcoded JunkBusters.com URLs.
+ *
+ *    Revision 1.3  2001/05/20 01:21:20  jongfoster
+ *    Version 2.9.4 checkin.
+ *    - Merged popupfile and cookiefile, and added control over PCRS
+ *      filtering, in new "permissionsfile".
+ *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
+ *      file error you now get a message box (in the Win32 GUI) rather
+ *      than the program exiting with no explanation.
+ *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
+ *      skipping.
+ *    - Removed tabs from "config"
+ *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
+ *    - Bumped up version number.
+ *
+ *    Revision 1.2  2001/05/17 23:01:01  oes
+ *     - Cleaned CRLF's from the sources and related files
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:59:03  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <string.h>
+#include <malloc.h>
+#include <errno.h>
+
+#include "project.h"
+#include "showargs.h"
+#include "jcc.h"
+#include "encode.h"
+#include "parsers.h"
+#include "errlog.h"
+#include "miscutil.h"
+#include "gateway.h"
+
+const char showargs_h_rcs[] = SHOWARGS_H_VERSION;
+
+
+/*********************************************************************
+ *
+ * Function    :  savearg
+ *
+ * Description :  Called from `load_config'.  It saves each non-empty
+ *                and non-comment line from config into a list.  This
+ *                list is used to create the show-proxy-args page.
+ *
+ * Parameters  :
+ *          1  :  c = config setting that was found
+ *          2  :  o = the setting's argument (if any)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void savearg(char *c, char *o, struct configuration_spec * config)
+{
+   char buf[BUFFER_SIZE];
+
+   *buf = '\0';
+
+   if ( ( NULL != c ) && ( '\0' != *c ) )
+   {
+      if ((c = html_encode(c)))
+      {
+         sprintf(buf, "<a href=\"" REDIRECT_URL "option#%s\">%s</a> ", c, c);
+      }
+      freez(c);
+   }
+   if ( ( NULL != o ) && ( '\0' != *o ) )
+   {
+      if ((o = html_encode(o)))
+      {
+         if (strncmpic(o, "http://", 7) == 0)
+         {
+            strcat(buf, "<a href=\"");
+            strcat(buf, o);
+            strcat(buf, "\">");
+            strcat(buf, o);
+            strcat(buf, "</a>");
+         }
+         else
+         {
+            strcat(buf, o);
+         }
+      }
+      freez(o);
+   }
+
+   strcat(buf, "<br>\n");
+
+   config->proxy_args = strsav(config->proxy_args, buf);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  show_rcs
+ *
+ * Description :  Create a string with the rcs info for all sourcefiles
+ *
+ * Parameters  :  None
+ *
+ * Returns     :  string 
+ *
+ *********************************************************************/
+char *show_rcs(void)
+{
+   char *b = NULL;
+   char buf[BUFFER_SIZE];
+
+   /* Instead of including *all* dot h's in the project (thus creating a
+    * tremendous amount of dependencies), I will concede to declaring them
+    * as extern's.  This forces the developer to add to this list, but oh well.
+    */
+
+#define SHOW_RCS(__x)            \
+   {                             \
+      extern const char __x[];   \
+      sprintf(buf, "%s\n", __x); \
+      b = strsav(b, buf);        \
+   }
+
+   /* In alphabetical order */
+   SHOW_RCS(actions_h_rcs)
+   SHOW_RCS(actions_rcs)
+   SHOW_RCS(cgi_h_rcs)
+   SHOW_RCS(cgi_rcs)
+#ifdef __MINGW32__
+   SHOW_RCS(cygwin_h_rcs)
+#endif
+   SHOW_RCS(deanimate_h_rcs)
+   SHOW_RCS(deanimate_rcs)
+   SHOW_RCS(encode_h_rcs)
+   SHOW_RCS(encode_rcs)
+   SHOW_RCS(errlog_h_rcs)
+   SHOW_RCS(errlog_rcs)
+   SHOW_RCS(filters_h_rcs)
+   SHOW_RCS(filters_rcs)
+   SHOW_RCS(gateway_h_rcs)
+   SHOW_RCS(gateway_rcs)
+#ifdef GNU_REGEX
+   SHOW_RCS(gnu_regex_h_rcs)
+   SHOW_RCS(gnu_regex_rcs)
+#endif /* def GNU_REGEX */
+   SHOW_RCS(jbsockets_h_rcs)
+   SHOW_RCS(jbsockets_rcs)
+   SHOW_RCS(jcc_h_rcs)
+   SHOW_RCS(jcc_rcs)
+#ifdef KILLPOPUPS
+   SHOW_RCS(killpopup_h_rcs)
+   SHOW_RCS(killpopup_rcs)
+#endif /* def KILLPOPUPS */
+   SHOW_RCS(list_h_rcs)
+   SHOW_RCS(list_rcs)
+   SHOW_RCS(loadcfg_h_rcs)
+   SHOW_RCS(loadcfg_rcs)
+   SHOW_RCS(loaders_h_rcs)
+   SHOW_RCS(loaders_rcs)
+   SHOW_RCS(miscutil_h_rcs)
+   SHOW_RCS(miscutil_rcs)
+   SHOW_RCS(parsers_h_rcs)
+   SHOW_RCS(parsers_rcs)
+   SHOW_RCS(pcrs_rcs)
+   SHOW_RCS(pcrs_h_rcs)
+   SHOW_RCS(project_h_rcs)
+   SHOW_RCS(showargs_h_rcs)
+   SHOW_RCS(showargs_rcs)
+   SHOW_RCS(ssplit_h_rcs)
+   SHOW_RCS(ssplit_rcs)
+#ifdef _WIN32
+#ifndef _WIN_CONSOLE
+   SHOW_RCS(w32log_h_rcs)
+   SHOW_RCS(w32log_rcs)
+   SHOW_RCS(w32res_h_rcs)
+   SHOW_RCS(w32rulesdlg_h_rcs)
+   SHOW_RCS(w32rulesdlg_rcs)
+   SHOW_RCS(w32taskbar_h_rcs)
+   SHOW_RCS(w32taskbar_rcs)
+#endif /* ndef _WIN_CONSOLE */
+   SHOW_RCS(win32_h_rcs)
+   SHOW_RCS(win32_rcs)
+#endif /* def _WIN32 */
+
+#undef SHOW_RCS
+
+   return(b);
+}
+
+/*********************************************************************
+ *
+ * Function    :  show_defines
+ *
+ * Description :  Create a string with all conditional #defines used
+ *                when building
+ *
+ * Parameters  :  None
+ *
+ * Returns     :  string 
+ *
+ *********************************************************************/
+char *show_defines(void)
+{
+   char *b = NULL;
+
+#ifdef FEATURE_PTHREAD
+   b = strsav(b, "  <li><code>#define <b>FEATURE_PTHREAD</b></code> - Support POSIX threads.</li>\n");
+#else
+   b = strsav(b, "  <li><code>#undef <b>FEATURE_PTHREAD</b></code> - No support POSIX threads.</li>\n");
+#endif
+
+#ifdef REGEX_GNU
+   b = strsav(b, "  <li><code>#define <b>REGEX_GNU</b></code> - Support for GNU style regular expressions in the path specs.</li>\n");
+#endif /* def REGEX_GNU */
+
+#ifdef REGEX_PCRE
+   b = strsav(b, "  <li><code>#define <b>REGEX_PCRE</b></code> - Support for pcre style regular expressions in the path specs.</li>\n");
+#endif /* def REGEX_PCRE */
+
+#ifndef REGEX
+   b = strsav(b, "  <li><code>#undef <b>REGEX</b></code> - No support for regular expressions in the path specs.</li>\n");
+#endif /* ndef REGEX */
+
+#ifdef STATIC_PCRE
+   b = strsav(b, "  <li><code>#define <b>STATIC_PCRE</b></code> - Using static built-in pcre rather than libpcre.</li>\n");
+#else /* ifndef STATIC_PCRE */
+   b = strsav(b, "  <li><code>#undef <b>STATIC_PCRE</b></code> - Using libpcre rather than static built-in pcre.</li>\n");
+#endif /* ndef STATIC_PCRE */
+
+#ifdef STATIC_PCRS
+   b = strsav(b, "  <li><code>#define <b>STATIC_PCRS</b></code> - Using static built-in pcrs rather than libpcrs.</li>\n");
+#else /* ifndef STATIC_PCRS */
+   b = strsav(b, "  <li><code>#undef <b>STATIC_PCRS</b></code> - Using libpcrs rather than static built-in pcrs.</li>\n");
+#endif /* ndef STATIC_PCRS */
+
+#ifdef TOGGLE
+   b = strsav(b, "  <li><code>#define <b>TOGGLE</b></code> - Allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.</li>\n");
+#else /* ifndef TOGGLE */
+   b = strsav(b, "  <li><code>#undef <b>TOGGLE</b></code> - Do not allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.</li>\n");
+#endif /* ndef TOGGLE */
+
+#ifdef FORCE_LOAD
+   b = strsav(b, "  <li><code>#define <b>FORCE_LOAD</b></code> - Enables bypassing filtering for a single page using the prefix \"" FORCE_PREFIX "\".</li>\n");
+#else /* ifndef FORCE_LOAD */
+   b = strsav(b, "  <li><code>#undef <b>FORCE_LOAD</b></code> - Disables bypassing filtering for a single page.</li>\n");
+#endif /* ndef FORCE_LOAD */
+
+#ifdef DENY_GZIP
+   b = strsav(b, "  <li><code>#define <b>DENY_GZIP</b></code> - Prevents requests from being compressed - required for PCRS on some sites.</li>\n");
+#else /* ifndef DENY_GZIP */
+   b = strsav(b, "  <li><code>#undef <b>DENY_GZIP</b></code> - Allows requests to be compressed if the browser and server support it.</li>\n");
+#endif /* ndef DENY_GZIP */
+
+#ifdef STATISTICS
+   b = strsav(b, "  <li><code>#define <b>STATISTICS</b></code> - Enables statistics function.</li>\n");
+#else /* ifndef STATISTICS */
+   b = strsav(b, "  <li><code>#undef <b>STATISTICS</b></code> - Disables statistics function.</li>\n");
+#endif /* ndef STATISTICS */
+
+#ifdef SPLIT_PROXY_ARGS
+   b = strsav(b, "  <li><code>#define <b>SPLIT_PROXY_ARGS</b></code> - Split this page up by placing the configuration files on separate pages.</li>\n");
+#else /* ifndef SPLIT_PROXY_ARGS */
+   b = strsav(b, "  <li><code>#undef <b>SPLIT_PROXY_ARGS</b></code> - This page contains the text of the configuration files, they are not split onto separate pages.</li>\n");
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+#ifdef KILLPOPUPS
+   b = strsav(b, "  <li><code>#define <b>KILLPOPUPS</b></code> - Enables killing JavaScript popups.</li>\n");
+#else /* ifndef KILLPOPUPS */
+   b = strsav(b, "  <li><code>#undef <b>KILLPOPUPS</b></code> - Disables killing JavaScript popups.</li>\n");
+#endif /* ndef KILLPOPUPS */
+
+#ifdef WEBDAV
+   b = strsav(b, "  <li><code>#define <b>WEBDAV</b></code> - Enables support for webDAV - e.g. stops Microsoft Outlook from accessing HotMail e-mail.</li>\n");
+#else /* ifndef WEBDAV */
+   b = strsav(b, "  <li><code>#undef <b>WEBDAV</b></code> - Disables support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail.</li>\n");
+#endif /* ndef WEBDAV */
+
+#ifdef DETECT_MSIE_IMAGES
+   b = strsav(b, "  <li><code>#define <b>DETECT_MSIE_IMAGES</b></code> - Enables detecting image requests automatically for MSIE.</li>\n");
+#else /* ifndef DETECT_MSIE_IMAGES */
+   b = strsav(b, "  <li><code>#undef <b>DETECT_MSIE_IMAGES</b></code> - Disables detecting image requests automatically for MSIE.</li>\n");
+#endif /* ndef DETECT_MSIE_IMAGES */
+
+#ifdef IMAGE_BLOCKING
+   b = strsav(b, "  <li><code>#define <b>IMAGE_BLOCKING</b></code> - Enables sending \"blocked\" images instead of HTML.</li>\n");
+#else /* ifndef IMAGE_BLOCKING */
+   b = strsav(b, "  <li><code>#undef <b>IMAGE_BLOCKING</b></code> - Disables sending \"blocked\" images instead of HTML.</li>\n");
+#endif /* ndef IMAGE_BLOCKING */
+
+#ifdef ACL_FILES
+   b = strsav(b, "  <li><code>#define <b>ACL_FILES</b></code> - Enables the use of ACL files to control access to the proxy by IP address.</li>\n");
+#else /* ifndef ACL_FILES */
+   b = strsav(b, "  <li><code>#undef <b>ACL_FILES</b></code> - Disables the use of ACL files to control access to the proxy by IP address.</li>\n");
+#endif /* ndef ACL_FILES */
+
+#ifdef TRUST_FILES
+   b = strsav(b, "  <li><code>#define <b>TRUST_FILES</b></code> - Enables the use of trust files.</li>\n");
+#else /* ifndef TRUST_FILES */
+   b = strsav(b, "  <li><code>#undef <b>TRUST_FILES</b></code> - Disables the use of trust files.</li>\n");
+#endif /* ndef TRUST_FILES */
+
+#ifdef JAR_FILES
+   b = strsav(b, "  <li><code>#define <b>JAR_FILES</b></code> - Enables the use of jar files to capture cookies.</li>\n");
+#else /* ifndef JAR_FILES */
+   b = strsav(b, "  <li><code>#undef <b>JAR_FILES</b></code> - Disables the use of jar files to capture cookies.</li>\n");
+#endif /* ndef JAR_FILES */
+
+#ifdef FAST_REDIRECTS
+   b = strsav(b, "  <li><code>#define <b>FAST_REDIRECTS</b></code> - Enables intercepting remote script redirects.</li>\n");
+#else /* ifndef FAST_REDIRECTS */
+   b = strsav(b, "  <li><code>#undef <b>FAST_REDIRECTS</b></code> - Disables intercepting remote script redirects.</li>\n");
+#endif /* ndef FAST_REDIRECTS */
+
+   return b;
+}
+
+
+/*
+  Local Variables:
+  tab-width: 3
+  end:
+*/
diff --git a/showargs.h b/showargs.h
new file mode 100644 (file)
index 0000000..48df831
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _SHOWARGS_H
+#define _SHOWARGS_H
+#define SHOWARGS_H_VERSION "$Id: showargs.h,v 1.4 2001/06/03 19:13:05 oes Exp $"
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/showargs.h,v $
+ *
+ * Purpose     :  Contains various utility routines needed to 
+ *                generate the show-proxy-args page.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: showargs.h,v $
+ *    Revision 1.4  2001/06/03 19:13:05  oes
+ *    moved stuff to cgi.c
+ *
+ *    Revision 1.3  2001/05/29 23:11:38  oes
+ *
+ *     - Moved strsav() from showargs to miscutil
+ *
+ *    Revision 1.2  2001/05/26 00:28:36  jongfoster
+ *    Automatic reloading of config file.
+ *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
+ *    Most of the global variables have been moved to a new
+ *    struct configuration_spec, accessed through csp->config->globalname
+ *    Most of the globals remaining are used by the Win32 GUI.
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:59:03  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void savearg(char *c, char *o, struct configuration_spec * config);
+extern char *show_rcs(void);
+extern char *show_defines(void);
+
+/* Revision control strings from this header and associated .c file */
+extern const char showargs_rcs[];
+extern const char showargs_h_rcs[];
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* ndef _SHOWARGS_H */
index ff36256..c0315bc 100644 (file)
--- a/ssplit.c
+++ b/ssplit.c
@@ -1,4 +1,4 @@
-const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
+const char ssplit_rcs[] = "$Id: ssplit.c,v 1.2 2001/05/17 23:01:01 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/ssplit.c,v $
@@ -6,7 +6,7 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
  * Purpose     :  A function to split a string at specified deliminters.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -32,18 +32,6 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
  *
  * Revisions   :
  *    $Log: ssplit.c,v $
- *    Revision 1.5  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.4  2001/11/13 00:16:38  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.3  2001/05/29 08:54:25  jongfoster
- *    Rewrote the innards of ssplit() to be easier to understand,
- *    faster, and to use less memory.  Didn't change the interface
- *    except to give the parameters meaningful names.
- *
  *    Revision 1.2  2001/05/17 23:01:01  oes
  *     - Cleaned CRLF's from the sources and related files
  *
@@ -59,6 +47,10 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
 #include <string.h>
 #include <stdlib.h>
 
+#ifdef _WIN32
+#include <malloc.h>
+#endif
+
 #include "ssplit.h"
 #include "miscutil.h"
 
index 397dda2..757a98e 100644 (file)
--- a/ssplit.h
+++ b/ssplit.h
@@ -1,6 +1,6 @@
-#ifndef SSPLIT_H_INCLUDED
-#define SSPLIT_H_INCLUDED
-#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.4 2002/03/24 13:25:43 swa Exp $"
+#ifndef _SSPLIT_H
+#define _SSPLIT_H
+#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.1.1.1 2001/05/15 13:59:04 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/ssplit.h,v $
@@ -8,7 +8,7 @@
  * Purpose     :  A function to split a string at specified deliminters.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: ssplit.h,v $
- *    Revision 1.4  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.3  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.2  2001/05/29 08:54:25  jongfoster
- *    Rewrote the innards of ssplit() to be easier to understand,
- *    faster, and to use less memory.  Didn't change the interface
- *    except to give the parameters meaningful names.
- *
  *    Revision 1.1.1.1  2001/05/15 13:59:04  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -68,7 +56,7 @@ extern const char ssplit_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef SSPLIT_H_INCLUDED */
+#endif /* ndef _SSPLIT_H */
 
 /*
   Local Variables:
index 9097b52..4d0d77e 100644 (file)
@@ -1,12 +1,12 @@
 ##########################################################
 #
-# "Blocked" Error Output template for Privoxy.
+# "Blocked" Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
 # ---------------------
 #
-# Template files are written in plain HTML, with a few
+# Template files are written win plain HTML, with a few
 # additions:
 # 
 # - Lines that start with a '#' character like this one
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
 #
 #
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  force-support:
-#    Privoxy has been compiled with support for forced loading
+#    Junkbuster has been compiled with support for forced loading
 #    of blocked content. In that case, the symbol "force-prefix" is
 #    avaiable, which translates to the FORCE_PREFIX  
 #
 <html>
 
 <head>
-  <title>Request blocked (Privoxy@@my-hostname@)</title>
+  <title>Request blocked (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>BLOCKED</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
+      </td>
+    </tr>
+
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
+<!-- if-unstable-end@ -->
 
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>Request for blocked URL</h2>
         <blockquote>
-          <p>Your request for <b>@hostport@@path@</b> was blocked.
-            <br><a href="@default-cgi@show-url-info?url=@hostport@@path@">See why</a>
+          <p>Your request for <b>@hostport-html@@path-html@</b> was blocked.
+            <br><a href="@default-cgi@/show-url-info?url=@hostport@@path@">See why</a>
     <!-- @if-force-support-start -->
             or <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>.
 <!-- if-force-support-end@ -->
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
index f0ff59f..6b9871d 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# "Blocked" Error Output template for Privoxy.
+# "Blocked" Error Output template for junkbuster 2.9.x.
 # Compact variant.
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
 #
 #
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
+#  have-proxy-info:
+#    A URL for online documentation about this proxy has been
+#    specified and is available through the "proxy-info-url"
+#    symbol
 #  force-support:
-#    Privoxy has been compiled with support for forced loading
+#    Junkbuster has been compiled with support for forced loading
 #    of blocked content. In that case, the symbol "force-prefix" is
 #    avaiable, which translates to the FORCE_PREFIX  
 #
 <html>
 
   <head>
-    <title>Request blocked (Privoxy@@my-hostname@)</title>
+    <title>Request blocked (Junkbuster@@my-hostname@)</title>
     <style type="text/css">
       BODY, P { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
     </style>
@@ -74,8 +82,8 @@
 
   <body bgcolor="#ffffff">
 
-    <p align=center>Your request for <b>@hostport@@path@</b> was blocked.
-      <br><a href="@default-cgi@show-url-info?url=@hostport@@path@">See why</a>
+    <p align=center>Your request for <b>@hostport-html@@path-html@</b> was blocked.
+      <br><a href="@default-cgi@/show-url-info?url=@hostport@@path@">See why</a>
       <!-- @if-force-support-start -->
       or <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>.
       <!-- if-force-support-end@ -->
diff --git a/templates/cgi-error-404 b/templates/cgi-error-404
deleted file mode 100644 (file)
index c7e51da..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>404 - Privoxy Configuration Page not found</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#ff0000>
-        <p><font size=+5 color=#ffffff><b>404</b></font></p>
-      </td>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee colspan=2>
-        <h2>Privoxy Configuration page not found</h2>
-          <blockquote>
-            <p>You typed in what looks like a URL used to configure
-               Privoxy, but it cannot be recognised.  Maybe it's
-               for a different Privoxy version, or you typed it
-               in wrong?  Or maybe the Privoxy administrator
-               has decided to disable the feature.</p>
-            <p>If you got here by clicking a link in the
-               configuration interface, please file a bug report!</p>
-            <p>You can use the menu below to select from the available
-               configuration options</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-bad-param b/templates/cgi-error-bad-param
deleted file mode 100644 (file)
index 699b704..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: Bad parameter</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Bad parameter to Privoxy configuration page</h2>
-        <blockquote>
-          <p>You've found a page used to configure Privoxy, but the
-             parameters (the part of the web page address after the
-             "?" mark) are wrong or missing.</p>
-          <p>Possible causes:</p>
-          <ul>
-            <li>If you just typed a URL pattern into a form, then you got
-               something wrong.  Press the "back" button on your browser
-               once and correct what you typed.</li>
-            <li>If you tried to type in the URL, then you've found a
-               page where you can't do that.  You can only view this
-               page by following links from elsewhere in the configuration
-               interface.</li>
-            <li>If you got here using your browser's "back" button, then
-               that is deliberately disabled for this page.</li>
-            <li>If you got here by clicking a link in the
-               configuration interface, please file a bug report!</li>
-          </ul>
-          <p>You can use the menu below to select from the available
-             configuration options</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-disabled b/templates/cgi-error-disabled
deleted file mode 100644 (file)
index bfe6715..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Configuration Page Disabled</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Privoxy Configuration page diasabled</h2>
-          <blockquote>
-            <p>The Privoxy administrator has decided to disable this 
-               feature.  If you want to use it, you must ask them to
-               enable it.</p>
-            <p>If you are the Privoxy administrator, you can enable
-               this feature by changing the appropriate line in your
-               configuration file.</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-file b/templates/cgi-error-file
deleted file mode 100644 (file)
index d9d0d6a..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: Actions file not found</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Actions file not found</h2>
-        <blockquote>
-          <p>The actions file you are trying to edit (<code>@f@.action</code>)
-             does not exist, or cannot be read.</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-modified b/templates/cgi-error-modified
deleted file mode 100644 (file)
index af5e5af..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: URL out of date</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>URL out of date - file has changed since it was generated</h2>
-        <blockquote>
-          <p>The URL you're viewing is out of date.  To prevent possible
-             damage to your configuration file, this action has been ignored.
-             </p>
-          <p>Possible causes:</p>
-          <ul>
-            <li>If you got here using your browser's "back" button, then
-               that is deliberately disabled for this page.  Please 
-               navigate around the configuration editor using the
-               links provided.</li>
-            <li>Perhaps you've got more than one browser window open, and
-               you're trying to change the same file in both?  You can
-               only have one editor window open at a time.  Your other edit
-               window should continue to function.</li>
-            <li>You may have modified the file some other way - perhaps by
-               editing it with a text editor.  Simply go back in to the 
-               configuration interface using the links below.</li>
-          </ul>
-          <p>You can go back into the edit interface using the menu below,
-             or by clicking <a 
-             href="edit-actions-list?f=@f@"
-             >here</a>.</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-parse b/templates/cgi-error-parse
deleted file mode 100644 (file)
index f96bc9c..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: Parse error</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Parse error</h2>
-        <blockquote>
-          <p>The file you're trying to edit is not valid.  You need to fix
-             it using a text editor before you can edit it using the
-             web-based editor.</p>
-          <p>This error should only occur if you edited the file using a text
-             editor.  If you managed to take a valid file and break it this
-             badly using the web-based editor, please file a bug report!</p>
-          <p>When you've fixed the problem, you can go back into the edit
-             interface using the menu below, or by clicking <a 
-             href="edit-actions-list?f=@f@">here</a>.</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Problem description:</h2>
-        <p>@parse-error@</p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>The line which caused the problem:</h2>
-        <pre>@line-raw@</pre>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>The line which caused the problem, with comments removed</h2>
-        <p><code>@line-data@</code></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Note</h2>
-        <p>Only the first error is reported - the file may contain other
-           errors, as well as the one reported above.</p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
index 5646891..d60b1bb 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# No-Such-Domain Error Output template for Privoxy.
+# No-Such-Domain Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #    The IP address of the host that could not be reached
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
 #
 #
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>503 - Connect failed (Privoxy@@my-hostname@)</title>
+  <title>503 - Connect failed (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>503</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
+      </td>
+    </tr>
+
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
+<!-- if-unstable-end@ -->
 
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>Connect failed</h2>
           <blockquote>
-            <p>Your request for <b>http://@hostport@@path@</b> could not be fulfilled, because the connection
-              to <b>@host@</b> (@host-ip@) could not be established.</p>
+            <p>Your request for <b>http://@hostport-html@@path-html@</b> could not be fulfilled, because the connection
+              to <b>@host-html@</b> (@host-ip@) could not be established.</p>
             <p>This is often a temporary failiure, so you might just
               <a href="http://@hostport@@path@">try again</a>.</p>
           </blockquote>
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
index 263a1c5..b4e4b7b 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Default-CGI Output template for Privoxy.
+# Default-CGI Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@</title>
+  <title>Junkbuster@@my-hostname@</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <p><b>Thank you for using <a href="@homepage@">Privoxy!</a></b></p>
-        <p>Please choose from the following options:</p>
-        <ul>@menu@</ul>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
 # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
     <tr>
       <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
           <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
         </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
 <!-- if-unstable-end@ -->
 
-<!-- @if-have-help-info-start -->
+    <tr>
+      <td bgcolor=#eeeeee>
+        <p><b>Thank you for using <a href="@homepage@">the SourceForge edition</a> of Internet Junkbuster!</b></p>
+        <p>Please choose from the following options:</p>
+        <ul>@menu@</ul>
+      </td>
+    </tr>
+
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
diff --git a/templates/edit-actions-add-url-form b/templates/edit-actions-add-url-form
deleted file mode 100644 (file)
index d690c86..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-add-url-form,v $
-#
-# Purpose     :  Template used to add a URL pattern to the actions file.
-#
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-add-url-form,v $
-#    Revision 1.9  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.8  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.7  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.6  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.5  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.4  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.3  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.2  2002/01/17 21:21:03  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.1  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# section
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit URL Pattern</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-</style>
-
-<script type="text/javascript">
-<!--
-function validate(text)
-{
-  if (text=="")
-  {
-    alert("You need to type a pattern in order to continue!");
-    return false;
-  }
-
-  return true;
-}
-//-->
-</script>
-
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="light">
-      <h2>Add URL Pattern</h2>
-      <form method="GET" action="edit-actions-add-url"
-            onSubmit="return validate(u.value);">
-        <p>
-          <input type="hidden" name="f" value="@f@">
-          <input type="hidden" name="v" value="@v@">
-          <input type="hidden" name="s" value="@s@">
-          <input type="text" name="u" value="" size="78"><br>
-          <input type="submit" value="Submit"> &nbsp;
-          <input type="reset" value="Reset"> &nbsp;
-          <a href="edit-actions-list?f=@f@">Cancel</a>
-        </p>
-      </form>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
-
diff --git a/templates/edit-actions-for-url b/templates/edit-actions-for-url
deleted file mode 100644 (file)
index 93cc322..0000000
+++ /dev/null
@@ -1,815 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-for-url,v $
-#
-# Purpose     :  Template used to edit the actions associated with a
-#                particular section in an actions file.
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-for-url,v $
-#    Revision 1.18  2002/03/24 16:32:08  jongfoster
-#    Removing logo option
-#
-#    Revision 1.17  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.16  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.15  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.14  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.13  2002/03/16 14:28:38  jongfoster
-#    First version of modular filters support
-#
-#    Revision 1.12  2002/03/12 01:42:50  oes
-#    Introduced modular filters
-#
-#    Revision 1.11  2002/03/08 18:19:14  jongfoster
-#    Adding +image-blocker{pattern} option to edit interface
-#
-#    Revision 1.10  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.9  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.8  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.7  2002/01/17 21:21:03  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.6  2001/11/22 21:58:41  jongfoster
-#    Adding action +no-cookies-keep
-#
-#    Revision 1.5  2001/11/13 21:12:17  jongfoster
-#    Added support for the following actions:
-#    +downgrade, +limit-connect, +no-compression
-#
-#    Revision 1.4  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Browser support for the JavaScript on this page:
-#   MS Internet Explorer 5.5 - Tested,   Yes
-#   Netscape 6.0             - Tested,   Yes
-#   Netscape 4.75            - Tested,   NO
-#   Opera 5.12               - Tested,   NO
-#   MS Internet Explorer 4+  - Untested, Yes
-#   MS IE 3.x, NS3.x         - Untested, NO
-#   Mozilla >=0.6            - Untested, Yes
-#
-# All browsers should work, you just might not get the pretty DHTML effects.
-#
-# The effects that only work under the browsers marked "Yes" above are:
-#  - Text edit boxes that won't have any effect are disabled.
-#  - Table rows containing additional settings are hidden if the feature in
-#    question is disabled.
-#
-# There are major kludges to get around these problems with NS4, but they
-# screw up the HTML too much for other browsers.  If anyone wants to try,
-# here's some descriptions of the kludges:
-#    http://www.webreference.com/js/tips/991114.html
-#    http://www.webreference.com/dhtml/column12/outDisplay.html
-#
-# If you're favorite browser isn't listed, please test and add it.
-#
-#
-#############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# action-name-y
-# action-name-n
-# action-name-x
-#
-# deanimate-gifs-param-first
-# deanimate-gifs-param-last
-# hide-from-param-block
-# hide-from-param-custom
-# hide-from-param
-# hide-referer-param-forge
-# hide-referer-param-block
-# hide-referer-param-custom
-# hide-referer-param
-# hide-user-agent-param
-# image-blocker-param-pattern
-# image-blocker-param-blank
-# image-blocker-param-custom
-#
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit actions</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.action    { font-weight: bold;
-               font-style: italic;
-               white-space: nowrap       }
-td.subaction { font-style: italic        }
-th           { font-weight: bold;        }
-# This is the key to the color names below:
-# bg=background, en="Enable", dis="Disable", noc="No Change", hdr=header
-# 1=odd rows, 2=even rows, h=Table header
-tr.hdr       { background-color: #999999 }
-tr.bg1       { background-color: #eeeeee }
-td.en1       { background-color: #eeffee }
-td.dis1      { background-color: #ffeeee }
-td.noc1      { background-color: #eeeeff }
-tr.bg2       { background-color: #dddddd }
-td.en2       { background-color: #ddffdd }
-td.dis2      { background-color: #ffdddd }
-td.noc2      { background-color: #ddddff }
-th.enh       { background-color: #99ff99 }
-th.dish      { background-color: #ff9999 }
-th.noch      { background-color: #9999ff }
-table.wide   { border-color: white;
-               border-style: solid;
-               border-left-width: 10px;
-               border-right-width: 10px;
-               border-top-width: 0px;
-               border-bottom-width: 0px  }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-td.green     { background-color: #ddffdd }
-</style>
-
-<script type="text/javascript">
-<!--
-
-function hide_from_param_disable(tf)
-{
-    if (document.getElementById) {
-       // NS6 or IE5
-        document.getElementById("hide_from_param").disabled = tf;
-    } else if (document.all) {
-        // IE4
-        document.myform.hide_from_param.disabled = tf;
-    }
-}
-
-function hide_referer_param_disable(tf)
-{
-    if (document.getElementById) {
-        document.getElementById("hide_referer_param").disabled = tf;
-    } else if (document.all) {
-        document.myform.hide_referer_param.disabled = tf;
-    }
-}
-
-function image_blocker_param_disable(tf)
-{
-    if (document.getElementById) {
-        document.getElementById("image_blocker_param").disabled = tf;
-    } else if (document.all) {
-        document.myform.image_blocker_param.disabled = tf;
-    }
-}
-
-function show_add_header_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("add_header_opts");
-    } else if (document.all) {
-        target = document.add_header_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_deanimate_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("deanimate_opts");
-    } else if (document.all) {
-        target = document.deanimate_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_hide_from_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("hide_from_opts");
-    } else if (document.all) {
-        target = document.hide_from_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_hide_referer_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("hide_referer_opts");
-    } else if (document.all) {
-        target = document.hide_referer_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_user_agent_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("user_agent_opts");
-    } else if (document.all) {
-        target = document.user_agent_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_image_blocker_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("image_blocker_opts");
-    } else if (document.all) {
-        target = document.image_blocker_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_limit_connect_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("limit_connect_opts");
-    } else if (document.all) {
-        target = document.limit_connect_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_wafer_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("wafer_opts");
-    } else if (document.all) {
-        target = document.wafer_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-//-->
-</script>
-</head>
-
-<body>
-
-<form method="GET" action="edit-actions-submit" id="myform" name="myform">
-
-  <table cellpadding="20" cellspacing="10" border="0" width="100%">
-    <tr>
-      <td class="dark">
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td class="light">
-        <h2>Edit Actions
-          <input type="hidden" name="f" value="@f@">
-          <input type="hidden" name="v" value="@v@">
-          <input type="hidden" name="s" value="@s@">
-        </h2>
-      </td>
-    </tr>
-  </table>
-
-  <table border="0" width="100%" cellspacing="2" class="wide">
-    <tr class="hdr" align="left">
-      <th class="enh" align="center">Enable</th>
-      <th class="dish" align="center">Disable</th>
-      <th class="noch" align="center">No Change</th>
-      <th>Action</th>
-      <th>Description</th>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="add_header" id="add_header_y" value="Y" @add-header-y@
-        onclick="show_add_header_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="add_header" value="N" @add-header-n@
-        onclick="show_add_header_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="add_header" value="X" @add-header-x@
-        onclick="show_add_header_opts(false)"></td>
-      <td class="action">+add-header</td>
-      <td>Adds HTTP headers.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="add_header_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Editing the settings for this option, or turning
-        it on if it was off, is not yet supported using this web-based
-        editor.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="block" value="Y" @block-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="block" value="N" @block-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="block" value="X" @block-x@
-        ></td>
-      <td class="action">+block</td>
-      <td>Block the request</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="deanimate_gifs" id="deanimate_gifs_y" value="Y" @deanimate-gifs-y@
-        onclick="show_deanimate_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="deanimate_gifs" value="N" @deanimate-gifs-n@
-        onclick="show_deanimate_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="deanimate_gifs" value="X" @deanimate-gifs-x@
-        onclick="show_deanimate_opts(false)"></td>
-      <td class="action">+deanimate-gifs</td>
-      <td>Replace animated GIFs with their (first/last) frame.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="deanimate_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Use the <input type="radio" name="deanimate_gifs_mode"
-        value="first" id="deanimate_first" @deanimate-gifs-param-first@><label
-        for="deanimate_first">first frame</label>&nbsp;&nbsp; <input
-        type="radio" name="deanimate_gifs_mode" value="last" 
-        id="deanimate_last" @deanimate-gifs-param-last@><label
-        for="deanimate_last">last frame</label></td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="fast_redirects" value="Y" @fast-redirects-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="fast_redirects" value="N" @fast-redirects-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="fast_redirects" value="X" @fast-redirects-x@
-        ></td>
-      <td class="action">+fast-redirects</td>
-      <td>Bypass some tracking URLs.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="downgrade" value="Y" @downgrade-y@></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="downgrade" value="N" @downgrade-n@></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="downgrade" value="X" @downgrade-x@></td>
-      <td class="action">+downgrade</td>
-      <td>Change HTTP/1.1 requests to HTTP/1.0.  Only change if you know
-        what you're doing!</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td class="action">+filter</td>
-      <td>Filter the website through regular expression filters.
-        You can enable or disable the filters individually.</td>
-    </tr>
-
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="filter_all" id="filter_all_n" value="N" @filter-all-n@ ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="filter_all" id="filter_all_x" value="X" @filter-all-x@ ></td>
-      <td class="subaction" colspan="2">&nbsp;&nbsp;All filters applied by previous rules</td>
-    </tr>
-@filter-params@
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="hide_forwarded" value="Y" @hide-forwarded-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="hide_forwarded" value="N" @hide-forwarded-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="hide_forwarded" value="X" @hide-forwarded-x@
-        ></td>
-      <td class="action">+hide-forwarded</td>
-      <td>Block any existing X-Forwarded-for header, and do not add a new one.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="hide_from" id="hide_from_y" value="Y" @hide-from-y@
-        onclick="show_hide_from_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="hide_from" value="N" @hide-from-n@
-        onclick="show_hide_from_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="hide_from" value="X" @hide-from-x@
-        onclick="show_hide_from_opts(false)"></td>
-      <td class="action">+hide-from</td>
-      <td>Stop old web browsers from sending the user's e-mail address with
-        every request.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="hide_from_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td><input type="radio" name="hide_from_mode" value="block"
-        onclick="hide_from_param_disable(true);"
-        @hide-from-param-block@ id="from_mode_block"><label
-        for="from_mode_block">Remove completely</label><br>
-        <input type="radio" name="hide_from_mode" value="CUSTOM" 
-        onclick="hide_from_param_disable(false);"
-        @hide-from-param-custom@ id="from_mode_set"><label
-        for="from_mode_set">Fake e-mail address:</label><br>
-        <input type="text" name="hide_from_param" id="hide_from_param"
-        size="40" value="@hide-from-param@"></td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="hide_referer" id="hide_referer_y" value="Y" @hide-referer-y@
-        onclick="show_hide_referer_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="hide_referer" id="hide_referer_n" value="N" @hide-referer-n@
-        onclick="show_hide_referer_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="hide_referer" id="hide_referer_x" value="X" @hide-referer-x@
-        onclick="show_hide_referer_opts(false)"
-        ></td>
-      <td class="action">+hide-referer</td>
-      <td>Helps prevent tracking by not sending the URL of the previous web
-        page.&nbsp;</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="hide_referer_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td><input type="radio" name="hide_referer_mode" value="block"
-        onclick="hide_referer_param_disable(true)"
-        @hide-referer-param-block@ id="referer_mode_block"><label
-        for="referer_mode_block">Remove completely</label> (breaks images
-        on some free web hosts).<br>
-        <input type="radio" name="hide_referer_mode" value="forge"
-        onclick="hide_referer_param_disable(true)"
-        @hide-referer-param-forge@ id="referer_mode_forge"><label
-        for="referer_mode_forge">Fake as the root directory of the
-        site</label> (fools checks for in-site links.)<br>
-        <input type="radio" name="hide_referer_mode" value="CUSTOM"
-        onclick="hide_referer_param_disable(false)"
-        @hide-referer-param-custom@ id="referer_mode_set"><label
-        for="referer_mode_set">Fake as this web address:</label><br>
-        <input type="text" name="hide_referer_param" 
-        id="hide_referer_param" size="40"
-        value="@hide-referer-param@"></td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="hide_user_agent" id="hide_user_agent_y" value="Y" @hide-user-agent-y@
-        onclick="show_user_agent_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="hide_user_agent" value="N" @hide-user-agent-n@
-        onclick="show_user_agent_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="hide_user_agent" value="X" @hide-user-agent-x@
-        onclick="show_user_agent_opts(false)"></td>
-      <td class="action">+hide-user-agent</td>
-      <td>Pretend to be using a different web browser.&nbsp; (Breaks many web
-        sites).</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="user_agent_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>User Agent string to send:<br>
-        <input type="text" name="hide_user_agent_mode" size="40"
-        value="@hide-user-agent-param@"></td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="image" value="Y" @image-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="image" value="N" @image-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="image" value="X" @image-x@
-        ></td>
-      <td class="action">+image</td>
-      <td>Request is for an image (only useful in conjunction with the <i><b>+block</b></i>
-        and <i><b>+image-blocker</b></i> options).</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="image_blocker" id="image_blocker_y" value="Y" @image-blocker-y@
-        onclick="show_image_blocker_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="image_blocker" value="N" @image-blocker-n@
-        onclick="show_image_blocker_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="image_blocker" value="X" @image-blocker-x@
-        onclick="show_image_blocker_opts(false)"></td>
-      <td class="action">+image-blocker</td>
-      <td>Specifies how to block images.&nbsp; Disable to always send a HTML
-        &quot;blocked&quot; page.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="image_blocker_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td><input type="radio" name="image_blocker_mode"
-        onclick="image_blocker_param_disable(true)"
-        value="pattern" id="image_blocker_mode_pattern"
-        @image-blocker-param-pattern@><label
-        for="image_blocker_mode_pattern">Send a pattern (<img
-        src="send-banner?type=p" width="12" height="12"
-        alt="pattern">)</label><br>
-        <input type="radio" name="image_blocker_mode" value="blank"
-        onclick="image_blocker_param_disable(true)"
-        id="image_blocker_mode_blank" @image-blocker-param-blank@><label 
-        for="image_blocker_mode_blank">Send a 1x1 transparent GIF</label><br>
-        <input type="radio" name="image_blocker_mode" value="CUSTOM"
-        onclick="image_blocker_param_disable(false)"
-        id="image_blocker_mode_set" @image-blocker-param-custom@><label
-        for="image_blocker_mode_set">Redirect
-        the browser to this image URL:</label><br>
-        <input type="text" name="image_blocker_param" id="image_blocker_param"
-        size="40" value="@image-blocker-param@"></td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="limit_connect" id="limit_connect_y" value="Y" @limit-connect-y@
-        onclick="show_limit_connect_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="limit_connect" value="N" @limit-connect-n@
-        onclick="show_limit_connect_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="limit_connect" value="X" @limit-connect-x@
-        onclick="show_limit_connect_opts(false)"></td>
-      <td class="action">+limit-connect</td>
-      <td>Specify which ports are allowed for SSL (HTTP CONNECT) access.
-        Note that this allows arbitrary tunnelling, so opening all
-        ports would be a security hole.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="limit_connect_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Legal SSL ports (comma separated, ranges allowed):<br>
-        <input type="text" name="limit_connect_mode" size="40"
-        value="@limit-connect-param@"></td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="no_compression" value="Y" @no-compression-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="no_compression" value="N" @no-compression-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="no_compression" value="X" @no-compression-x@
-        ></td>
-      <td class="action">+no-compression</td>
-      <td>Disables compression.  Compressed web pages are faster to
-        download, but cannot be filtered with +filter or +no-popups.
-        This setting only affects the few web sites which support
-        compression.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_keep" value="Y" @no-cookies-keep-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_keep" value="N" @no-cookies-keep-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_keep" value="X" @no-cookies-keep-x@
-        ></td>
-      <td class="action">+no-cookies-keep</td>
-      <td>Any cookies set by the website are changed to temporary
-        ("per-session") ones, which only last until you close your web
-        browser.  This will allow you to use sites that require cookies, but
-        sites will not be able to track you across sessions.  For this to
-        be useful, you should disable <b><i>no-cookies-read</i></b> and
-        <b><i>no-cookies-set</i></b>.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="no_cookies_read" value="Y" @no-cookies-read-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="no_cookies_read" value="N" @no-cookies-read-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="no_cookies_read" value="X" @no-cookies-read-x@
-        ></td>
-      <td class="action">+no-cookies-read</td>
-      <td>Prevent the website from reading cookies.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_set" value="Y" @no-cookies-set-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_set" value="N" @no-cookies-set-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_set" value="X" @no-cookies-set-x@
-        ></td>
-      <td class="action">+no-cookies-set</td>
-      <td>Prevent the website from setting cookies.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="no_popups" value="Y" @no-popups-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="no_popups" value="N" @no-popups-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="no_popups" value="X" @no-popups-x@
-        ></td>
-      <td class="action">+no-popups</td>
-      <td>Filter the website through a built-in filter to disable JavaScript
-        pop-up windows.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="vanilla_wafer" value="Y" @vanilla-wafer-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="vanilla_wafer" value="N" @vanilla-wafer-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="vanilla_wafer" value="X" @vanilla-wafer-x@
-        ></td>
-      <td class="action">+vanilla-wafer</td>
-      <td>If you use a jarfile, automatically adds a special wafer.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="wafer" id="wafer_y" value="Y" @wafer-y@
-        onclick="show_wafer_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="wafer" id="wafer_n" value="N" @wafer-n@
-        onclick="show_wafer_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="wafer" id="wafer_x" value="X" @wafer-x@
-        onclick="show_wafer_opts(false)"></td>
-      <td class="action">+wafer</td>
-      <td>Adds user-specified cookies.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="wafer_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Editing the settings for this option, or turning
-        it on if it was off, is not yet supported using this web-based
-        editor.</td>
-    </tr>
-  </table>
-
-
-<script type="text/javascript">
-<!--
-
-if (document.getElementById) {
-    // alert("Netscape 6 or IE5");
-    document.getElementById("hide_from_param").disabled = !(document.getElementById("from_mode_set").checked);
-    document.getElementById("hide_referer_param").disabled = !(document.getElementById("referer_mode_set").checked);
-    document.getElementById("image_blocker_param").disabled = !(document.getElementById("image_blocker_mode_set").checked);
-
-    show_add_header_opts    (document.getElementById("add_header_y").checked);
-    show_deanimate_opts     (document.getElementById("deanimate_gifs_y").checked);
-    show_hide_from_opts     (document.getElementById("hide_from_y").checked);
-    show_hide_referer_opts  (document.getElementById("hide_referer_y").checked);
-    show_user_agent_opts    (document.getElementById("hide_user_agent_y").checked);
-    show_image_blocker_opts (document.getElementById("image_blocker_y").checked);
-    show_limit_connect_opts (document.getElementById("limit_connect_y").checked);
-    show_wafer_opts         (document.getElementById("wafer_y").checked);
-} else if (document.all) {
-    // alert("IE4");
-    document.myform.hide_from_param.disabled = !(document.myform.from_mode_set.checked);
-    document.myform.hide_referer_param.disabled = !(document.myform.referer_mode_set.checked);
-    document.myform.image_blocker_param.disabled = !(document.myform.image_blocker_mode_set.checked);
-
-    show_add_header_opts    (document.myform.add_header_y.checked);
-    show_deanimate_opts     (document.myform.deanimate_gifs_y.checked);
-    show_hide_from_opts     (document.myform.hide_from_y.checked);
-    show_hide_referer_opts  (document.myform.hide_referer_y.checked);
-    show_user_agent_opts    (document.myform.hide_user_agent_y.checked);
-    show_image_blocker_opts (document.myform.image_blocker_y.checked);
-    show_limit_connect_opts (document.myform.limit_connect_y.checked);
-    show_wafer_opts         (document.myform.wafer_y.checked);
-} else if (document.layers) {
-    // alert("Netscape 4");
-}
-//-->
-</script>
-
-  <table cellpadding="20" cellspacing="10" border="0" width="100%">
-    <tr>
-      <td class="green" align="center">
-        <p><input type="submit" value="Submit" name="Submit"></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td class="dark">
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-    <tr>
-      <td>
-        <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-      </td>
-    </tr>
-
-  </table>
-</form>
-
-</body>
-
-</html>
-
diff --git a/templates/edit-actions-for-url-filter b/templates/edit-actions-for-url-filter
deleted file mode 100644 (file)
index 06020cb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<tr class="bg2" align="left" valign="top">\r
-  <td class="en2" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="Y" @this-filter-y@></td>\r
-  <td class="dis2" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="N" @this-filter-n@></td>\r
-  <td class="noc2" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="X" @this-filter-x@></td>\r
-  <td class="subaction" colspan="2">&nbsp;&nbsp;@description@ (@name@) <input type="hidden" name="filter_n@index@" value="@name@"></td>\r
-</tr>\r
diff --git a/templates/edit-actions-list b/templates/edit-actions-list
deleted file mode 100644 (file)
index 24d6295..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-list,v $
-#
-# Purpose     :  Template used to edit the actions file.
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-list,v $
-#    Revision 1.13  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.12  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.11  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.10  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.9  2002/03/05 00:24:51  jongfoster
-#    Patch to always edit the current actions file.
-#
-#    Revision 1.8  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.7  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.6  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.5  2002/01/17 21:21:05  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.4  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Browser support for the CSS on this page:
-#   MS Internet Explorer 5.5 - Yes - everything works.
-#   Netscape 6.2             - Yes - everything works.
-#   Netscape 4.75            - No  - CSS buttons look really bad, but they are
-#                                    usable.  Everything else works.
-#   Opera 5.12               - Yes - everything works.
-#   MS Internet Explorer 4+  - Untested
-#   MS IE 3.x, NS3.x         - Untested (Don't support CSS, so everything
-#                              should work, but will look ugly).
-#   Mozilla >=0.6            - Untested
-#
-# All browsers should work, you just might not get the pretty CSS buttons.
-#
-# If you're favorite browser isn't listed/tested, please test and add it.
-#
-#
-#############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-#
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit actions file</title>
-
-<style type="text/css">
-body {
-  font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-  background-color: #ffffff;
-  color: #000000;
-}
-td.light {
-  background-color: #eeeeee;
-}
-td.dark {
-  background-color: #dddddd;
-}
-table.wide {
-  border-color: white;
-  border-style: solid;
-  border-left-width: 10px;
-  border-right-width: 10px;
-  border-top-width: 0px;
-  border-bottom-width: 0px;
-}
-tr.actions {
-  background-color: #eeffee;
-}
-tr.url1 {
-  background-color: #d0d0ff;
-}
-tr.url2 {
-  background-color: #eeeeff;
-}
-tr.rule {
-  background-color: #c0c0c0;
-  height: 3px;
-  max-height: 3px;
-  font-size: 1px
-}
-tr.adv {
-  background-color: #FFFFD0;
-}
-td.header {
-  font-weight: bold;
-}
-td.url {
-  font-weight: bold;
-}
-td.action {
-  font-weight: bold;
-  font-style: italic;
-}
-td.nbr {
-  white-space: nowrap;
-}
-a.cmd, div.buttons a {
-  white-space: nowrap;
-  width: auto;
-  padding: 2px;
-  background-color: #dddddd;
-  color:            #000000;
-  text-decoration: none;
-  border-top:    1px solid #ffffff;
-  border-left:   1px solid #ffffff;
-  border-bottom: 1px solid #000000;
-  border-right:  1px solid #000000;
-}
-a.cmd:hover, div.buttons a:hover {
-  background-color: #eeeeee;
-}
-a.cmd:active, div.buttons a:active {
-  border-top:    1px solid #000000;
-  border-left:   1px solid #000000;
-  border-bottom: 1px solid #ffffff;
-  border-right:  1px solid #ffffff;
-}
-
-</style>
-
-<script type="text/javascript">
-<!--
-function not_yet()
-{
-   window.alert("The feature you are trying to use has not been implemented yet.");
-}
-
-// Non-JS capable browsers will follow the link to a HTML "are you sure?" page
-// JavaScript-capable browsers will call this function, which does a
-// client-side prompt for speed.  It may kick off the delete directly.
-// It always returns false to cancel following the link.
-function rm_p(pattern,curtext)
-{
-   if (window.confirm("Are you sure you want to delete this URL pattern?\nPattern is: "+unescape(curtext)))
-   { window.location.href="edit-actions-remove-url?f=@f@&v=@v@&p="+pattern+"#l"+pattern; }
-   return false;
-}
-
-//-->
-</script>
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-</table>
-
-<div class="buttons">
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="light">
-      <h2>Editing Actions File</h2>
-      <p><a class="cmd" href="edit-actions-section-add?f=@f@&amp;v=@v@&amp;s=0">Insert new section at top</a></p>
-    </td>
-  </tr>
-</table>
-
-@sections@
-
-</div>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
diff --git a/templates/edit-actions-list-section b/templates/edit-actions-list-section
deleted file mode 100644 (file)
index 2de8ce2..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-section,v $
-#
-# Purpose     :  Template which forms part of edit-actions-list
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-list-section,v $
-#    Revision 1.6  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.5  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.4  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.3  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# sectionid
-# urls
-#
-#############################################################################
-#
-# ** Important note: **
-#
-# It is important to keep this file small.  That's why all the
-# identifiers in the HTML are short and cryptic.  Currently, the main
-# edit-actions page is ~300k.  Before it was optimized, it was ~550k.
-#
-#############################################################################
-<table border="0" width="100%" cellspacing="0" cellpadding="3" class="wide">
-<tr class="actions" valign="top">
- <td class="header" align="right">Actions:</td>
- <td align="center"><a name="l@s@" href="eas?f=@f@&amp;v=@v@&amp;s=@s@">Edit</a></td>
- <td class="action" align="left">@actions@</td>
-</tr>
-<tr class="rule">
- <td colspan="3"><img src="t" width="2" height="1" alt="----"></td>
-</tr>
-<tr class="url1" valign="top">
- <td class="header" align="right">URLs:</a></td>
- <td align="center"><a href="eaa?f=@f@&amp;v=@v@&amp;s=@s@">Add</a></td>
- <td align="left">&nbsp;</td>
-</tr>
-@urls@
-<tr class="rule">
- <td colspan="3"><img src="t" width="2" height="1" alt="-"></td>
-</tr>
-<tr class="adv" valign="top">
- <td class="header" align="right"><b>Advanced:</b></td>
- <td colspan="2">
-  <table border="0" cellspacing="0" cellpadding="4">
-   <tr valign="middle" align="center">
-    <td class="nbr"> &nbsp; @if-s-prev-exists-start@<a href="eass?f=@f@&amp;v=@v@&amp;s1=@s-prev@&amp;s2=@s@">Move section up</a> &nbsp; @if-s-prev-exists-end@</td>
-    <td class="nbr"> &nbsp; <a href="easa?f=@f@&amp;v=@v@&amp;s=@s@">Insert new section below</a> &nbsp; </td>
-   </tr>
-   <tr valign="middle" align="center">
-    <td class="nbr"> &nbsp; @if-s-next-exists-start@<a href="eass?f=@f@&amp;v=@v@&amp;s1=@s@&amp;s2=@s-next@">Move section down</a> &nbsp; @if-s-next-exists-end@</td>
-    <td class="nbr"> &nbsp; @if-empty-section-start@<a href="easr?f=@f@&amp;v=@v@&amp;s=@s@">Delete whole section</a>&nbsp; @if-empty-section-end@</td>
-   </tr>
-  </table>
- </td>
-</tr>
-</table>
-<p>&nbsp;</p>
-
diff --git a/templates/edit-actions-list-url b/templates/edit-actions-list-url
deleted file mode 100644 (file)
index fcaa7c4..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-url,v $
-#
-# Purpose     :  Template which forms part of edit-actions-list
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-list-url,v $
-#    Revision 1.6  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.5  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.4  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.3  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# sectionid
-# urls
-#
-#############################################################################
-#
-# ** Important note: **
-#
-# It is *extremely* important to keep this file small.  That's why all the
-# identifiers in the HTML are short and cryptic.  Currently, the main
-# edit-actions page is ~300k.  Before it was optimized, it was ~550k.
-#
-#############################################################################
-<tr class="url@url-1-2@" valign="top"><td align="left">&nbsp;</td>
-<td align="center" class="nbr"><a name="l@p@"
-href="ear?f=@f@&amp;v=@v@&amp;p=@p@" onclick="return rm_p(@p@,'@url@');">Remove</a>&nbsp;&nbsp;&nbsp;<a
-href="eau?f=@f@&amp;v=@v@&amp;p=@p@">Edit</a>&nbsp;</td>
-<td class="url" align="left">@url-html@</td>
-</tr>
diff --git a/templates/edit-actions-remove-url-form b/templates/edit-actions-remove-url-form
deleted file mode 100644 (file)
index 596391e..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-remove-url-form,v $
-#
-# Purpose     :  Template used to confirm removal of a particular URL
-#                pattern from an actions file.  Only used on browsers that
-#                don't support JavaScript.
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-remove-url-form,v $
-#    Revision 1.9  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.8  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.7  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.6  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.5  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.4  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.3  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.2  2002/01/17 21:21:05  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.1  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# section
-# pattern
-# oldval
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Remove URL Pattern</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-</style>
-
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="light">
-      <h2>Remove URL Pattern</h2>
-      <p>Are you sure you want to delete this URL pattern?  The pattern is:</p>
-      <p><b>@u@</b></p>
-      <p>
-        <a href="edit-actions-remove-url?f=@f@&amp;v=@v@&amp;p=@p@">OK</a>
-        &nbsp;
-        <a href="edit-actions-list?f=@f@">Cancel</a>
-      </p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
-
diff --git a/templates/edit-actions-url-form b/templates/edit-actions-url-form
deleted file mode 100644 (file)
index f3766b4..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-url-form,v $
-#
-# Purpose     :  Template used to edit a URL pattern in an actions file.
-#
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-url-form,v $
-#    Revision 1.9  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.8  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.7  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.6  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.5  2002/03/03 10:29:13  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.4  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.3  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.2  2002/01/17 21:21:05  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.1  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# f - filename
-# v - version
-# s - section
-# p - pattern
-# u - old value of URL
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit URL Pattern</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-</style>
-
-<script type="text/javascript">
-<!--
-function validate(text)
-{
-  if (text=="")
-  {
-    alert("You need to type a pattern in order to continue!");
-    return false;
-  }
-
-  return true;
-}
-//-->
-</script>
-
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="light">
-      <h2>Edit URL Pattern</h2>
-      <form method="GET" action="edit-actions-url"
-            onSubmit="return validate(u.value);">
-        <p>
-          <input type="hidden" name="f" value="@f@">
-          <input type="hidden" name="v" value="@v@">
-          <input type="hidden" name="p" value="@p@">
-          <input type="text" name="u" value="@u@" size="78"><br>
-          <input type="submit" value="Submit"> &nbsp;
-          <input type="reset" value="Reset"> &nbsp;
-          <a href="edit-actions-list?f=@f@">Cancel</a>
-        </p>
-      </form>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
-
index e119f75..a8c0202 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# No-Such-Domain Error Output template for Privoxy.
+# No-Such-Domain Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
@@ -32,8 +32,8 @@
 #  my-hostname:
 #    The hostname associated with my-ip-addr
 #  admin-address:
-#    The email address of the proxy's administrator, as configured
-#    in the 'config' file
+#    The email address of the pxoxy's administrator, as configured
+#    in the config file
 #  default-cgi:
 #    The URL for the "main menu" builtin CGI of this proxy
 #  menu:
 #    The URL of the SourceForge ijbswa project, who maintains this
 #    software.
 #
-#  host:
-#    The host part of the request that lead to this problem
+#  host-html:
+#    The host part of the request that lead to this problem, HTML-encoded
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
-#  proxy-info-url:
-#    The URL to local online Privoxy documentation, if define in the
-#    'config' file
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
+#
 #
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 # ------------------------------------------------------------------
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>404 - No such Domain (Privoxy@@my-hostname@)</title>
+  <title>404 - No such Domain (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>404</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
+      </td>
+    </tr>
+<!-- if-unstable-end@ -->
+
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>No such domain</h2>
           <blockquote>
-            <p>Your request for <b>http://@hostport@@path@</b> could not be fulfilled, because
-              the domain name <b>@host@</b> could not be resolved.</p>
+            <p>Your request for <b>http://@hostport-html@@path-html@</b> could not be fulfilled, because
+              the domain name <b>@host-html@</b> could not be resolved.</p>
             <p>This is often a temporary failiure, so you might just
               <a href="http://@hostport@@path@">try again</a>.</p>
           </blockquote>
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
diff --git a/templates/show-request b/templates/show-request
deleted file mode 100644 (file)
index c1badf4..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-##########################################################
-#
-# Show-Request-CGI Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#  client-request:
-#    The request and headers that the client sent.
-#  processed-request:
-#    What we would have rewritten this request to, if this had not
-#    been intercepted.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy@@my-hostname@</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-       <h2>Show-Request</h2>
-          <blockquote>
-            Here you see the original headers that your client sent when requesting this page, along with
-            the headers that Privoxy would have sent to the remote server if this request hadn't been
-            intercepted. 
-          </blockquote>
-
-        <h3>Original Client Request:</h3>
-          <blockquote>
-           <pre>@client-request@</pre>
-          </blockquote>
-
-        <h3>Processed Request:</h3>
-          <blockquote>
-           <pre>@processed-request@</pre>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
index 6d9ccfc..e3f8e25 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Show-Status-CGI Output template for Privoxy.
+# Show-Status-CGI Output template for junkbuster 2.9.x
 #
 # USING HTML TEMPLATES:
 # ---------------------
@@ -14,7 +14,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #    software.
 #
 #  redirect-url:
-#    The URL to a script that will redirect to the Privoxy
+#    The URL to a script that will redirect to the junkbuster
 #    documentation for a given item  
 #  invocation:
-#    The command line with whitch Privoxy was invoked
+#    The command line with whitch junkbuster was invoked
 #  options:
 #    The options read from the configfile, linked to their
 #    explanations, plus warnings if parsing acl or forward
@@ -59,7 +59,7 @@
 #    A HTML-formatted list of the individual source file cvs versions
 #  defines:
 #    A HTML-formatted list of all conditional #defines used when
-#    Privoxy was compiled
+#    junkbuster was compiled
 #
 #  
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  statistics:
-#    Privoxy was compiled with statistics support
+#    Junkbuster was compiled with statistics support
 #  have-stats:
 #    There have been previous requests and statistics have
 #    been collected. In this case, the following symbols
 #  have-no-stats:
 #    There haven't any statistics been collected yet
 #  pcrs-support:
-#    Privoxy was compiled with pcrs support
+#    Junkbuster was compiled with pcrs support
 #  trust-support:
-#    Privoxy was compiled with trust support
-#  actions-filename:
-#    The path to the actions file.
-#  re-filter-filename:
-#    The path to the re_filter file. Only available if
-#    pcrs-support is set
-#  trust-filename:
-#    The path to the trust file.Only available if
-#    trust-support is set
+#    Junkbuster was compiled with trust support
+#  split-args:
+#    Junkbuster was compiled with #define SPLIT_PROXY_ARGS
+#    In this case, the following symbols are available:
+#    actions-filename:
+#      The path to the actions file.
+#    re-filter-filename:
+#      The path to the re_filter file. Only available if
+#      pcrs-support is set
+#    trust-filename:
+#      The path to the trust file.Only available if
+#      trust-support is set
+#  no-split-args:
+#    Junkbuster was not compiled with #define SPLIT_PROXY_ARGS
+#    In this case, the following symbols are available:
+#    alist:
+#      The contents of the actionsfile
+#    rlist:
+#      The contents of the re_filterfile. Only available if
+#      pcrs-support is set    
+#    tlist:
+#      The contents of the trustfile. Only available if
+#      trust-support is set
+#
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@: Proxy Status</title>
+  <title>Junkbuster@@my-hostname@: Proxy Status</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
+      </td>
+    </tr>
+
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
+<!-- if-unstable-end@ -->
 
     <tr>
       <td bgcolor=#eeeeee>
         <blockquote>
 <!-- @if-have-stats-start -->
         @requests-blocked@ out of @requests-received@ requests have been blocked,
-        which equals a block rate of @percent-blocked@%.
+        which equals a block rate of @percent-blocked@.
 <!-- if-have-stats-end@ -->
 <!-- @if-have-no-stats-start -->
         There haven't been any requests so far.
     </tr>
 <!-- if-statistics-end@ -->
 
+<!-- @if-split-args-start -->
     <tr>
       <td bgcolor=#eeeeee>
         <h2>The following files are in use:</h2>
         </ul>
       </td>
     </tr>
+<!-- if-split-args-end@ -->
 
+<!-- @if-no-split-args-start -->
     <tr>
       <td bgcolor=#eeeeee>
-        <h2>Conditional #defines:</h2>
-          <table border=1>
-          <tr> 
-            <th>#define</th> <th>Enabled?</th> <th>Effects when enabled</th>
-          </tr>
-          <tr>
-             <td><code>FEATURE_ACL</code></td>
-             <td>@if-FEATURE_ACL-then@ Yes @else-not-FEATURE_ACL@ No @endif-FEATURE_ACL@</td>
-             <td>Allows the use of an ACL to control access to the proxy by IP address.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_CGI_EDIT_ACTIONS</code></td>
-             <td>@if-FEATURE_CGI_EDIT_ACTIONS-then@ Yes @else-not-FEATURE_CGI_EDIT_ACTIONS@ No @endif-FEATURE_CGI_EDIT_ACTIONS@</td>
-             <td>Allows the use of the web-based actions file 
-               editor@if-FEATURE_CGI_EDIT_ACTIONS-then@, which is <a href="@default-cgi@edit-actions">here</a>@else-not-FEATURE_CGI_EDIT_ACTIONS@@endif-FEATURE_CGI_EDIT_ACTIONS@.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_COOKIE_JAR</code></td>
-             <td>@if-FEATURE_COOKIE_JAR-then@ Yes @else-not-FEATURE_COOKIE_JAR@ No @endif-FEATURE_COOKIE_JAR@</td>
-             <td>Allows the use of a "cookie jar" file to capture cookies.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_FAST_REDIRECTS</code></td>
-             <td>@if-FEATURE_FAST_REDIRECTS-then@ Yes @else-not-FEATURE_FAST_REDIRECTS@ No @endif-FEATURE_FAST_REDIRECTS@</td>
-             <td>Allows the +fast-redirects action, to bypass redirect and logging scripts.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_FORCE_LOAD</code></td>
-             <td>@if-FEATURE_FORCE_LOAD-then@ Yes @else-not-FEATURE_FORCE_LOAD@ No @endif-FEATURE_FORCE_LOAD@</td>
-             <td>Allows bypassing all filtering for a single page using the prefix "<code>@FORCE_PREFIX@</code>".</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_IMAGE_BLOCKING</code></td>
-             <td>@if-FEATURE_IMAGE_BLOCKING-then@ Yes @else-not-FEATURE_IMAGE_BLOCKING@ No @endif-FEATURE_IMAGE_BLOCKING@</td>
-             <td>Allows the +image ation, to send "blocked" images instead of HTML.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_IMAGE_DETECT_MSIE</code></td>
-             <td>@if-FEATURE_IMAGE_DETECT_MSIE-then@ Yes @else-not-FEATURE_IMAGE_DETECT_MSIE@ No @endif-FEATURE_IMAGE_DETECT_MSIE@</td>
-             <td>Enables automatic detection of image and HTML requests from
-             Microsoft Internet Explorer users, overriding the setting of 
-             +image in the actions file.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_KILL_POPUPS</code></td>
-             <td>@if-FEATURE_KILL_POPUPS-then@ Yes @else-not-FEATURE_KILL_POPUPS@ No @endif-FEATURE_KILL_POPUPS@</td>
-             <td>Allows the +no-popups action, to block JavaScript popups.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_NO_GIFS</code></td>
-             <td>@if-FEATURE_NO_GIFS-then@ Yes @else-not-FEATURE_NO_GIFS@ No @endif-FEATURE_NO_GIFS@</td>
-             <td>Use PNG instead of GIF for the built-in images.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_PTHREAD</code></td>
-             <td>@if-FEATURE_PTHREAD-then@ Yes @else-not-FEATURE_PTHREAD@ No @endif-FEATURE_PTHREAD@</td>
-             <td>Use POSIX threads rather than native threads</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_STATISTICS</code></td>
-             <td>@if-FEATURE_STATISTICS-then@ Yes @else-not-FEATURE_STATISTICS@ No @endif-FEATURE_STATISTICS@</td>
-             <td>Enables the statistics function.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_TOGGLE</code></td>
-             <td>@if-FEATURE_TOGGLE-then@ Yes @else-not-FEATURE_TOGGLE@ No @endif-FEATURE_TOGGLE@</td>
-             <td>Allow Privoxy to be "disabled" so it is just a normal non-blocking non-anonymizing proxy.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_TRUST</code></td>
-             <td>@if-FEATURE_TRUST-then@ Yes @else-not-FEATURE_TRUST@ No @endif-FEATURE_TRUST@</td>
-             <td>Allows the use of trust files.</td>
-          </tr>
-          <tr>
-             <td><code>REGEX_GNU</code></td>
-             <td>@if-REGEX_GNU-then@ Yes @else-not-REGEX_GNU@ No @endif-REGEX_GNU@</td>
-             <td rowspan="2">Changes the type of pattern matching done on URL paths.  PCRE is by far the best.
-             The old GNU style will slow down Privoxy and increase the executable's size.  If both of
-             these are disabled, simple prefix matching is done, but this is very inflexible.</td>
-          </tr>
-          <tr>
-             <td><code>REGEX_PCRE</code></td>
-             <td>@if-REGEX_PCRE-then@ Yes @else-not-REGEX_PCRE@ No @endif-REGEX_PCRE@</td>
-          </tr>
-          <tr>
-             <td><code>STATIC_PCRE</code></td>
-             <td>@if-STATIC_PCRE-then@ Yes @else-not-STATIC_PCRE@ No @endif-STATIC_PCRE@</td>
-             <td>Use the supplied statically-linked PCRE library.  This is set automatically
-             by <code>./configure</code> if you do not have the libpcre installed.</td>
-          </tr>
-          <tr>
-             <td><code>STATIC_PCRS</code></td>
-             <td>@if-STATIC_PCRS-then@ Yes @else-not-STATIC_PCRS@ No @endif-STATIC_PCRS@</td>
-             <td>Use the supplied statically-linked PCRS library.  This is set automatically
-             by <code>./configure</code> if you do not have the libpcrs installed.</td>
-          </tr>
-        </table>
+        <h2>Actions List:</h2>
+        <blockquote><pre>@alist@</pre></blockquote>
       </td>
     </tr>
 
+<!-- @if-pcrs-support-start -->
     <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
+      <td bgcolor=#eeeeee>
+        <h2>Regex Filter List:</h2>
+        <blockquote><pre>@rlist@</pre></blockquote>
       </td>
     </tr>
+<!-- if-pcrs-support-end@ -->
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+<!-- @if-trust-support-start -->
     <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
+      <td bgcolor=#eeeeee>
+        <h2>Trust List:</h2>
+        <blockquote><pre>@tlist@</pre></blockquote>
+      </td>
+    </tr>
+<!-- if-trust-support-end@ -->
+<!-- if-no-split-args-end@ -->
+
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Source code versions:</h2>
+        <blockquote><pre>@sourceversions@</pre></blockquote>
+      </td>
+    </tr>
+
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Conditional #defines:</h2>
+        <ul>@defines@</ul>
       </td>
     </tr>
-<!-- if-unstable-end@ -->
 
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <h2>More Junkbuster:</h2>
+        <ul>@menu@</ul>
+      </td>
+    </tr>
+
+    <tr>
+      <td bgcolor=#dddddd>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
 </body>
-</html>
+</html>
\ No newline at end of file
index e8a2b7e..659cf0d 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Show-Status-CGI Output template for Privoxy.
+# Show-Status-CGI Output template for junkbuster 2.9.x
 # (Variant for the show-file mode)
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@: Contents of @file-description@</title>
+  <title>Junkbuster@@my-hostname@: Contents of @file-description@</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Contents of @file-description@ (@filepath@)</h2>
-        <blockquote><pre>@contents@</pre></blockquote>
-      </td>
-    </tr>
 <!-- @if-unstable-start -->
 # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
     <tr>
       <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
           <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
         </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
 <!-- if-unstable-end@ -->
 
-<!-- @if-have-help-info-start -->
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Contents of @file-description@ (@filepath@)</h2>
+        <blockquote><pre>@contents@</pre></blockquote>
+      </td>
+    </tr>
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
+        <p>Back to the <a href=@default-cgi@>main page</a>.</p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
 </body>
-</html>
+</html>
\ No newline at end of file
index 76fc5f0..56c3373 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Show-Url-Info-CGI Output template for Privoxy.
+# Show-Url-Info-CGI Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  url-given:
 #    The CGI was called with a url parameter. In that case, the
 #    following symbols are available:
 #    url:
 #      The given URL
+#    url-html:
+#      The given URL, HTML-encoded
 #    default:
 #      The system default for actions
 #    matches:
@@ -82,7 +76,7 @@
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@ URL Info</title>
+  <title>Junkbuster@@my-hostname@ URL Info</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
+      </td>
+    </tr>
+<!-- if-unstable-end@ -->
+
 <!-- @if-url-given-start -->
     <tr>
       <td bgcolor=#eeeeee>
-<!-- @if-https-start -->
-        <h2>NOTE:</h2>
-        <p>This is a secure (https:) URL, so the part after the "/" is ignored.
-          This is a feature of the HTTPS protocol - the exact address of the
-          page you're visiting is hidden.  Privoxy can only detect the host
-          part of the URL.</p>
-        <p>&nbsp;</p>
-<!-- if-https-end@ -->
-        <h2>Matches for <a href="@url@">@url@</a>:</h2>
+        <h2>System default actions:</h2>
+        <p>{@default@}</p>
+      </td>
+    </tr>
+
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Matches for <a href="http://@url@">http://@url-html@</a>:</h2>
         <p>@matches@</p>
       </td>
     </tr>
     <tr>
       <td bgcolor=#eeeeee>
         <h2>Final results:</h2>
-        <p><b>@final@</b></p>
+        <p>@final@</p>
       </td>
     </tr>
 <!-- if-url-given-end@ -->
         <h2>Look up the actions for a 
 <!-- @if-url-given-start -->new<!-- if-url-given-end@ -->
           URL:</h2>
-        <form method="GET" action="@default-cgi@show-url-info">
+        <form method="GET" action="http://i.j.b/show-url-info">
           <input type="text" name="url" size="80" value="@url@"> 
           <input type="submit" value="Go">
         </form>
 
     <tr>
       <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
diff --git a/templates/show-version b/templates/show-version
deleted file mode 100644 (file)
index debd5d7..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-##########################################################
-#
-# Show-Status-CGI Output template for Privoxy.
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-#  redirect-url:
-#    The URL to a script that will redirect to the Privoxy
-#    documentation for a given item  
-#  invocation:
-#    The command line with whitch Privoxy was invoked
-#  options:
-#    The options read from the configfile, linked to their
-#    explanations, plus warnings if parsing acl or forward
-#    statements produced errors.
-#  sourceversions:
-#    A HTML-formatted list of the individual source file cvs versions
-#  defines:
-#    A HTML-formatted list of all conditional #defines used when
-#    Privoxy was compiled
-#
-#  
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#  sourceversions
-#    The versions.
-<html>
-
-<head>
-  <title>Privoxy@@my-hostname@: Detailed proxy version information</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Source code versions:</h2>
-        <p><i>(Note: This information is only relevant if you checked out Privoxy from CVS
-           and compiled it yourself.  If you downloaded a binary, .exe, RPM, or a .tgz file, 
-           then when you ask for support just mention the version number <b>@version@</b> 
-           and the type of download you got.)</i></p>
-        <p>&nbsp;</p>
-        <blockquote><pre>@sourceversions@</pre></blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-
-  </table>
-
-</body>
-</html>
diff --git a/templates/toggle b/templates/toggle
deleted file mode 100644 (file)
index 6dc0f00..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-##########################################################
-#
-# Toggle Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#  @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@
-#
-<html>
-
-<head>
-  
-  <title>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Privoxy is @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</h2>
-          <blockquote>
-            <p>When enabled, Privoxy performs its magic - blocking
-               adverts, filtering cookies, regex-filtering, etc.</p>
-            <p>When disabled, Privoxy behaves as a normal HTTP proxy,
-               and will not affect your web browsing.</p>
-            <p><a href="@default-cgi@toggle?set=@if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@">Click
-               here</a> to @if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@ Privoxy.</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Bookmarklets</h2>
-          <blockquote>
-            <p>Here are some bookmarklets to allow you to easily access a
-               "mini" version of this page.  They are designed for MS 
-               Internet Explorer, but should work equally well in
-               Netscape, Mozilla, and other browsers which support
-               JavaScript.  They are designed to run directly from
-               your bookmarks - <b>not</b> by clicking the links
-               below (although that will work for testing).</p>
-
-            <p>To save them, right-click the link and choose
-               "Add to Favorites" (IE) or "Add Bookmark" (Netscape).  You
-               will get a warning that the bookmark "may not be safe" - just
-               click OK.  Then you can run the Bookmarklet directly from your
-               favourites/bookmarks.  For even faster access, you can put
-               them on the "Links" bar (IE) or the "Personal Toolbar"
-               (Netscape), and run them with a single click.</p>
-
-            <ul>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=enabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Enable Privoxy</a></li>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=disabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Disable Privoxy</a></li>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=toggle','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Toggle Privoxy</a>
-                  (Toggles between enabled and disabled)</li>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y','ijbstatus','width=250,height=2,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">View Privoxy Status</a></li>
-            </ul>
-
-            <p><b>Credit:</b> The site which gave me the general idea for these
-               bookmarklets is
-               <a href="http://www.bookmarklets.com/">www.bookmarklets.com</a>.
-               They have more information
-               <a href="http://www.bookmarklets.com/about/">about bookmarklets</a>.</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/toggle-mini b/templates/toggle-mini
deleted file mode 100644 (file)
index 68f87f5..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-##########################################################
-#
-# Toggle Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#  @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@
-#
-<html>
-
-<head>
-  
-  <title>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#eeeeee" marginwidth="3" marginheight="3"
-leftmargin="3" rightmargin="3" topmargin="3" bottommargin="3">
-<center>
-<a href="@default-cgi@" target="_blank">Privoxy</a> is 
-<b>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b>.
-<a href="@default-cgi@toggle?mini=y&set=@if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@"
->@if-enabled-display-then@[Disable]@else-not-enabled-display@[Enable]@endif-enabled-display@</a>
-<br>
-<a href="" onclick="window.close();">[Close]</a>
-</center>
-</body>
-</html>
index 9db1aa0..2bf2228 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# "Untrusted" Error Output template for Privoxy.
+# "Untrusted" Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
 #  referrer:
 #    The referrer of the request that lead to this problem
+#  referrer-html:
+#    The referrer of the request that lead to this problem, HTML-encoded
 #  trusted-referrers:
 #    An HTML-formatted list of referrers that are marked as trusted in
 #    the trustfile
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  force-support:
-#    Privoxy has been compiled with support for forced loading
+#    Junkbuster has been compiled with support for forced loading
 #    of blocked content. In that case, the symbol "force-prefix" is
 #    avaiable, which translates to the FORCE_PREFIX  
 #  have-trust-info:
@@ -88,7 +86,7 @@
 <html>
 
 <head>
-  <title>Untrusted request (Privoxy@@my-hostname@)</title>
+  <title>Untrusted request (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>UNTRUSTED</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
+      </td>
+    </tr>
+<!-- if-unstable-end@ -->
+
+
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>Request for untrusted URL</h2>
         <blockquote>
-          <p>Your request for <b>@hostport@@path@</b> was blocked,
+          <p>Your request for <b>@hostport-html@@path-html@</b> was blocked,
             because neither the request URL itself, nor its referrer
-            (<a href="@referrer@">@referrer@</a>) were trusted.
+            (<a href="@referrer@">@referrer-html@</a>) were trusted.
           </p>
 <!-- @if-force-support-start -->
           <p>(You can <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>.)</p>
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
 </body>
-</html>
+</html>
\ No newline at end of file
diff --git a/testdrive.status b/testdrive.status
deleted file mode 100644 (file)
index 3627548..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-CHUNK:                 ASSIGNED TO:                    RUN1:   RUN2:
----------------------------------------------------------------------
-testdrive-intl-aa      
-testdrive-intl-ab
-testdrive-intl-ac
-testdrive-intl-ad
-testdrive-intl-ae
-testdrive-intl-af
-testdrive-intl-ag
-testdrive-intl-ah
-testdrive-intl-ai      swa                             x       
-testdrive-intl-aj
-testdrive-intl-ak
-testdrive-unstable
-testdrive-us-aa
-testdrive-us-ab
-testdrive-us-ac
-testdrive-us-ad     Hal                        x
-testdrive-us-ae
-testdrive-us-af
-testdrive-us-ag
-testdrive-us-ah
-testdrive-us-ai
-testdrive-us-aj
-testdrive-us-ak
-testdrive-us-al
-testdrive-us-am
-testdrive-us-an
-testdrive-us-ao
-testdrive-us-ap
-
diff --git a/urlmatch.c b/urlmatch.c
deleted file mode 100644 (file)
index 772261d..0000000
+++ /dev/null
@@ -1,824 +0,0 @@
-const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.6 2002/03/24 13:25:43 swa Exp $";
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/urlmatch.c,v $
- *
- * Purpose     :  Declares functions to match URLs against URL
- *                patterns.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: urlmatch.c,v $
- *    Revision 1.6  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.5  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.4  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.3  2002/03/03 14:51:11  oes
- *    Fixed CLF logging: Added ocmd member for client's request to struct http_request
- *
- *    Revision 1.2  2002/01/21 00:14:09  jongfoster
- *    Correcting comment style
- *    Fixing an uninitialized memory bug in create_url_spec()
- *
- *    Revision 1.1  2002/01/17 20:53:46  jongfoster
- *    Moving all our URL and URL pattern parsing code to the same file - it
- *    was scattered around in filters.c, loaders.c and parsers.c.
- *
- *    Providing a single, simple url_match(pattern,url) function - rather than
- *    the 3-line match routine which was repeated all over the place.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Providing parse_http_url() so that URLs can be parsed without faking a
- *    HTTP request line for parse_http_request() or repeating the parsing
- *    code (both of which were techniques that were actually in use).
- *
- *    Standardizing that struct http_request is used to represent a URL, and
- *    struct url_spec is used to represent a URL pattern.  (Before, URLs were
- *    represented as seperate variables and a partially-filled-in url_spec).
- *
- *
- *********************************************************************/
-\f
-
-#include "config.h"
-
-#ifndef _WIN32
-#include <stdio.h>
-#include <sys/types.h>
-#endif
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <assert.h>
-#include <string.h>
-
-#if !defined(_WIN32) && !defined(__OS2__)
-#include <unistd.h>
-#endif
-
-#include "project.h"
-#include "urlmatch.h"
-#include "ssplit.h"
-#include "miscutil.h"
-#include "errlog.h"
-
-const char urlmatch_h_rcs[] = URLMATCH_H_VERSION;
-
-/* Fix a problem with Solaris.  There should be no effect on other
- * platforms.
- * Solaris's isspace() is a macro which uses it's argument directly
- * as an array index.  Therefore we need to make sure that high-bit
- * characters generate +ve values, and ideally we also want to make
- * the argument match the declared parameter type of "int".
- *
- * Why did they write a character function that can't take a simple
- * "char" argument?  Doh!
- */
-#define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
-#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
-
-
-/*********************************************************************
- *
- * Function    :  free_http_request
- *
- * Description :  Freez a http_request structure
- *
- * Parameters  :
- *          1  :  http = points to a http_request structure to free
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void free_http_request(struct http_request *http)
-{
-   assert(http);
-
-   freez(http->cmd);
-   freez(http->ocmd);
-   freez(http->gpc);
-   freez(http->host);
-   freez(http->url);
-   freez(http->hostport);
-   freez(http->path);
-   freez(http->ver);
-   freez(http->host_ip_addr_str);
-   freez(http->dbuffer);
-   freez(http->dvec);
-   http->dcount = 0;
-}
-
-
-/*********************************************************************
- *
- * Function    :  parse_http_url
- *
- * Description :  Parse out the host and port from the URL.  Find the
- *                hostname & path, port (if ':'), and/or password (if '@')
- *
- * Parameters  :
- *          1  :  url = URL (or is it URI?) to break down
- *          2  :  http = pointer to the http structure to hold elements.
- *                       Will be zeroed before use.  Note that this
- *                       function sets the http->gpc and http->ver
- *                       members to NULL.
- *          3  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out of memory
- *                JB_ERR_CGI_PARAMS on malformed command/URL
- *                                  or >100 domains deep.
- *
- *********************************************************************/
-jb_err parse_http_url(const char * url,
-                      struct http_request *http,
-                      struct client_state *csp)
-{
-   /*
-    * Zero out the results structure
-    */
-   memset(http, '\0', sizeof(*http));
-
-
-   /*
-    * Save our initial URL
-    */
-   http->url = strdup(url);
-   if (http->url == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-
-   /*
-    * Split URL into protocol,hostport,path.
-    */
-   {
-      char *buf;
-      char *url_noproto;
-      char *url_path;
-
-      buf = strdup(url);
-      if (buf == NULL)
-      {
-         return JB_ERR_MEMORY;
-      }
-
-      /* Find the start of the URL in our scratch space */
-      url_noproto = buf;
-      if (strncmpic(url_noproto, "http://",  7) == 0)
-      {
-         url_noproto += 7;
-         http->ssl = 0;
-      }
-      else if (strncmpic(url_noproto, "https://", 8) == 0)
-      {
-         url_noproto += 8;
-         http->ssl = 1;
-      }
-      else
-      {
-         http->ssl = 0;
-      }
-
-      url_path = strchr(url_noproto, '/');
-      if (url_path != NULL)
-      {
-         /*
-          * Got a path.
-          *
-          * NOTE: The following line ignores the path for HTTPS URLS.
-          * This means that you get consistent behaviour if you type a
-          * https URL in and it's parsed by the function.  (When the
-          * URL is actually retrieved, SSL hides the path part).
-          */
-         http->path = strdup(http->ssl ? "/" : url_path);
-         *url_path = '\0';
-         http->hostport = strdup(url_noproto);
-      }
-      else
-      {
-         /*
-          * Repair broken HTTP requests that don't contain a path,
-          * or CONNECT requests
-          */
-         http->path = strdup("/");
-         http->hostport = strdup(url_noproto);
-      }
-
-      free(buf);
-
-      if ( (http->path == NULL)
-        || (http->hostport == NULL))
-      {
-         free(buf);
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-
-   /*
-    * Split hostport into user/password (ignored), host, port.
-    */
-   {
-      char *buf;
-      char *host;
-      char *port;
-
-      buf = strdup(http->hostport);
-      if (buf == NULL)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-
-      /* check if url contains username and/or password */
-      host = strchr(buf, '@');
-      if (host != NULL)
-      {
-         /* Contains username/password, skip it and the @ sign. */
-         host++;
-      }
-      else
-      {
-         /* No username or password. */
-         host = buf;
-      }
-
-      /* check if url contains port */
-      port = strchr(host, ':');
-      if (port != NULL)
-      {
-         /* Contains port */
-         /* Terminate hostname and point to start of port string */
-         *port++ = '\0';
-         http->port = atoi(port);
-      }
-      else
-      {
-         /* No port specified. */
-         http->port = (http->ssl ? 143 : 80);
-      }
-
-      http->host = strdup(host);
-
-      free(buf);
-
-      if (http->host == NULL)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-
-   /*
-    * Split domain name so we can compare it against wildcards
-    */
-   {
-      char *vec[BUFFER_SIZE];
-      size_t size;
-      char *p;
-
-      http->dbuffer = strdup(http->host);
-      if (NULL == http->dbuffer)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-
-      /* map to lower case */
-      for (p = http->dbuffer; *p ; p++)
-      {
-         *p = tolower((int)(unsigned char)*p);
-      }
-
-      /* split the domain name into components */
-      http->dcount = ssplit(http->dbuffer, ".", vec, SZ(vec), 1, 1);
-
-      if (http->dcount <= 0)
-      {
-         /*
-          * Error: More than SZ(vec) components in domain
-          *    or: no components in domain
-          */
-         free_http_request(http);
-         return JB_ERR_PARSE;
-      }
-
-      /* save a copy of the pointers in dvec */
-      size = http->dcount * sizeof(*http->dvec);
-
-      http->dvec = (char **)malloc(size);
-      if (NULL == http->dvec)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-
-      memcpy(http->dvec, vec, size);
-   }
-
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  parse_http_request
- *
- * Description :  Parse out the host and port from the URL.  Find the
- *                hostname & path, port (if ':'), and/or password (if '@')
- *
- * Parameters  :
- *          1  :  req = HTTP request line to break down
- *          2  :  http = pointer to the http structure to hold elements
- *          3  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out of memory
- *                JB_ERR_CGI_PARAMS on malformed command/URL
- *                                  or >100 domains deep.
- *
- *********************************************************************/
-jb_err parse_http_request(const char *req,
-                          struct http_request *http,
-                          struct client_state *csp)
-{
-   char *buf;
-   char *v[10];
-   int n;
-   jb_err err;
-   int is_connect = 0;
-
-   memset(http, '\0', sizeof(*http));
-
-   buf = strdup(req);
-   if (buf == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   n = ssplit(buf, " \r\n", v, SZ(v), 1, 1);
-   if (n != 3)
-   {
-      free(buf);
-      return JB_ERR_PARSE;
-   }
-
-   /* this could be a CONNECT request */
-   if (strcmpic(v[0], "connect") == 0)
-   {
-      /* Secure */
-      is_connect = 1;
-   }
-   /* or it could be any other basic HTTP request type */
-   else if ((0 == strcmpic(v[0], "get"))
-         || (0 == strcmpic(v[0], "head"))
-         || (0 == strcmpic(v[0], "post"))
-         || (0 == strcmpic(v[0], "put"))
-         || (0 == strcmpic(v[0], "delete"))
-         /* or a webDAV extension (RFC2518) */
-         || (0 == strcmpic(v[0], "propfind"))
-         || (0 == strcmpic(v[0], "proppatch"))
-         || (0 == strcmpic(v[0], "move"))
-         || (0 == strcmpic(v[0], "copy"))
-         || (0 == strcmpic(v[0], "mkcol"))
-         || (0 == strcmpic(v[0], "lock"))
-         || (0 == strcmpic(v[0], "unlock"))
-         )
-   {
-      /* Normal */
-      is_connect = 0;
-   }
-   else
-   {
-      /* Unknown HTTP method */
-      free(buf);
-      return JB_ERR_PARSE;
-   }
-
-   err = parse_http_url(v[1], http, csp);
-   if (err)
-   {
-      free(buf);
-      return err;
-   }
-
-   /*
-    * Copy the details into the structure
-    */
-   http->ssl = is_connect;
-   http->cmd = strdup(req);
-   http->gpc = strdup(v[0]);
-   http->ver = strdup(v[2]);
-
-   if ( (http->cmd == NULL)
-     || (http->gpc == NULL)
-     || (http->ver == NULL) )
-   {
-      free(buf);
-      free_http_request(http);
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  simple_domaincmp
- *
- * Description :  Domain-wise Compare fqdn's.  The comparison is
- *                both left- and right-anchored.  The individual
- *                domain names are compared with simplematch().
- *                This is only used by domain_match.
- *
- * Parameters  :
- *          1  :  pv = array of patterns to compare
- *          2  :  fv = array of domain components to compare
- *          3  :  len = length of the arrays (both arrays are the
- *                      same length - if they weren't, it couldn't
- *                      possibly be a match).
- *
- * Returns     :  0 => domains are equivalent, else no match.
- *
- *********************************************************************/
-static int simple_domaincmp(char **pv, char **fv, int len)
-{
-   int n;
-
-   for (n = 0; n < len; n++)
-   {
-      if (simplematch(pv[n], fv[n]))
-      {
-         return 1;
-      }
-   }
-
-   return 0;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  domain_match
- *
- * Description :  Domain-wise Compare fqdn's. Governed by the bimap in
- *                pattern->unachored, the comparison is un-, left-,
- *                right-anchored, or both.
- *                The individual domain names are compared with
- *                simplematch().
- *
- * Parameters  :
- *          1  :  pattern = a domain that may contain a '*' as a wildcard.
- *          2  :  fqdn = domain name against which the patterns are compared.
- *
- * Returns     :  0 => domains are equivalent, else no match.
- *
- *********************************************************************/
-static int domain_match(const struct url_spec *pattern, const struct http_request *fqdn)
-{
-   char **pv, **fv;  /* vectors  */
-   int    plen, flen;
-   int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT);
-
-   plen = pattern->dcount;
-   flen = fqdn->dcount;
-
-   if (flen < plen)
-   {
-      /* fqdn is too short to match this pattern */
-      return 1;
-   }
-
-   pv   = pattern->dvec;
-   fv   = fqdn->dvec;
-
-   if (unanchored == ANCHOR_LEFT)
-   {
-      /*
-       * Right anchored.
-       *
-       * Convert this into a fully anchored pattern with
-       * the fqdn and pattern the same length
-       */
-      fv += (flen - plen); /* flen - plen >= 0 due to check above */
-      return simple_domaincmp(pv, fv, plen);
-   }
-   else if (unanchored == 0)
-   {
-      /* Fully anchored, check length */
-      if (flen != plen)
-      {
-         return 1;
-      }
-      return simple_domaincmp(pv, fv, plen);
-   }
-   else if (unanchored == ANCHOR_RIGHT)
-   {
-      /* Left anchored, ignore all extra in fqdn */
-      return simple_domaincmp(pv, fv, plen);
-   }
-   else
-   {
-      /* Unanchored */
-      int n;
-      int maxn = flen - plen;
-      for (n = 0; n <= maxn; n++)
-      {
-         if (!simple_domaincmp(pv, fv, plen))
-         {
-            return 0;
-         }
-         /*
-          * Doesn't match from start of fqdn
-          * Try skipping first part of fqdn
-          */
-         fv++;
-      }
-      return 1;
-   }
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  create_url_spec
- *
- * Description :  Creates a "url_spec" structure from a string.
- *                When finished, free with unload_url().
- *
- * Parameters  :
- *          1  :  url = Target url_spec to be filled in.  Will be
- *                      zeroed before use.
- *          2  :  buf = Source pattern, null terminated.  NOTE: The
- *                      contents of this buffer are destroyed by this
- *                      function.  If this function succeeds, the
- *                      buffer is copied to url->spec.  If this
- *                      function fails, the contents of the buffer
- *                      are lost forever.
- *
- * Returns     :  JB_ERR_OK - Success
- *                JB_ERR_MEMORY - Out of memory
- *                JB_ERR_PARSE - Cannot parse regex (Detailed message
- *                               written to system log)
- *
- *********************************************************************/
-jb_err create_url_spec(struct url_spec * url, const char * buf)
-{
-   char *p;
-
-   assert(url);
-   assert(buf);
-
-   /* Zero memory */
-   memset(url, '\0', sizeof(*url));
-
-   /* save a copy of the orignal specification */
-   if ((url->spec = strdup(buf)) == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if ((p = strchr(buf, '/')) != NULL)
-   {
-      if (NULL == (url->path = strdup(p)))
-      {
-         freez(url->spec);
-         return JB_ERR_MEMORY;
-      }
-      url->pathlen = strlen(url->path);
-      *p = '\0';
-   }
-   else
-   {
-      url->path    = NULL;
-      url->pathlen = 0;
-   }
-#ifdef REGEX
-   if (url->path)
-   {
-      int errcode;
-      char rebuf[BUFFER_SIZE];
-
-      if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
-      {
-         freez(url->spec);
-         freez(url->path);
-         return JB_ERR_MEMORY;
-      }
-
-      sprintf(rebuf, "^(%s)", url->path);
-
-      errcode = regcomp(url->preg, rebuf,
-            (REG_EXTENDED|REG_NOSUB|REG_ICASE));
-      if (errcode)
-      {
-         size_t errlen = regerror(errcode,
-            url->preg, rebuf, sizeof(rebuf));
-
-         if (errlen > (sizeof(rebuf) - (size_t)1))
-         {
-            errlen = sizeof(rebuf) - (size_t)1;
-         }
-         rebuf[errlen] = '\0';
-
-         log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",
-            url->spec, rebuf);
-
-         freez(url->spec);
-         freez(url->path);
-         freez(url->preg);
-
-         return JB_ERR_PARSE;
-      }
-   }
-#endif
-   if ((p = strchr(buf, ':')) == NULL)
-   {
-      url->port = 0;
-   }
-   else
-   {
-      *p++ = '\0';
-      url->port = atoi(p);
-   }
-
-   if (buf[0] != '\0')
-   {
-      char *v[150];
-      size_t size;
-
-      /* Parse domain part */
-      if (buf[strlen(buf) - 1] == '.')
-      {
-         url->unanchored |= ANCHOR_RIGHT;
-      }
-      if (buf[0] == '.')
-      {
-         url->unanchored |= ANCHOR_LEFT;
-      }
-
-      /* split domain into components */
-
-      url->dbuffer = strdup(buf);
-      if (NULL == url->dbuffer)
-      {
-         freez(url->spec);
-         freez(url->path);
-#ifdef REGEX
-         freez(url->preg);
-#endif /* def REGEX */
-         return JB_ERR_MEMORY;
-      }
-
-      /* map to lower case */
-      for (p = url->dbuffer; *p ; p++)
-      {
-         *p = tolower((int)(unsigned char)*p);
-      }
-
-      /* split the domain name into components */
-      url->dcount = ssplit(url->dbuffer, ".", v, SZ(v), 1, 1);
-
-      if (url->dcount < 0)
-      {
-         freez(url->spec);
-         freez(url->path);
-#ifdef REGEX
-         freez(url->preg);
-#endif /* def REGEX */
-         freez(url->dbuffer);
-         url->dcount = 0;
-         return JB_ERR_MEMORY;
-      }
-      else if (url->dcount != 0)
-      {
-
-         /* save a copy of the pointers in dvec */
-         size = url->dcount * sizeof(*url->dvec);
-
-         url->dvec = (char **)malloc(size);
-         if (NULL == url->dvec)
-         {
-            freez(url->spec);
-            freez(url->path);
-#ifdef REGEX
-            freez(url->preg);
-#endif /* def REGEX */
-            freez(url->dbuffer);
-            url->dcount = 0;
-            return JB_ERR_MEMORY;
-         }
-
-         memcpy(url->dvec, v, size);
-      }
-   }
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  free_url_spec
- *
- * Description :  Called from the "unloaders".  Freez the url
- *                structure elements.
- *
- * Parameters  :
- *          1  :  url = pointer to a url_spec structure.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void free_url_spec(struct url_spec *url)
-{
-   if (url == NULL) return;
-
-   freez(url->spec);
-   freez(url->dbuffer);
-   freez(url->dvec);
-   freez(url->path);
-#ifdef REGEX
-   if (url->preg)
-   {
-      regfree(url->preg);
-      freez(url->preg);
-   }
-#endif
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  url_match
- *
- * Description :  Compare a URL against a URL pattern.
- *
- * Parameters  :
- *          1  :  pattern = a URL pattern
- *          2  :  url = URL to match
- *
- * Returns     :  0 iff the URL matches the pattern, else nonzero.
- *
- *********************************************************************/
-int url_match(const struct url_spec *pattern,
-              const struct http_request *url)
-{
-   return ((pattern->port == 0) || (pattern->port == url->port))
-       && ((pattern->dbuffer == NULL) || (domain_match(pattern, url) == 0))
-       && ((pattern->path == NULL) ||
-#ifdef REGEX
-            (regexec(pattern->preg, url->path, 0, NULL, 0) == 0)
-#else
-            (strncmp(pattern->path, url->path, pattern->pathlen) == 0)
-#endif
-      );
-}
-
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/urlmatch.h b/urlmatch.h
deleted file mode 100644 (file)
index 09fa639..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef URLMATCH_H_INCLUDED
-#define URLMATCH_H_INCLUDED
-#define URLMATCH_H_VERSION "$Id: urlmatch.h,v 1.2 2002/03/24 13:25:43 swa Exp $"
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/urlmatch.h,v $
- *
- * Purpose     :  Declares functions to match URLs against URL
- *                patterns.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: urlmatch.h,v $
- *    Revision 1.2  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.1  2002/01/17 20:53:46  jongfoster
- *    Moving all our URL and URL pattern parsing code to the same file - it
- *    was scattered around in filters.c, loaders.c and parsers.c.
- *
- *    Providing a single, simple url_match(pattern,url) function - rather than
- *    the 3-line match routine which was repeated all over the place.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Providing parse_http_url() so that URLs can be parsed without faking a
- *    HTTP request line for parse_http_request() or repeating the parsing
- *    code (both of which were techniques that were actually in use).
- *
- *    Standardizing that struct http_request is used to represent a URL, and
- *    struct url_spec is used to represent a URL pattern.  (Before, URLs were
- *    represented as seperate variables and a partially-filled-in url_spec).
- *
- *
- *********************************************************************/
-\f
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void free_http_request(struct http_request *http);
-extern jb_err parse_http_request(const char *req,
-                                 struct http_request *http,
-                                 struct client_state *csp);
-extern jb_err parse_http_url(const char * url,
-                             struct http_request *http,
-                             struct client_state *csp);
-
-extern int url_match(const struct url_spec *pattern,
-                     const struct http_request *url);
-
-extern jb_err create_url_spec(struct url_spec * url, const char * buf);
-extern void free_url_spec(struct url_spec *url);
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char urlmatch_rcs[];
-extern const char urlmatch_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef URLMATCH_H_INCLUDED */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
similarity index 81%
rename from vc_privoxy.dsp
rename to vc_junkbuster.dsp
index 1baff50..e9c7503 100644 (file)
@@ -1,28 +1,28 @@
-# Microsoft Developer Studio Project File - Name="vc_privoxy" - Package Owner=<4>\r
+# Microsoft Developer Studio Project File - Name="vc_junkbuster" - Package Owner=<4>\r
 # Microsoft Developer Studio Generated Build File, Format Version 5.00\r
 # ** DO NOT EDIT **\r
 \r
 # TARGTYPE "Win32 (x86) Application" 0x0101\r
 \r
-CFG=vc_privoxy - Win32 Debug with Win32 threads\r
+CFG=vc_junkbuster - Win32 Debug with Win32 threads\r
 !MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
 !MESSAGE use the Export Makefile command and run\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_privoxy.mak".\r
+!MESSAGE NMAKE /f "vc_junkbuster.mak".\r
 !MESSAGE \r
 !MESSAGE You can specify a configuration when running NMAKE\r
 !MESSAGE by defining the macro CFG on the command line. For example:\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_privoxy.mak"\\r
- CFG="vc_privoxy - Win32 Debug with Win32 threads"\r
+!MESSAGE NMAKE /f "vc_junkbuster.mak"\\r
+ CFG="vc_junkbuster - Win32 Debug with Win32 threads"\r
 !MESSAGE \r
 !MESSAGE Possible choices for configuration are:\r
 !MESSAGE \r
-!MESSAGE "vc_privoxy - Win32 Release" (based on "Win32 (x86) Application")\r
-!MESSAGE "vc_privoxy - Win32 Debug" (based on "Win32 (x86) Application")\r
-!MESSAGE "vc_privoxy - Win32 Release with Win32 threads" (based on\\r
+!MESSAGE "vc_junkbuster - Win32 Release" (based on "Win32 (x86) Application")\r
+!MESSAGE "vc_junkbuster - Win32 Debug" (based on "Win32 (x86) Application")\r
+!MESSAGE "vc_junkbuster - Win32 Release with Win32 threads" (based on\\r
  "Win32 (x86) Application")\r
-!MESSAGE "vc_privoxy - Win32 Debug with Win32 threads" (based on\\r
+!MESSAGE "vc_junkbuster - Win32 Debug with Win32 threads" (based on\\r
  "Win32 (x86) Application")\r
 !MESSAGE \r
 \r
@@ -33,7 +33,7 @@ CPP=cl.exe
 MTL=midl.exe\r
 RSC=rc.exe\r
 \r
-!IF  "$(CFG)" == "vc_privoxy - Win32 Release"\r
+!IF  "$(CFG)" == "vc_junkbuster - Win32 Release"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 0\r
@@ -59,7 +59,7 @@ LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /machine:I386\r
 \r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug"\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Debug"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 1\r
@@ -73,7 +73,7 @@ LINK32=link.exe
 # PROP Ignore_Export_Lib 0\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c\r
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c\r
 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
 # ADD BASE RSC /l 0x809 /d "_DEBUG"\r
@@ -83,9 +83,9 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib  pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
 \r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Release with Win32 threads"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 0\r
@@ -112,7 +112,7 @@ LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /machine:I386\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:windows /machine:I386\r
 \r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Debug with Win32 threads"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 1\r
@@ -127,7 +127,7 @@ LINK32=link.exe
 # PROP Ignore_Export_Lib 0\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c\r
-# ADD CPP /nologo /MTd /W4 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c\r
 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
 # ADD BASE RSC /l 0x809 /d "_DEBUG"\r
@@ -136,17 +136,17 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib  pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
 \r
 !ENDIF \r
 \r
 # Begin Target\r
 \r
-# Name "vc_privoxy - Win32 Release"\r
-# Name "vc_privoxy - Win32 Debug"\r
-# Name "vc_privoxy - Win32 Release with Win32 threads"\r
-# Name "vc_privoxy - Win32 Debug with Win32 threads"\r
+# Name "vc_junkbuster - Win32 Release"\r
+# Name "vc_junkbuster - Win32 Debug"\r
+# Name "vc_junkbuster - Win32 Release with Win32 threads"\r
+# Name "vc_junkbuster - Win32 Debug with Win32 threads"\r
 # Begin Group "JunkBuster"\r
 \r
 # PROP Default_Filter ""\r
@@ -180,22 +180,6 @@ SOURCE=.\cgi.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\cgiedit.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgiedit.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.h\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=.\config.h\r
 # End Source File\r
 # Begin Source File\r
@@ -268,11 +252,11 @@ SOURCE=.\project.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.c\r
+SOURCE=.\showargs.c\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.h\r
+SOURCE=.\showargs.h\r
 # End Source File\r
 # End Group\r
 # Begin Group "Win32"\r
@@ -296,6 +280,14 @@ SOURCE=.\w32res.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\w32rulesdlg.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\w32rulesdlg.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\w32taskbar.c\r
 # End Source File\r
 # Begin Source File\r
@@ -316,6 +308,10 @@ SOURCE=.\win32.h
 # PROP Default_Filter "rc,ico,bmp"\r
 # Begin Source File\r
 \r
+SOURCE=.\icons\denyrule.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\icons\ico00001.ico\r
 # End Source File\r
 # Begin Source File\r
@@ -348,11 +344,15 @@ SOURCE=.\icons\ico00008.ico
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\icons\icon1.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\icons\idle.ico\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\icons\privoxy.ico\r
+SOURCE=.\icons\junkbust.ico\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -366,20 +366,20 @@ SOURCE=.\w32.rc
 \r
 SOURCE=.\pcre\chartables.c\r
 \r
-!IF  "$(CFG)" == "vc_privoxy - Win32 Release"\r
+!IF  "$(CFG)" == "vc_junkbuster - Win32 Release"\r
 \r
 # PROP Exclude_From_Build 1\r
 \r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug"\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Debug"\r
 \r
 # PROP Exclude_From_Build 1\r
 \r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Release with Win32 threads"\r
 \r
 # PROP BASE Exclude_From_Build 1\r
 # PROP Exclude_From_Build 1\r
 \r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads"\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Debug with Win32 threads"\r
 \r
 # PROP BASE Exclude_From_Build 1\r
 # PROP Exclude_From_Build 1\r
similarity index 82%
rename from vc_privoxy.dsw
rename to vc_junkbuster.dsw
index 3bee927..f44f2c7 100644 (file)
@@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 5.00
 \r
 ###############################################################################\r
 \r
-Project: "vc_console"=".\vc_console.dsp" - Package Owner=<4>\r
+Project: "console_junkbuster"=".\console_junkbuster.dsp" - Package Owner=<4>\r
 \r
 Package=<5>\r
 {{{\r
@@ -30,7 +30,7 @@ Package=<4>
 \r
 ###############################################################################\r
 \r
-Project: "vc_privoxy"=".\vc_privoxy.dsp" - Package Owner=<4>\r
+Project: "vc_junkbuster"=".\vc_junkbuster.dsp" - Package Owner=<4>\r
 \r
 Package=<5>\r
 {{{\r
diff --git a/w32.rc b/w32.rc
index c8c09af..03525f0 100644 (file)
--- a/w32.rc
+++ b/w32.rc
@@ -4,8 +4,8 @@
  *
  * Purpose     :  Windows GUI resource script.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: w32.rc,v $
- *    Revision 1.15  2002/03/24 14:29:25  jongfoster
- *    Renaming icon file
- *
- *    Revision 1.14  2002/03/24 12:07:36  jongfoster
- *    Consistern name for filters file
- *
- *    Revision 1.13  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.12  2001/07/30 22:16:07  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.11  2001/07/21 17:53:41  jongfoster
- *    Adding version information block.
- *
  *    Revision 1.10  2001/07/19 19:14:19  haroon
  *    -  Removed all #ifdef PCRS. The .rc file extension had eluded Andreas.
  *
  * Icon with lowest ID value placed first to ensure application icon
  * remains consistent on all systems.
  */
-IDI_MAINICON            ICON    DISCARDABLE     "icons/privoxy.ico"
-IDI_ANIMATED1           ICON    DISCARDABLE     "icons/ico00001.ico"
-IDI_ANIMATED2           ICON    DISCARDABLE     "icons/ico00002.ico"
-IDI_ANIMATED3           ICON    DISCARDABLE     "icons/ico00003.ico"
-IDI_ANIMATED4           ICON    DISCARDABLE     "icons/ico00004.ico"
-IDI_ANIMATED5           ICON    DISCARDABLE     "icons/ico00005.ico"
-IDI_ANIMATED6           ICON    DISCARDABLE     "icons/ico00006.ico"
-IDI_ANIMATED7           ICON    DISCARDABLE     "icons/ico00007.ico"
-IDI_ANIMATED8           ICON    DISCARDABLE     "icons/ico00008.ico"
+IDI_JUNKBUSTER          ICON    DISCARDABLE     "icons/junkbust.ico"
+IDI_JUNKBUSTER1         ICON    DISCARDABLE     "icons/ico00001.ico"
+IDI_JUNKBUSTER2         ICON    DISCARDABLE     "icons/ico00002.ico"
+IDI_JUNKBUSTER3         ICON    DISCARDABLE     "icons/ico00003.ico"
+IDI_JUNKBUSTER4         ICON    DISCARDABLE     "icons/ico00004.ico"
+IDI_JUNKBUSTER5         ICON    DISCARDABLE     "icons/ico00005.ico"
+IDI_JUNKBUSTER6         ICON    DISCARDABLE     "icons/ico00006.ico"
+IDI_JUNKBUSTER7         ICON    DISCARDABLE     "icons/ico00007.ico"
+IDI_JUNKBUSTER8         ICON    DISCARDABLE     "icons/ico00008.ico"
 IDI_IDLE                ICON    DISCARDABLE     "icons/idle.ico"
 
 #endif /* Neutral resources */
@@ -190,13 +172,13 @@ BEGIN
     BEGIN
         BLOCK "040904b0"
         BEGIN
-            VALUE "CompanyName", "The Privoxy team - www.privoxy.org\0"
-            VALUE "FileDescription", "Privoxy\0"
+            VALUE "CompanyName", "The ijbswa team - ijbswa.sourceforge.net\0"
+            VALUE "FileDescription", "JunkBuster\0"
             VALUE "FileVersion", VERSION "\0"
-            VALUE "InternalName", "Privoxy\0"
+            VALUE "InternalName", "JunkBuster\0"
             VALUE "LegalCopyright", "Distributed under the GNU GPL\0"
-            VALUE "OriginalFilename", "privoxy.exe\0"
-            VALUE "ProductName", "Privoxy\0"
+            VALUE "OriginalFilename", "junkbuster.exe\0"
+            VALUE "ProductName", "JunkBuster\0"
             VALUE "ProductVersion", VERSION "\0"
         END
     END
@@ -217,23 +199,23 @@ IDR_TRAYMENU MENU DISCARDABLE
 BEGIN
     POPUP "Popup"
     BEGIN
-        MENUITEM "E&xit Privoxy",      ID_FILE_EXIT
+        MENUITEM "E&xit JunkBuster",   ID_FILE_EXIT
         MENUITEM                       SEPARATOR
         POPUP "&Options"
         BEGIN
-            MENUITEM "&Configuration...",           ID_TOOLS_EDITCONFIG
+            MENUITEM "&Configuration...",           ID_TOOLS_EDITJUNKBUSTER
             MENUITEM                                SEPARATOR
             MENUITEM "&Actions...",                 ID_TOOLS_EDITACTIONS
-            MENUITEM "&Filters...",                 ID_TOOLS_EDITFILTERS
-#ifdef FEATURE_TRUST
+            MENUITEM "Perl &Regexps...",            ID_TOOLS_EDITPERLRE
+#ifdef TRUST_FILES
             MENUITEM "&Trust...",                   ID_TOOLS_EDITTRUST
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
         END
         MENUITEM                              SEPARATOR
-#ifdef FEATURE_TOGGLE
-        MENUITEM "&Enable",                   ID_TOGGLE_ENABLED, CHECKED
-#endif /* def FEATURE_TOGGLE */
-        MENUITEM "Show Privoxy &Window",      ID_SHOWWINDOW
+#ifdef TOGGLE
+        MENUITEM "&Enable",                   ID_TOGGLE_IJB, CHECKED
+#endif
+        MENUITEM "Show &JunkBuster Window",   ID_SHOWWINDOW
     END
 END
 
@@ -258,27 +240,27 @@ BEGIN
     END
     POPUP "&Options"
     BEGIN
-#ifdef FEATURE_TOGGLE
-        MENUITEM "&Enable",                     ID_TOGGLE_ENABLED, CHECKED
+#ifdef TOGGLE
+        MENUITEM "&Enable",                     ID_TOGGLE_IJB, CHECKED
         MENUITEM                                SEPARATOR
-#endif /* def FEATURE_TOGGLE */
-        MENUITEM "&Configuration...",           ID_TOOLS_EDITCONFIG
+#endif
+        MENUITEM "&Configuration...",           ID_TOOLS_EDITJUNKBUSTER
         MENUITEM                                SEPARATOR
         MENUITEM "&Actions...",                 ID_TOOLS_EDITACTIONS
-            MENUITEM "&Filters...",             ID_TOOLS_EDITFILTERS
-#ifdef FEATURE_TRUST
+            MENUITEM "Perl &Regexps...",        ID_TOOLS_EDITPERLRE
+#ifdef TRUST_FILES
             MENUITEM "&Trust...",               ID_TOOLS_EDITTRUST
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
     END
     POPUP "&Help"
     BEGIN
-        MENUITEM "Privoxy &FAQ",                ID_HELP_FAQ
-        MENUITEM "Privoxy &Manual",             ID_HELP_MANUAL
+        MENUITEM "Junkbuster &FAQ",             ID_HELP_FAQ
+        MENUITEM "Junkbuster &Manual",          ID_HELP_MANUAL
         MENUITEM "GNU &General Public Licence", ID_HELP_GPL
         MENUITEM                                SEPARATOR
-        MENUITEM "Privoxy Status...",           ID_HELP_STATUS
+        MENUITEM "Junkbuster Status...",        ID_HELP_STATUS
         MENUITEM                                SEPARATOR
-        MENUITEM "About Privoxy...",            ID_HELP_ABOUT
+        MENUITEM "About Junkbuster...",         ID_HELP_ABOUTJUNKBUSTER
     END
 END
 
@@ -300,4 +282,72 @@ BEGIN
     "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL, NOINVERT
 END
 
+#ifdef WIN_GUI_EDIT
+
+/*
+ * Icons
+ *
+ * Icon with lowest ID value placed first to ensure application icon
+ * remains consistent on all systems.
+ */
+IDI_DENYRULE            ICON    DISCARDABLE     "icons/denyrule.ico"
+IDI_ALLOWRULE           ICON    DISCARDABLE     "icons/icon1.ico"
+
+/*
+ * Dialog
+ */
+
+IDD_RULES DIALOG DISCARDABLE  0, 0, 239, 225
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Blockers"
+FONT 8, "MS Sans Serif"
+BEGIN
+    GROUPBOX        "New Rule",IDC_STATIC,5,5,230,55
+    LTEXT           "For:",IDC_STATIC,10,15,13,8
+    EDITTEXT        IDC_NEW,10,25,220,12,ES_AUTOHSCROLL
+    COMBOBOX        IDC_ACTION,10,40,75,37,CBS_DROPDOWNLIST | CBS_SORT |
+                    WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "C&reate!",IDC_CREATE,90,40,50,14
+    GROUPBOX        "Rules",IDC_STATIC,5,65,230,135
+    CONTROL         "List1",IDC_RULES,"SysListView32",LVS_REPORT |
+                    LVS_SHOWSELALWAYS | LVS_EDITLABELS | WS_BORDER |
+                    WS_TABSTOP,10,75,220,100
+    PUSHBUTTON      "Move &Up",IDC_MOVEUP,10,180,50,14,WS_DISABLED
+    PUSHBUTTON      "Move &Down",IDC_MOVEDOWN,65,180,50,14,WS_DISABLED
+    PUSHBUTTON      "&Delete",IDC_DELETE,120,180,50,14,WS_DISABLED
+    PUSHBUTTON      "&Save",IDC_SAVE,130,205,50,14
+    PUSHBUTTON      "&Cancel",IDCANCEL,185,205,50,14
+END
+
+
+/*
+ * DESIGNINFO
+ */
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE
+BEGIN
+    IDD_RULES, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 232
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 218
+    END
+END
+#endif /* def APSTUDIO_INVOKED */
+
+
+/*
+ * String Table
+ */
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    IDS_NEW_BLOCKER         "Create rule for ""%s""..."
+END
+
+
+#endif /* def WIN_GUI_EDIT */
+
 #endif /* English (U.S.) resources */
index 0948e4b..3b7835a 100644 (file)
--- a/w32log.c
+++ b/w32log.c
@@ -1,4 +1,4 @@
-const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster Exp $";
+const char w32log_rcs[] = "$Id: w32log.c,v 1.12 2001/07/13 14:04:59 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32log.c,v $
@@ -6,8 +6,8 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
  * Purpose     :  Functions for creating and destroying the log window,
  *                ouputting strings, processing messages and so on.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
@@ -32,42 +32,6 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
  *
  * Revisions   :
  *    $Log: w32log.c,v $
- *    Revision 1.22  2002/03/24 12:48:23  jongfoster
- *    Fixing doc links
- *
- *    Revision 1.21  2002/03/24 12:07:35  jongfoster
- *    Consistern name for filters file
- *
- *    Revision 1.20  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.19  2002/01/17 21:04:17  jongfoster
- *    Replacing hard references to the URL of the config interface
- *    with #defines from project.h
- *
- *    Revision 1.18  2001/11/30 23:37:24  jongfoster
- *    Renaming the Win32 config file to config.txt - this is almost the
- *    same as the corresponding UNIX name "config"
- *
- *    Revision 1.17  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.16  2001/08/01 19:58:12  jongfoster
- *    Fixing documentation filenames in help menu, and making status
- *    option work without needing the "Junkbuster Status.URL" file.
- *
- *    Revision 1.15  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.14  2001/07/29 18:47:05  jongfoster
- *    Adding missing #include "loadcfg.h"
- *
- *    Revision 1.13  2001/07/19 19:15:14  haroon
- *    - Added a FIXME for EditFile but didn't fix :-)
- *
  *    Revision 1.12  2001/07/13 14:04:59  oes
  *    Removed all #ifdef PCRS
  *
@@ -156,12 +120,12 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
 #include "project.h"
 #include "w32log.h"
 #include "w32taskbar.h"
+#include "w32rulesdlg.h"
 #include "win32.h"
 #include "w32res.h"
 #include "jcc.h"
 #include "miscutil.h"
 #include "errlog.h"
-#include "loadcfg.h"
 
 const char w32res_h_rcs[] = W32RES_H_VERSION;
 
@@ -241,9 +205,9 @@ int g_nFontSize = DEFAULT_LOG_FONT_SIZE;
 
 const char * g_actions_file = NULL;
 const char * g_re_filterfile = NULL;
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 const char * g_trustfile = NULL;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 /* FIXME: end kludge */
 
@@ -350,14 +314,14 @@ BOOL InitLogWindow(void)
    g_hiconIdle = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IDLE));
    for (i = 0; i < ANIM_FRAMES; i++)
    {
-      g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ANIMATED1 + i));
+      g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER1 + i));
    }
-   g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAINICON));
+   g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER));
 
    /* Create the user interface */
    g_hwndLogFrame = CreateLogWindow(g_hInstance, g_nCmdShow);
    g_hwndTray = CreateTrayWindow(g_hInstance);
-   TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Privoxy");
+   TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Junkbuster");
 
    /* Create pattern matching buffers (for highlighting */
    LogCreatePatternMatchingBuffers();
@@ -778,7 +742,7 @@ void LogClipBuffer(void)
  *********************************************************************/
 HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance)
 {
-   static const char *szWndName = "PrivoxyLogOwner";
+   static const char *szWndName = "JunkbusterLogLogOwner";
    WNDCLASS wc;
    HWND hwnd;
 
@@ -841,11 +805,12 @@ LRESULT CALLBACK LogOwnerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
  *********************************************************************/
 HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow)
 {
-   static const char *szWndName = "PrivoxyLogWindow";
-   static const char *szWndTitle = "Privoxy";
+   static const char *szWndName = "JunkbusterLogWindow";
+   static const char *szWndTitle = "Junkbuster";
 
    HWND hwnd = NULL;
    HWND hwndOwner = (g_bShowOnTaskBar) ? NULL : CreateHiddenLogOwnerWindow(hInstance);
+   HWND hwndChild = NULL;
    RECT rcClient;
    WNDCLASSEX wc;
 
@@ -982,7 +947,7 @@ void ShowLogWindow(BOOL bShow)
 *        from ShellExecute??
  *
  * Parameters  :
- *          1  :  filename = filename from the config (aka config.txt) file.
+ *          1  :  filename = filename from the config (aka junkbstr.txt) file.
  *
  * Returns     :  N/A
  *
@@ -1022,6 +987,9 @@ void OnLogRButtonUp(int nModifier, int x, int y)
    if (hMenu != NULL)
    {
       HMENU hMenuPopup = GetSubMenu(hMenu, 0);
+#ifdef WIN_GUI_EDIT
+      char *szURL;
+#endif /* def WIN_GUI_EDIT */
 
       /* Check if there is a selection */
       CHARRANGE range;
@@ -1035,6 +1003,40 @@ void OnLogRButtonUp(int nModifier, int x, int y)
          EnableMenuItem(hMenuPopup, ID_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED);
       }
 
+#ifdef WIN_GUI_EDIT
+      /* Check if cursor is over a link */
+      szURL = LogGetURLUnderCursor();
+      if (szURL)
+      {
+         MENUITEMINFO item;
+         TCHAR szMenuItemTemplate[1000];
+         char *szMenuItem;
+
+         memset(&item, 0, sizeof(item));
+         item.cbSize = sizeof(item);
+         item.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
+         item.fType = MFT_STRING;
+         item.fState = MFS_ENABLED;
+         item.wID = ID_NEW_BLOCKER;
+
+         /* Put the item into the menu */
+         memset(szMenuItemTemplate, 0, sizeof(szMenuItemTemplate));
+         LoadString(g_hInstance, IDS_NEW_BLOCKER, szMenuItemTemplate, sizeof(szMenuItemTemplate) / sizeof(szMenuItemTemplate[0]));
+
+         szMenuItem = (char *)malloc(strlen(szMenuItemTemplate) + strlen(szURL) + 1);
+         sprintf(szMenuItem, szMenuItemTemplate, szURL);
+
+         item.dwTypeData = szMenuItem;
+         item.cch = strlen(szMenuItem);
+
+         InsertMenuItem(hMenuPopup, 1, TRUE, &item);
+
+         SetDefaultRule(szURL);
+
+         free(szURL);
+      }
+#endif /* def WIN_GUI_EDIT */
+
       /* Display the popup */
       TrackPopupMenu(hMenuPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, x, y, 0, g_hwndLogFrame, NULL);
       DestroyMenu(hMenu);
@@ -1095,9 +1097,9 @@ void OnLogCommand(int nCommand)
          /* SaveLogSettings(); */
          break;
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
       /* by haroon - change toggle to its opposite value */
-      case ID_TOGGLE_ENABLED:
+      case ID_TOGGLE_IJB:
          g_bToggleIJB = !g_bToggleIJB;
          if (g_bToggleIJB)
          {
@@ -1108,9 +1110,9 @@ void OnLogCommand(int nCommand)
             log_error(LOG_LEVEL_INFO, "Now toggled OFF.");
          }
          break;
-#endif /* def FEATURE_TOGGLE */
+#endif
 
-      case ID_TOOLS_EDITCONFIG:
+      case ID_TOOLS_EDITJUNKBUSTER:
          EditFile(configfile);
          break;
 
@@ -1118,34 +1120,40 @@ void OnLogCommand(int nCommand)
          EditFile(g_actions_file);
          break;
 
-      case ID_TOOLS_EDITFILTERS:
+      case ID_TOOLS_EDITPERLRE:
          EditFile(g_re_filterfile);
          break;
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
       case ID_TOOLS_EDITTRUST:
          EditFile(g_trustfile);
          break;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
+
+#ifdef WIN_GUI_EDIT
+      case ID_NEW_BLOCKER:
+         ShowRulesDialog(g_hwndLogFrame);
+         break;
+#endif /* def WIN_GUI_EDIT */
 
       case ID_HELP_GPL:
-         ShellExecute(g_hwndLogFrame, "open", "LICENSE.txt", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "gpl.html", NULL, NULL, SW_SHOWNORMAL);
          break;
 
       case ID_HELP_FAQ:
-         ShellExecute(g_hwndLogFrame, "open", "doc\\faq\\index.html", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "ijbfaq.html", NULL, NULL, SW_SHOWNORMAL);
          break;
 
       case ID_HELP_MANUAL:
-         ShellExecute(g_hwndLogFrame, "open", "doc\\user-manual\\index.html", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "ijbman.html", NULL, NULL, SW_SHOWNORMAL);
          break;
 
       case ID_HELP_STATUS:
-         ShellExecute(g_hwndLogFrame, "open", CGI_PREFIX "show-status", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "Junkbuster Status.URL", NULL, NULL, SW_SHOWNORMAL);
          break;
 
-      case ID_HELP_ABOUT:
-         MessageBox(g_hwndLogFrame, win32_blurb, "About Privoxy", MB_OK);
+      case ID_HELP_ABOUTJUNKBUSTER:
+         MessageBox(g_hwndLogFrame, win32_blurb, "Junkbuster Information", MB_OK);
          break;
 
       default:
@@ -1173,20 +1181,20 @@ void OnLogInitMenu(HMENU hmenu)
 {
    /* Only enable editors if there is a file to edit */
    EnableMenuItem(hmenu, ID_TOOLS_EDITACTIONS, MF_BYCOMMAND | (g_actions_file ? MF_ENABLED : MF_GRAYED));
-   EnableMenuItem(hmenu, ID_TOOLS_EDITFILTERS, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED));
-#ifdef FEATURE_TRUST
+   EnableMenuItem(hmenu, ID_TOOLS_EDITPERLRE, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED));
+#ifdef TRUST_FILES
    EnableMenuItem(hmenu, ID_TOOLS_EDITTRUST, MF_BYCOMMAND | (g_trustfile ? MF_ENABLED : MF_GRAYED));
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
    /* Check/uncheck options */
    CheckMenuItem(hmenu, ID_VIEW_LOGMESSAGES, MF_BYCOMMAND | (g_bLogMessages ? MF_CHECKED : MF_UNCHECKED));
    CheckMenuItem(hmenu, ID_VIEW_MESSAGEHIGHLIGHTING, MF_BYCOMMAND | (g_bHighlightMessages ? MF_CHECKED : MF_UNCHECKED));
    CheckMenuItem(hmenu, ID_VIEW_LIMITBUFFERSIZE, MF_BYCOMMAND | (g_bLimitBufferSize ? MF_CHECKED : MF_UNCHECKED));
    CheckMenuItem(hmenu, ID_VIEW_ACTIVITYANIMATION, MF_BYCOMMAND | (g_bShowActivityAnimation ? MF_CHECKED : MF_UNCHECKED));
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
    /* by haroon - menu item for Enable toggle on/off */
-   CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED));
-#endif /* def FEATURE_TOGGLE */
+   CheckMenuItem(hmenu, ID_TOGGLE_IJB, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED));
+#endif
 
 }
 
index 2634a95..3c40c48 100644 (file)
--- a/w32log.h
+++ b/w32log.h
@@ -1,6 +1,6 @@
-#ifndef W32LOG_H_INCLUDED
-#define W32LOG_H_INCLUDED
-#define W32LOG_H_VERSION "$Id: w32log.h,v 1.9 2002/03/24 12:03:47 jongfoster Exp $"
+#ifndef _W32LOG_H
+#define _W32LOG_H
+#define W32LOG_H_VERSION "$Id: w32log.h,v 1.5 2001/06/07 23:08:12 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32log.h,v $
@@ -8,8 +8,8 @@
  * Purpose     :  Functions for creating and destroying the log window,
  *                ouputting strings, processing messages and so on.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
  *
  * Revisions   :
  *    $Log: w32log.h,v $
- *    Revision 1.9  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.8  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.7  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.6  2001/07/13 14:04:59  oes
- *    Removed all #ifdef PCRS
- *
  *    Revision 1.5  2001/06/07 23:08:12  jongfoster
  *    Forward and ACL edit options removed.
  *
@@ -131,9 +115,9 @@ extern int g_nFontSize;
 
 extern const char * g_actions_file;
 extern const char * g_re_filterfile;
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 extern const char * g_trustfile;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 /* FIXME: end kludge */
 
@@ -151,7 +135,7 @@ extern const char w32log_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef W32LOG_H_INCLUDED */
+#endif /* ndef _W32LOG_H */
 
 
 /*
index 62308cf..33a3720 100644 (file)
--- a/w32res.h
+++ b/w32res.h
@@ -1,14 +1,14 @@
-#ifndef W32RES_H_INCLUDED
-#define W32RES_H_INCLUDED
-#define W32RES_H_VERSION "$Id: w32res.h,v 1.12 2002/03/24 12:07:36 jongfoster Exp $"
+#ifndef _W32RES_H
+#define _W32RES_H
+#define W32RES_H_VERSION "$Id: w32res.h,v 1.7 2001/06/07 23:08:12 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32res.h,v $
  *
  * Purpose     :  Identifiers for Windows GUI resources.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: w32res.h,v $
- *    Revision 1.12  2002/03/24 12:07:36  jongfoster
- *    Consistern name for filters file
- *
- *    Revision 1.11  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.10  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.9  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.8  2001/07/13 14:04:59  oes
- *    Removed all #ifdef PCRS
- *
  *    Revision 1.7  2001/06/07 23:08:12  jongfoster
  *    Forward and ACL edit options removed.
  *
  *
  *********************************************************************/
 
+#ifdef WIN_GUI_EDIT
+#define IDS_NEW_BLOCKER                   1
+
+#define ID_NEW_BLOCKER                    100
+#endif /* def WIN_GUI_EDIT */
+
 #define IDR_TRAYMENU                      101
 #define IDI_IDLE                          102
 #define IDR_LOGVIEW                       103
 #define IDR_ACCELERATOR                   104
 #define IDR_POPUP_SELECTION               105
 
+#ifdef WIN_GUI_EDIT
+#define IDD_RULES                         106
+#endif /* def WIN_GUI_EDIT */
+
+
+#define IDI_JUNKBUSTER                    200
+#define IDI_JUNKBUSTER1                   201
+#define IDI_JUNKBUSTER2                   202
+#define IDI_JUNKBUSTER3                   203
+#define IDI_JUNKBUSTER4                   204
+#define IDI_JUNKBUSTER5                   205
+#define IDI_JUNKBUSTER6                   206
+#define IDI_JUNKBUSTER7                   207
+#define IDI_JUNKBUSTER8                   208
+
+#ifdef WIN_GUI_EDIT
+#define IDI_DENYRULE                      209
+#define IDI_ALLOWRULE                     210
 
-#define IDI_MAINICON                      200
-#define IDI_ANIMATED1                     201
-#define IDI_ANIMATED2                     202
-#define IDI_ANIMATED3                     203
-#define IDI_ANIMATED4                     204
-#define IDI_ANIMATED5                     205
-#define IDI_ANIMATED6                     206
-#define IDI_ANIMATED7                     207
-#define IDI_ANIMATED8                     208
+#define IDC_NEW                           300
+#define IDC_ACTION                        301
+#define IDC_RULES                         302
+#define IDC_CREATE                        303
+#define IDC_MOVEUP                        304
+#define IDC_MOVEDOWN                      305
+#define IDC_DELETE                        306
+#define IDC_SAVE                          307
+#endif /* def WIN_GUI_EDIT */
 
 #define ID_SHOWWINDOW                     4000
-#define ID_HELP_ABOUT                     4001
+#define ID_HELP_ABOUTJUNKBUSTER           4001
 #define ID_FILE_EXIT                      4002
 #define ID_VIEW_CLEARLOG                  4003
 #define ID_VIEW_LOGMESSAGES               4004
 #define ID_HELP_MANUAL                    4009
 #define ID_HELP_GPL                       4010
 #define ID_HELP_STATUS                    4011
-#ifdef FEATURE_TOGGLE
-#define ID_TOGGLE_ENABLED                 4012
-#endif /* def FEATURE_TOGGLE */
+#ifdef TOGGLE
+#define ID_TOGGLE_IJB                     4012
+#endif
 
 /* Break these out so they are easier to extend, but keep consecutive */
-#define ID_TOOLS_EDITCONFIG               5000
+#define ID_TOOLS_EDITJUNKBUSTER           5000
 #define ID_TOOLS_EDITACTIONS              5001
-#define ID_TOOLS_EDITFILTERS              5002
+#define ID_TOOLS_EDITPERLRE               5002
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 #define ID_TOOLS_EDITTRUST                5003
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 /*
  * The following symbols are declared in <afxres.h> in VC++.
 #define ID_EDIT_COPY  30000
 
 
-#endif /* ndef W32RES_H_INCLUDED */
+#endif /* ndef _W32RES_H */
 
 /*
   Local Variables:
diff --git a/w32rulesdlg.c b/w32rulesdlg.c
new file mode 100644 (file)
index 0000000..7516862
--- /dev/null
@@ -0,0 +1,548 @@
+const char w32rulesdlg_rcs[] = "$Id: w32rulesdlg.c,v 1.3 2001/05/22 18:56:28 oes Exp $";
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/w32rulesdlg.c,v $
+ *
+ * Purpose     :  A dialog to allow GUI editing of the rules.
+ *                Unfinished.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Written by and Copyright (C) 1999 Adam Lock
+ *                <locka@iol.ie>
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: w32rulesdlg.c,v $
+ *    Revision 1.3  2001/05/22 18:56:28  oes
+ *    CRLF -> LF
+ *
+ *    Revision 1.2  2001/05/20 15:07:54  jongfoster
+ *    File is now ignored if _WIN_CONSOLE is defined.
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+#include "config.h"
+
+#include <stdio.h>
+
+#include <windows.h>
+#include <commctrl.h>
+
+#include "w32res.h"
+#include "w32rulesdlg.h"
+#include "win32.h"
+
+#ifdef __MINGW32__
+#include "cygwin.h"
+#endif
+
+const char w32rulesdlg_h_rcs[] = W32RULESDLG_H_VERSION;
+
+
+#ifndef _WIN_CONSOLE /* entire file */
+#ifdef WIN_GUI_EDIT /* entire file */
+
+
+const int nSmallIconWidth = 16;
+const int nSmallIconHeight = 16;
+
+static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+static HIMAGELIST g_hImageList = NULL;
+static char *g_pszDefaultRule;
+static BOOL g_bDirty = FALSE;
+
+
+
+/*********************************************************************
+ *
+ * Function    :  ShowRulesDialog
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndParent = (what?)
+ *
+ * Returns     :  (Please fill me in!)
+ *
+ *********************************************************************/
+int ShowRulesDialog(HWND hwndParent)
+{
+   DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_RULES), hwndParent, DialogProc);
+   return TRUE;
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  SetDefaultRule
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  pszRule = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void SetDefaultRule(const char *pszRule)
+{
+   if (pszRule == NULL)
+   {
+      if (g_pszDefaultRule)
+      {
+         free(g_pszDefaultRule);
+         g_pszDefaultRule = NULL;
+      }
+   }
+   else
+   {
+      g_pszDefaultRule = strdup(pszRule);
+   }
+
+}
+
+
+#define IMAGE_ALLOW 0
+#define IMAGE_DENY  1
+
+/*********************************************************************
+ *
+ * Function    :  InsertRule
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndListView = (what?)
+ *          2  :  pszRule = (what?)
+ *          3  :  bAllow = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void InsertRule(HWND hwndListView, const char *pszRule, BOOL bAllow)
+{
+   LVITEM item;
+   item.mask = LVIF_TEXT | LVIF_IMAGE;
+   item.pszText = (char *)pszRule;
+   item.iItem = ListView_GetItemCount(hwndListView) + 1;
+   item.iSubItem = 0;
+   item.iImage = bAllow ? IMAGE_ALLOW : IMAGE_DENY;
+   ListView_InsertItem(hwndListView, &item);
+   /* TODO add subitem for whether the rule is always or never */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  SetDirty
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  bDirty = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void SetDirty(BOOL bDirty)
+{
+   g_bDirty = bDirty;
+   /* TODO Change some values */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnInitDialog
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnInitDialog(HWND hwndDlg)
+{
+   LVCOLUMN aCols[2];
+   HWND hwndListView;
+   RECT rcListView;
+   int cx;
+
+   if (g_hImageList == NULL)
+   {
+      /* Create image list and add icons */
+      HICON hIconDeny = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_DENYRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0);
+      HICON hIconAllow = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ALLOWRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0);
+      g_hImageList = ImageList_Create(nSmallIconWidth, nSmallIconHeight, ILC_COLOR | ILC_MASK, 0, 10);
+      ImageList_AddIcon(g_hImageList, hIconAllow);
+      ImageList_AddIcon(g_hImageList, hIconDeny);
+   }
+
+   /* Set the default rule value if there is one */
+   if (g_pszDefaultRule)
+   {
+      SetDlgItemText(hwndDlg, IDC_NEW, g_pszDefaultRule);
+      SetDefaultRule(NULL);
+   }
+
+   /* Initialise the list view */
+   hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+   ListView_SetImageList(hwndListView, g_hImageList, LVSIL_SMALL);
+   GetClientRect(hwndListView, &rcListView);
+   cx = rcListView.right - rcListView.left;
+   aCols[0].mask = LVCF_TEXT | LVCF_WIDTH;
+   aCols[0].pszText = "Rule";
+   aCols[0].cx = (70 * cx) / 100;
+   aCols[1].mask = LVCF_TEXT | LVCF_WIDTH;
+   aCols[1].pszText = "Applies when";
+   aCols[1].cx = cx - aCols[0].cx;
+   ListView_InsertColumn(hwndListView, 0, &aCols[0]);
+   ListView_InsertColumn(hwndListView, 1, &aCols[1]);
+
+   /* Read and add rules to the list */
+   /* TODO */
+   InsertRule(hwndListView, "Test rule 1", TRUE);
+   InsertRule(hwndListView, "Test rule 2", TRUE);
+   InsertRule(hwndListView, "Test rule 3", FALSE);
+   InsertRule(hwndListView, "Test rule 4", FALSE);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  GetFirstSelectedItem
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  (Please fill me in!)
+ *
+ *********************************************************************/
+static int GetFirstSelectedItem(HWND hwndDlg)
+{
+   /* Check for selected items */
+   HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+   int nItem = -1;
+   do
+   {
+      nItem = ListView_GetNextItem(hwndListView, nItem, LVNI_SELECTED);
+      if (nItem >= 0)
+      {
+         return nItem;
+      }
+   } while (nItem >= 0);
+   return -1;
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnRulesItemChanged
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnRulesItemChanged(HWND hwndDlg)
+{
+   int nItem = GetFirstSelectedItem(hwndDlg);
+   HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+   int nItems = ListView_GetItemCount(hwndListView);
+   BOOL bHaveSelection = (nItem >= 0) ? TRUE : FALSE;
+   BOOL bMoveUp = (bHaveSelection && nItem > 0) ? TRUE : FALSE;
+   BOOL bMoveDown = (bHaveSelection && nItem < nItems - 1) ? TRUE : FALSE;
+
+   /* Enable/disable buttons */
+   EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), bHaveSelection);
+   EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEUP), bMoveUp);
+   EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEDOWN), bMoveDown);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  MoveRules
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  bMoveUp = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void MoveRules(HWND hwndDlg, BOOL bMoveUp)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnMoveRuleUpClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnMoveRuleUpClick(HWND hwndDlg)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnMoveRuleDownClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnMoveRuleDownClick(HWND hwndDlg)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnCreateRuleClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnCreateRuleClick(HWND hwndDlg)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnDeleteRuleClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnDeleteRuleClick(HWND hwndDlg)
+{
+   /* Get selection and remove it */
+   int nItem = GetFirstSelectedItem(hwndDlg);
+   if (nItem >= 0)
+   {
+      LVITEM item;
+      HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+      item.mask = LVIF_PARAM;
+      item.iItem = nItem;
+      item.iSubItem = 0;
+      ListView_GetItem(hwndListView, &item);
+      /* TODO erase data stored with item */
+      ListView_DeleteItem(hwndListView, nItem);
+   }
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnCommand
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  nCommand = (what?)
+ *          3  :  nNotifyCode = (what?)
+ *          4  :  hwndItem = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnCommand(HWND hwndDlg, int nCommand, int nNotifyCode, HWND hwndItem)
+{
+   switch (nCommand)
+   {
+      case IDCANCEL:
+      case IDC_SAVE:
+         EndDialog(hwndDlg, IDOK);
+         break;
+      case IDC_CREATE:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnCreateRuleClick(hwndDlg);
+         }
+         break;
+      case IDC_DELETE:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnDeleteRuleClick(hwndDlg);
+         }
+         break;
+      case IDC_MOVEUP:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnMoveRuleUpClick(hwndDlg);
+         }
+         break;
+      case IDC_MOVEDOWN:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnMoveRuleDownClick(hwndDlg);
+         }
+         break;
+   }
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnNotify
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  nIdCtrl = (what?)
+ *          3  :  pnmh = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnNotify(HWND hwndDlg, int nIdCtrl, LPNMHDR pnmh)
+{
+   switch (nIdCtrl)
+   {
+      case IDC_RULES:
+         switch (pnmh->code)
+         {
+            case LVN_ITEMCHANGED:
+               OnRulesItemChanged(hwndDlg);
+               break;
+         }
+         break;
+   }
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnDestroy
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnDestroy(HWND hwndDlg)
+{
+   /* TODO any destruction cleanup */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  DialogProc
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  uMsg = (what?)
+ *          3  :  wParam = (what?)
+ *          4  :  lParam = (what?)
+ *
+ * Returns     :  (Please fill me in!)
+ *
+ *********************************************************************/
+static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+   switch (uMsg)
+   {
+      case WM_INITDIALOG:
+         OnInitDialog(hwndDlg);
+         return TRUE;
+
+      case WM_DESTROY:
+         OnDestroy(hwndDlg);
+         return TRUE;
+
+      case WM_COMMAND:
+         OnCommand(hwndDlg, LOWORD(wParam), HIWORD(wParam), (HWND) lParam);
+         break;
+
+      case WM_NOTIFY:
+         OnNotify(hwndDlg, (int) wParam, (LPNMHDR) lParam);
+         break;
+   }
+   return FALSE;
+
+}
+
+#endif /* def WIN_GUI_EDIT - entire file */
+#endif /* ndef _WIN_CONSOLE - entire file */
+
+/*
+  Local Variables:
+  tab-width: 3
+  end:
+*/
diff --git a/w32rulesdlg.h b/w32rulesdlg.h
new file mode 100644 (file)
index 0000000..9fe945d
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef _W32RULESDLG_H
+#define _W32RULESDLG_H
+#define W32RULESDLG_H_VERSION "$Id: w32rulesdlg.h,v 1.1.1.1 2001/05/15 13:59:08 oes Exp $"
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/w32rulesdlg.h,v $
+ *
+ * Purpose     :  A dialog to allow GUI editing of the rules.
+ *                Unfinished.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Written by and Copyright (C) 1999 Adam Lock
+ *                <locka@iol.ie>
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: w32rulesdlg.h,v $
+ *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _WIN_CONSOLE /* entire file */
+#ifdef WIN_GUI_EDIT /* entire file */
+
+extern int ShowRulesDialog(HWND hwndParent);
+extern void SetDefaultRule(const char *pszRule);
+
+#endif /* def WIN_GUI_EDIT - entire file */
+#endif /* ndef _WIN_CONSOLE - entire file */
+
+/* Revision control strings from this header and associated .c file */
+extern const char w32rulesdlg_rcs[];
+extern const char w32rulesdlg_h_rcs[];
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* ndef _W32RULESDLG_H */
+
+
+/*
+  Local Variables:
+  tab-width: 3
+  end:
+*/
index b4ff924..63ac0d3 100644 (file)
@@ -1,4 +1,4 @@
-const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongfoster Exp $";
+const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.2 2001/05/20 15:07:54 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32taskbar.c,v $
@@ -6,8 +6,8 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf
  * Purpose     :  Functions for creating, setting and destroying the
  *                workspace tray icon
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
@@ -32,15 +32,6 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf
  *
  * Revisions   :
  *    $Log: w32taskbar.c,v $
- *    Revision 1.5  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.4  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.3  2001/05/22 18:56:28  oes
- *    CRLF -> LF
- *
  *    Revision 1.2  2001/05/20 15:07:54  jongfoster
  *    File is now ignored if _WIN_CONSOLE is defined.
  *
@@ -77,8 +68,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
  *
  * Function    :  CreateTrayWindow
  *
- * Description :  Creates and returns the invisible window responsible
- *                for processing tray messages.
+ * Description :  Creates and returns the invisible window responsible for processing tray messages.
  *
  * Parameters  :
  *          1  :  hInstance = instance handle of this application
@@ -89,7 +79,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
 HWND CreateTrayWindow(HINSTANCE hInstance)
 {
    WNDCLASS wc;
-   static const char *szWndName = "PrivoxyTrayWindow";
+   static const char *szWndName = "JunkbusterTrayWindow";
 
    wc.style          = 0;
    wc.lpfnWndProc    = TrayProc;
@@ -244,7 +234,7 @@ LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
       case WM_TRAYMSG:
       {
-         /* UINT uID = (UINT) wParam; */
+         UINT uID = (UINT) wParam;
          UINT uMouseMsg = (UINT) lParam;
 
          if (uMouseMsg == WM_RBUTTONDOWN)
index 1945061..9ba21fb 100644 (file)
@@ -1,15 +1,15 @@
-#ifndef W32TASKBAR_H_INCLUDED
-#define W32TASKBAR_H_INCLUDED
-#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.3 2002/03/24 12:03:47 jongfoster Exp $"
+#ifndef _W32TASKBAR_H
+#define _W32TASKBAR_H
+#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.1 2001/05/13 21:57:07 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/w32taskbar.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/w32taskbar.h,v $
  *
  * Purpose     :  Functions for creating, setting and destroying the
  *                workspace tray icon
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
  *
  * Revisions   :
  *    $Log: w32taskbar.h,v $
- *    Revision 1.3  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -65,7 +55,7 @@ extern const char w32taskbar_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef W32TASKBAR_H_INCLUDED */
+#endif /* ndef _W32TASKBAR_H */
 
 
 /*
diff --git a/win32.c b/win32.c
index d9fcec3..2252dc1 100644 (file)
--- a/win32.c
+++ b/win32.c
@@ -1,12 +1,12 @@
-const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp $";
+const char win32_rcs[] = "$Id: win32.c,v 1.1 2001/05/13 21:57:07 administrator Exp $";
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/win32.c,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/win32.c,v $
  *
  * Purpose     :  Win32 User Interface initialization and message loop
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
@@ -31,28 +31,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp
  *
  * Revisions   :
  *    $Log: win32.c,v $
- *    Revision 1.7  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.6  2002/03/16 21:53:28  jongfoster
- *    VC++ Heap debug option
- *
- *    Revision 1.5  2002/03/04 23:47:30  jongfoster
- *    - Rewritten, simpler command-line pre-parser
- *    - not using raise(SIGINT) any more
- *
- *    Revision 1.4  2001/11/30 21:29:33  jongfoster
- *    Fixing a warning
- *
- *    Revision 1.3  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.2  2001/07/29 19:32:00  jongfoster
- *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
- *
- *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -65,7 +43,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp
 
 #include "project.h"
 #include "jcc.h"
-#include "miscutil.h"
 
 /* Uncomment this if you want to build Win32 as a console app */
 /* #define _WIN_CONSOLE */
@@ -75,26 +52,21 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp
 #include <stdarg.h>
 #include <process.h>
 
-#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
-/* Visual C++ Heap debugging */
-#include <crtdbg.h>
-#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */
-
 #include "win32.h"
 
 const char win32_h_rcs[] = WIN32_H_VERSION;
 
 const char win32_blurb[] =
-"Privoxy version " VERSION " for Windows\n"
-"Copyright (C) 2000-2002 by members of the Privoxy Team\n"
-"Copyright (C) 1997-8 by Junkbusters Corp.\n"
-"This is free software; it may be used and copied under the\n"
-"GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n"
+"Internet Junkbuster Proxy(TM) Version " VERSION " for Windows is Copyright (C) 1997-8\n"
+"by Junkbusters Corp.  This is free software; it may be used and copied under\n"
+"the GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n"
 "This program comes with ABSOLUTELY NO WARRANTY OF ANY KIND.\n"
 "\n"
 "For information about how to to configure the proxy and your browser, see\n"
-"        " HOME_PAGE_URL "\n"
-"\n";
+"        " REDIRECT_URL "win\n"
+"\n"
+"The Internet Junkbuster Proxy(TM) is running and ready to serve!\n"
+"";
 
 #ifdef _WIN_CONSOLE
 
@@ -117,12 +89,12 @@ static void  __cdecl UserInterfaceThread(void *);
  * Description :  M$ Windows "main" routine:
  *                parse the `lpCmdLine' param into main's argc and argv variables,
  *                start the user interface thread (for the systray window), and
- *                call main (i.e. patch execution into normal startup).
+ *                call main (i.e. patch execution into normal IJB startup).
  *
  * Parameters  :
- *          1  :  hInstance = instance handle of this execution
- *          2  :  hPrevInstance = instance handle of previous execution
- *          3  :  lpCmdLine = command line string which started us
+ *          1  :  hInstance = instance handle of this IJB execution
+ *          2  :  hPrevInstance = instance handle of previous IJB execution
+ *          3  :  lpCmdLine = command line string which started IJB
  *          4  :  nCmdShow = window show value (MIN, MAX, NORMAL, etc...)
  *
  * Returns     :  `main' never returns, so WinMain will also never return.
@@ -130,64 +102,56 @@ static void  __cdecl UserInterfaceThread(void *);
  *********************************************************************/
 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
 {
+   int argc = 0;
    int i;
    int res;
-   int argc = 1;
-   const char *argv[3];
+   char **argv = NULL;
+   char *pszArgs = NULL;
+   char *pszLastTok;
    char szModule[MAX_PATH+1];
 #ifndef _WIN_CONSOLE
    HANDLE hInitCompleteEvent = NULL;
 #endif
 
+   /* Split command line into arguments */
+   pszArgs = (char *)malloc(strlen(lpCmdLine) + 1);
+   strcpy(pszArgs, lpCmdLine);
 
-#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
-#if 0
-   /* Visual C++ Heap debugging */
-
-   /* Get current flag*/
-   int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
-
-   /* Turn on leak-checking bit */
-   tmpFlag |= _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF;
-
-   /* Turn off CRT block checking bit */
-   tmpFlag &= ~(_CRTDBG_CHECK_CRT_DF | _CRTDBG_DELAY_FREE_MEM_DF);
-
-   /* Set flag to the new value */
-   _CrtSetDbgFlag( tmpFlag );
-#endif
-#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */
-
-   /*
-    * Cheat in parsing the command line.  We only ever have at most one
-    * paramater, which may optionally be specified inside double quotes.
-    */
+   GetModuleFileName(hInstance, szModule, MAX_PATH);
 
-   if (lpCmdLine != NULL)
-   {
-      /* Make writable copy */
-      lpCmdLine = strdup(lpCmdLine);
-   }
-   if (lpCmdLine != NULL)
+   /* Count number of spaces */
+   argc = 1;
+   if (strlen(pszArgs) > 0)
    {
-      chomp(lpCmdLine);
-      i = strlen(lpCmdLine);
-      if ((i >= 2) && (lpCmdLine[0] == '\"') && (lpCmdLine[i - 1] == '\"'))
+      pszLastTok = pszArgs;
+      do
       {
-         lpCmdLine[i - 1] = '\0';
-         lpCmdLine++;
-      }
-      if (lpCmdLine[0] == '\0')
-      {
-         lpCmdLine = NULL;
-      }
+         argc++;
+         pszLastTok = strchr(pszLastTok+1, ' ');
+      } while (pszLastTok);
    }
 
-   GetModuleFileName(hInstance, szModule, MAX_PATH);
+   /* Allocate array of strings */
+   argv = (char **)malloc(sizeof(char *) * argc);
+
+   /* step through command line replacing spaces with zeros, initialise array */
    argv[0] = szModule;
-   argv[1] = lpCmdLine;
-   argv[2] = NULL;
-   argc = ((lpCmdLine != NULL) ? 2 : 1);
+   i = 1;
+   pszLastTok = pszArgs;
+   do
+   {
+      argv[i] = pszLastTok;
+      pszLastTok = strchr(pszLastTok+1, ' ');
+      if (pszLastTok)
+      {
+         while (*pszLastTok != '\0' && *pszLastTok == ' ')
+         {
+            *pszLastTok = '\0';
+            pszLastTok++;
+         }
+      }
+      i++;
+   } while (pszLastTok && *pszLastTok != '\0');
 
 #ifndef _WIN_CONSOLE
    /* Create a user-interface thread and wait for it to initialise */
@@ -200,11 +164,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
 #endif
 
 #ifdef __MINGW32__
-   res = real_main( argc, argv );
+   res = _main( argc, argv );
 #else
    res = main( argc, argv );
 #endif
 
+   /* Cleanup */
+   free(argv);
+   free(pszArgs);
+
    return res;
 
 }
@@ -238,7 +206,7 @@ void InitWin32(void)
    if (WSAStartup(wVersionRequested, &wsaData) != 0)
    {
 #ifndef _WIN_CONSOLE
-      MessageBox(NULL, "Cannot initialize WinSock library", "Privoxy Error", 
+      MessageBox(NULL, "Cannot initialize WinSock library", "Internet JunkBuster Error", 
          MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);  
 #endif
       exit(1);
@@ -262,7 +230,7 @@ void InitWin32(void)
  * Description :  User interface thread.  WinMain will wait for us to set
  *                the hInitCompleteEvent before patching over to `main'.
  *                This ensures the systray window is active before beginning
- *                operations.
+ *                IJB operations.
  *
  * Parameters  :
  *          1  :  pData = pointer to `hInitCompleteEvent'.
@@ -290,7 +258,7 @@ static void __cdecl UserInterfaceThread(void *pData)
    TermLogWindow();
 
    /* Time to die... */
-   exit(0);
+   raise(SIGINT);
 
 }
 
diff --git a/win32.h b/win32.h
index 7c699dc..3011f47 100644 (file)
--- a/win32.h
+++ b/win32.h
@@ -1,14 +1,14 @@
-#ifndef WIN32_H_INCLUDED
-#define WIN32_H_INCLUDED
-#define WIN32_H_VERSION "$Id: win32.h,v 1.4 2002/03/24 12:03:47 jongfoster Exp $"
+#ifndef _WIN32_H
+#define _WIN32_H
+#define WIN32_H_VERSION "$Id: win32.h,v 1.1 2001/05/13 21:57:07 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/win32.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/win32.h,v $
  *
  * Purpose     :  Win32 User Interface initialization and message loop
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
  *
  * Revisions   :
  *    $Log: win32.h,v $
- *    Revision 1.4  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.3  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -78,8 +62,8 @@ extern const char win32_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef WIN32_H_INCLUDED */
-  
+#endif /* ndef _WIN32_H */
+
 /*
   Local Variables:
   tab-width: 3