*.ln
core
# CVS default ignores end
-*.txt
-GNUmakefile
+.\logfile
Makefile
-configure
+config
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
+++ /dev/null
- 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
-
-
+++ /dev/null
---------------------------------------------------------------------
-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.
-
-
+++ /dev/null
-# 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
-#
-#
+++ /dev/null
- 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.
-
-
+++ /dev/null
-# $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:
--- /dev/null
+# 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:
+++ /dev/null
-/*********************************************************************
- *
- * 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 $
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
+#ifndef _CONFIG_H
+#define _CONFIG_H
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/acconfig.h,v $
* 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 */
* 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
-
-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 $
* 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
*
* 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
*
#include <stdio.h>
#include <string.h>
-#include <assert.h>
-#include <stdlib.h>
#include "project.h"
#include "jcc.h"
#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.
*
#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
* 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;
{
freez(dest->string[i]);
dest->string[i] = strdup(str);
- if (NULL == dest->string[i])
- {
- return JB_ERR_MEMORY;
- }
}
}
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])
{
* 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;
}
*
* 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.
* 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;
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;
}
*
* 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.
{
int i;
- if (src == NULL)
- {
- return;
- }
-
for (i = 0; i < ACTION_STRING_COUNT; i++)
{
freez(src->string[i]);
* 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;
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++;
}
/* More to parse next time. */
*line = str + 1;
}
- return JB_ERR_OK;
+ return 0;
}
str++;
{
/* error */
*value = NULL;
- return JB_ERR_PARSE;
+ return 1;
}
/* got value */
chomp(*value);
- return JB_ERR_OK;
+ return 0;
}
* 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)
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;
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:
{
/* 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')) )
*
* 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
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;
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;
}
* 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)
*
* 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;
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);
}
}
{
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;
}
*
* 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.
}
-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
while (cur != NULL)
{
next = cur->next;
- free_url_spec(cur->url);
- free_action(cur->action);
+ free_url(cur->url);
freez(cur);
cur = next;
}
}
-/*********************************************************************
- *
- * 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
*********************************************************************/
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))
{
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 == '{')
{
{
/* 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 */
}
{
/* 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 */
}
}
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);
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';
/* 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 */
}
}
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 */
}
{
/* 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;
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 */
}
{
/* 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 */
}
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)
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;
-}
-#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 $
* 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
#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[];
} /* extern "C" */
#endif
-#endif /* ndef ACTIONS_H_INCLUDED */
+#endif /* ndef _ERRLOG_H */
/*
Local Variables:
-######################################################################
-#
-# 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
#############################################################################
# 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:
*.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:
###/*.*/(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/
/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
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*
/.*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/___
# --------------------------------------------------------------------------
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
# 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
# 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
#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*.
logout.tvspielfilm.de
gmx.tvspielfilm.de
www.freenet.de/customerindex\.html
-/?.*/phpAds
+/.*/phpAds
.fxweb.com/v2-trackrun\.cgi
rtldating.peopleunited.de
.advertising.com
.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}
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
# Jon's addition: MSDN
+
.msdn.microsoft.com
+
#js
.adbusters.com
.freemail*.web.de/online/ordner/anzeigen
.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
+++ /dev/null
-######################################################################\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
-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 $
* 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.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
*
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;
{
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;
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)
#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 */
#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 $
* 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
*
#undef __NOLIBBASE__
#define __CONSTLIBBASEDECL__ const
-#define DEVICES_TIMER_H
#include <proto/exec.h>
#include <exec/tasks.h>
#include <proto/dos.h>
} \
}
-#undef EINTR
#define EINTR 0
-#endif /* ndef AMIGA_H_INCLUDED */
+#endif /* ndef _AMIGA_H */
#endif /* def AMIGA */
+++ /dev/null
-######################################################################\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
-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
*
* 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
*
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
-#include <assert.h>
#ifdef _WIN32
#define snprintf _snprintf
#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...)
*********************************************************************/
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;
}
* 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);
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);
+
}
* 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 :
- * 1 : 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(¤t_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(¤t_time, &dummy);
-#else
- t = gmtime(¤t_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));
}
* 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
{
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);
}
-
+
/*********************************************************************
*
*********************************************************************/
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);
}
}
/*********************************************************************
*
- * 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;
}
* 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;
}
* 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:
-#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 $
*
*
* 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(),
#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[];
} /* extern "C" */
#endif
-#endif /* ndef CGI_H_INCLUDED */
+#endif /* ndef _CGI_H */
/*
Local Variables:
+++ /dev/null
-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&ver=1011487572&section=12&pattern=13
- * &oldval=www.oesterhelt.org%2Fdeanimate-demo">
- *
- * is now this:
- *
- * <a href="eau?f=ijb&v=1011487572&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(¶m, "/");
- }
- else
- {
- err = string_append(¶m, "(?:)");
- }
- 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, §ion_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(§ion_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(§ions, 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", §ionid);
- 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", §ionid);
- 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", §ionid);
- 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", §ionid);
- 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", §ionid);
- 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", §ion1);
- if (!err) err = get_number_param(csp, parameters, "s2", §ion2);
- 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, ¶m); \
- if ((param == NULL) || (0 == strcmp(param, "CUSTOM"))) \
- { \
- JAVASCRIPTIFY(js_name, name "-param"); \
- if (!err) err = get_string_param(parameters, js_name, ¶m); \
- } \
- 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:
-*/
+++ /dev/null
-#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:
-*/
+++ /dev/null
-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:
-*/
+++ /dev/null
-#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:
-*/
-# 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.18 2001/07/18 12:28:20 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
#
# 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
#
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
# 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
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.
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
# 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
#
# 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.
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
#
# 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:
#
# 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
#
#
# 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).
#
# 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.)
# 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:
# 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:
#
# 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
# 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.
+# Note: If you intend to chain junkbuster and squid locally, the chain
+# broswer -> squid -> junkbuster 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 junkbuster as parent cache
+# cache_peer 127.0.0.1 8000 parent 0 no-query
#
# # Define ACL for protocol FTP
# acl FTP proto FTP
#
-# # Do not forward ACL FTP to Privoxy
+# # Do not forward ACL FTP to junkbuster
# always_direct allow FTP
#
-# # Do not forward ACL CONNECT (https) to Privoxy
+# # Do not forward ACL CONNECT (https) to junkbuster
# always_direct allow CONNECT
#
-# # Forward the rest to Privoxy
+# # Forward the rest to junkbuster
# 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
# 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
# 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
# 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).
#
#
-# 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
+++ /dev/null
-#! /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:
--- /dev/null
+/* 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 */
-#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 $
* 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
*
*********************************************************************/
\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 8
/*
* Version number, as a string
*/
-#define VERSION "2.9.13"
+#define VERSION "2.9.8"
/*
* 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 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 */
-#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 $
* 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
+ * Revision 1.2 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 8
/*
* Version number, as a string
*/
-#define VERSION "2.9.13"
+#define VERSION "2.9.8"
/*
* 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 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 */
+/* #undef FEATURE_PTHREAD */
-/* 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 */
+++ /dev/null
-#! /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:
--- /dev/null
+#! /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=8
+
+
+
+
+
+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
+
+
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.11 2001/07/21 18:00:07 jongfoster 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
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 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=8
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 ])
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)
-# 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
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
# 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
# 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
# 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
\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
# 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
# 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
\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
+++ /dev/null
-#!/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:
-#
-#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
- *
*
*********************************************************************/
*/
#endif /* def __MINGW32__ */
-#endif /* ndef CYGWIN_H_INCLUDED */
+#endif /* ndef _CYGWIN_H */
/*
-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 $
* 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)
*
* 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
*
*
* 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 :
* 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)
* 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)
{
/*
* 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)
{
* 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)
{
*/
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;
}
/*
* 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;
*/
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;
}
-#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 $
*
*
* 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.
struct binbuffer
{
char *buffer;
- size_t offset;
- size_t size;
+ int offset;
+ int size;
};
/*
} /* extern "C" */
#endif
-#endif /* ndef DEANIMATE_H_INCLUDED */
+#endif /* ndef _DEANIMATE_H */
/*
Local Variables:
+++ /dev/null
-# ********************************************************************
-#
-# 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.
-#
-#
-#
--- /dev/null
+@ 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:
--- /dev/null
+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 *
+*****************************************************************************
+
<!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
\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">·</b> <a href="ijbman.html">\r
Manual</a> <b class="dot">·</b> <a href="ijbfaq.html">\r
FAQ</a> <b class="dot">·</b> <b>GPL</b></p>\r
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
"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">·</b> <a href="ijbman.html">\r
Manual</a> <b class="dot">·</b> <a href="ijbfaq.html">\r
FAQ</a> <b class="dot">·</b> <b>GPL</b></p>\r
<!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
<!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
+++ /dev/null
-.\" 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.
+++ /dev/null
-developer-manual
-faq
-ldpOK.dsl
-user-manual
+++ /dev/null
-<!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 < 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 < 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 <iostream.h> /* 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 <sys/fileName.h>
-</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&group_id=11118&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>
+++ /dev/null
-<!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>
+++ /dev/null
-<!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
+++ /dev/null
-<!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>
- /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-</para>
-<para>
- /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>
- /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-</para>
-<para>
- /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 [<ip-address>]:<port></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 <domain>/<path>, where both the
- <domain> and <path> 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 <BLINK> tag was a crime!
- #
- s*<blink>|</blink>**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/<font color=red><b>BINGO!</b></font>/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/<img\s+[^>]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\s*['"]?1(\D[^>]*?)?>/<!-- Squished WebBug -->/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
- -> Preferences -> Advanced -> Proxies -> HTTP Proxy</literal>.
- For <application>Internet Explorer</application>: <literal>Tools >
- Internet Properties -> Connections -> 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 -> Preferences -> Debug -> 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&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&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&group_id=11118&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>
- <ulink url="http://sourceforge.net/projects/ijbswa">http://sourceforge.net/projects/ijbswa</ulink>
- </member>
- </simplelist>
- <simplelist>
- <member>
- <ulink url="http://www.privoxy.org/">http://www.privoxy.org/</ulink>
- </member>
- </simplelist>
- <simplelist>
- <member>
- <ulink url="http://p.p/">http://p.p/</ulink>
- </member>
- </simplelist>
- <simplelist>
- <member>
- <ulink url="http://www.junkbusters.com/ht/en/cookies.html">http://www.junkbusters.com/ht/en/cookies.html</ulink>
- </member>
- </simplelist>
- <simplelist>
- <member>
- <ulink url="http://www.waldherr.org/junkbuster/">http://www.waldherr.org/junkbuster/</ulink>
- </member>
- </simplelist>
- <simplelist>
- <member>
- <ulink url="http://privacy.net/analyze/">http://privacy.net/analyze/</ulink>
- </member>
- </simplelist>
- <simplelist>
- <member>
- <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>
+++ /dev/null
-
-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
+++ /dev/null
-
-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
+++ /dev/null
-
-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
+++ /dev/null
-developer-manual
-faq
-user-manual
-man-page
\ No newline at end of file
+++ /dev/null
-# 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]
-
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
+++ /dev/null
-# 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]
-
-
+++ /dev/null
-<!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>. 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>
-
+++ /dev/null
-<?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>
- <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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
-<!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&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>
+++ /dev/null
-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 }
+++ /dev/null
-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 }
-<?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
// 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.)
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 $
+//
+++ /dev/null
-# 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/
-
-
-
--- /dev/null
+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; }
--- /dev/null
+<!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>
--- /dev/null
+<!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>
-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 $
* 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.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
*
#include "config.h"
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
+#include <malloc.h>
#include "encode.h"
*
* 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)
{
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
*
* 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)
{
*
* 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)
{
* 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'))
{
{
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;
break;
case '%':
- if ((*q = xtoi(s + 1)) != '\0')
+ if ((*q = xtoi(s + 1)))
{
s += 3;
q++;
-#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
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[];
} /* extern "C" */
#endif
-#endif /* ndef ENCODE_H_INCLUDED */
+#endif /* ndef _ENCODE_H */
/*
Local Variables:
-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 $
* 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.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
\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>
#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;
/* 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);
+
/*********************************************************************
*
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. */
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.
if ((logfp != NULL) && (logfp != stderr))
{
- log_error(LOG_LEVEL_INFO, "(Re-)Open logfile %s", logfname ? logfname : "none");
fclose(logfp);
}
logfp = stderr;
/* 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 */
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);
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)
/*
}
/* 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;
}
while ((*src) && (outc < BUFFER_SIZE-2))
{
char tempbuf[BUFFER_SIZE];
- char *sval = NULL;
+ char *sval;
int ival;
unsigned uval;
long lval;
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 */
outc += ival;
if (outc < BUFFER_SIZE-1)
{
- memcpy(outbuf + oldoutc, sval, (size_t) ival);
+ memcpy(outbuf + oldoutc, sval, ival);
}
else
{
#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
*/
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;
}
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 */
{
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;
logfp = stderr;
}
- fputs(outbuf_save, logfp);
+ fputs(outbuf, logfp);
if (loglevel == LOG_LEVEL_FATAL)
{
- fatal_error(outbuf_save);
+ fatal_error(outbuf);
/* Never get here */
}
#if defined(_WIN32) && !defined(_WIN_CONSOLE)
/* Write to display */
- LogPutString(outbuf_save);
+ LogPutString(outbuf);
#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */
}
* 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) \
tab-width: 3
end:
*/
+
-#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 $
* 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
#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
} /* extern "C" */
#endif
-#endif /* ndef ERRLOG_H_INCLUDED */
+#endif /* ndef _ERRLOG_H */
/*
Local Variables:
-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.23 2001/07/23 13:40:12 oes Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/filters.c,v $
* 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
*
* 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.
*
#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"
#include "cgi.h"
#include "list.h"
#include "deanimate.h"
-#include "urlmatch.h"
#ifdef _WIN32
#include "win32.h"
#define ijb_isdigit(__X) isdigit((int)(unsigned char)(__X))
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
/*********************************************************************
*
* Function : block_acl
*
* 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.
masklength = 32;
port = 0;
- if ((p = strchr(aspec, '/')) != NULL)
+ if ((p = strchr(aspec, '/')))
{
*p++ = '\0';
return(-1);
}
- if ((p = strchr(aspec, ':')) != NULL)
+ if ((p = strchr(aspec, ':')))
{
*p++ = '\0';
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);
}
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 */
/*********************************************************************
*********************************************************************/
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;
+ 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 */
+
+ 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);
+
+ rsp->body = fill_template(csp, "blocked", exports);
+ free_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. */
+ if (csp->http->user_agent && !strncmpic(csp->http->user_agent, "mozilla", 7))
{
- rsp->status = strdup("200 Request for blocked URL");
+ 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();
+ rsp->status = strdup("404 Request for blocked URL");
}
- 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);
-
- if (err)
- {
- free_map(exports);
- free_http_response(rsp);
- return cgi_error_memory();
- }
-
- err = template_fill_for_cgi(csp, "blocked", exports, rsp);
- if (err)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
}
- 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
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
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");
+ exports = map_block_killer(exports, "have-trust-info");
}
-
- if (err)
- {
- free_map(exports);
- free_http_response(rsp);
- return cgi_error_memory();
- }
-
+
/*
* 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
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...)
*
*********************************************************************/
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;
}
-#endif /* def FEATURE_IMAGE_DETECT_MSIE */
+ 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
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
{
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)
+ if ( NULL == b->joblist )
{
- 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, "Empty joblist. Nothing to do.");
+ return(NULL);
}
- /*
- * 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)
- {
- for (filtername = csp->action->multi[ACTION_MULTI_FILTER]->first;
- filtername ; filtername = filtername->next)
- {
- if (strcmp(b->name, filtername->str) == 0)
- {
- int current_hits = 0;
+ log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) ...",
+ csp->http->hostport, csp->http->path, size);
- 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;
- }
- }
- }
-
- /*
- * If there were no hits, destroy our copy and let
- * chat() use the original in csp->iob
- */
- if (!hits)
+ /* Apply all jobs from the joblist */
+ for (job = b->joblist; NULL != job; job = job->next)
{
- free(new);
- return(NULL);
+ hits += pcrs_execute(job, old, size, &new, &size);
+ if (old != csp->iob->cur) free(old);
+ old=new;
}
- csp->flags |= CSP_FLAG_MODIFIED;
+ log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size);
+
csp->content_length = size;
- IOB_RESET(csp);
+ /* fwiw, reset the iob */
+ IOB_RESET(csp);
return(new);
}
*
* 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))) )
}
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);
+ }
}
* 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;
* 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);
}
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;
+ }
+
}
-#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 $
* 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
*/
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
} /* extern "C" */
#endif
-#endif /* ndef FILTERS_H_INCLUDED */
+#endif /* ndef _FILTERS_H */
/*
Local Variables:
-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.3 2001/06/09 10:55:28 jongfoster Exp $";
/*********************************************************************
*
- * File : $Source: /cvsroot/ijbswa/current/gateway.c,v $
+ * File : $Source: /cvsroot/ijbswa//current/gateway.c,v $
*
* Purpose : Contains functions to connect to a server, possibly
* using a "forwarder" (i.e. HTTP proxy and/or a SOCKS4
* 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
*
* 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
*
#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>
#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"
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
* 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;
/* Should never get here */
log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type.");
errno = EINVAL;
- return(JB_INVALID_SOCKET);
+ return(-1);
}
}
* 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;
if (err)
{
errno = EINVAL;
- return(JB_INVALID_SOCKET);
+ return(-1);
}
/* build a socks request for connection to the web server */
{
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;
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;
/* 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)
errno = EACCES;
break;
default:
- errstr = cbuf;
+ errstr = (char *) cbuf;
errno = ENOENT;
sprintf(errstr,
"SOCKS request rejected for reason code %d\n", s->cd);
log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s ...", errstr);
close_socket(sfd);
- return(JB_INVALID_SOCKET);
+ return(-1);
}
-#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 $
* 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[];
} /* extern "C" */
#endif
-#endif /* ndef GATEWAY_H_INCLUDED */
+#endif /* ndef _GATEWAY_H */
/*
Local Variables:
+++ /dev/null
-#!/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
+++ /dev/null
-######################################################################\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
-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 $
* 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.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.
*
#else
-#ifndef __OS2__
#include <unistd.h>
-#endif
#include <sys/time.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#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"
* 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
}
#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);
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);
* 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
}
* 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
}
* 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
* 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 */
if (errno == EADDRINUSE)
#endif
{
- return(-3);
+ return(-2);
}
else
{
}
}
- *pfd = fd;
- return 0;
+ return fd;
}
* 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
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");
* 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'))
{
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)
{
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,
-#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 $
* 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[];
} /* extern "C" */
#endif
-#endif /* ndef JBSOCKETS_H_INCLUDED */
+#endif /* ndef _JBSOCKETS_H */
/*
Local Variables:
-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.28 2001/07/23 13:26:12 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
*
* 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
*
#include <fcntl.h>
#include <errno.h>
-#ifdef FEATURE_PTHREAD
+#if defined(FEATURE_PTHREAD) && !defined(__BEOS__)
#include <pthread.h>
-#endif /* def FEATURE_PTHREAD */
+#endif /* def FEATURE_PTHREAD && ndef __BEOS__ */
#ifdef _WIN32
# ifndef FEATURE_PTHREAD
#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__
# 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
#include "jcc.h"
#include "filters.h"
#include "loaders.h"
+#include "showargs.h"
#include "parsers.h"
#include "killpopup.h"
#include "miscutil.h"
#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);
#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[] =
"(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.
*
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;
* 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);
{
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
*/
{
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;
* 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.
- *
- * connect = Open a socket to the host:port of the server
- * and short-circuit server and client socket.
+ * HTTP request that has only the path component
+ * without the http://domainspec
+ * pass = pass the original HTTP request unchanged
*
- * 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;
}
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;
}
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);
}
}
* 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;
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)
{
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;
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;
/* 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
* 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)
{
/*
}
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
{
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
*/
/* 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')
{
*/
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 */
* Filter the part of the body that came in the same read
* as the last headers:
*/
- filter_popups(csp->iob->cur, csp);
+ filter_popups(csp->iob->cur, csp->iob->eod - csp->iob->cur);
}
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
/* Buffer and pcrs filter this if appropriate. */
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");
-
- /* the write failed, so don't bother
- * mentioning it to the client...
- * it probably can't hear us anyway.
- */
- freez(hdr);
- return;
- }
+ log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
- 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);
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);
}
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;
}
#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
* 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))
{
- char *abs_file;
+ 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))
+ {
+ 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;
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]);
- }
- }
- 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]);
- }
- }
+#ifndef _WIN32
+ signal(SIGPIPE, SIG_IGN);
+ signal(SIGCHLD, SIG_IGN);
-}
#else /* ifdef _WIN32 */
# ifdef _WIN_CONSOLE
/*
#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 */
}
-/*********************************************************************
- *
- * 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
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)
{
-#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+ 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)
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();
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 ... ");
#ifdef AMIGA
if(!childs)
{
- exit(1);
+ exit(1);
}
#endif
freez(csp);
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))
{
/* 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");
freez(csp);
continue;
}
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
/* add it to the list of clients */
csp->next = clients->next;
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);
#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
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)))
{
wait( NULL );
#endif /* !defined(_WIN32) && defined(__CYGWIN__) */
close_socket(csp->cfd);
- csp->flags &= ~CSP_FLAG_ACTIVE;
+ csp->active = 0;
}
#endif
write_socket(csp->cfd, buf, strlen(buf));
close_socket(csp->cfd);
- csp->flags &= ~CSP_FLAG_ACTIVE;
+ csp->active = 0;
sleep(5);
continue;
}
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 */
}
-#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 $
* 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
} /* extern "C" */
#endif
-#endif /* ndef JCC_H_INCLUDED */
+#endif /* ndef _JCC_H */
/*
Local Variables:
--- /dev/null
+# $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.
--- /dev/null
+# $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
--- /dev/null
+.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
--- /dev/null
+#!/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
--- /dev/null
+#! /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
#
-# 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
}
# ********************************************************************
#
-# 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 $
#
#
# ********************************************************************/
# ********************************************************************
#
-# 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
#
-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 $
* 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
*
* 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(
#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:
-#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 $
* 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:
-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 $
* `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
*
* 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
#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
* 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;
}
* 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;
}
*
* 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);
}
* 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));
}
*
* 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);
+
}
* 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;
}
*********************************************************************/
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;
}
*
* 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;
}
* 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 "";
+
}
-#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 $
* `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
#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[];
} /* extern "C" */
#endif
-#endif /* ndef LIST_H_INCLUDED */
+#endif /* ndef _LIST_H */
/*
Local Variables:
-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
*
* 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
#include <fcntl.h>
#include <errno.h>
#include <ctype.h>
-#include <assert.h>
#ifdef _WIN32
#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>
#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;
#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;
#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" */
#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" */
#define hash_show_on_task_bar 215410365ul /* "show-on-task-bar" */
-static void savearg(char *command, char *argument, struct configuration_spec * config);
/*********************************************************************
*
{
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)
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);
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
/*********************************************************************
* 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.
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);
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));
/*
* 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".
config->multi_threaded = 1;
config->hport = HADDR_PORT;
- config->buffer_limit = 4096 * 1024;
- config->proxy_args = strdup("");
if ((configfp = fopen(configfile, "r")) == NULL)
{
/* 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];
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);
{
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;
{
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;
{
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;
* 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);
{
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;
{
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;
{
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);
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);
{
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;
{
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;
{
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);
{
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);
/* 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);
{
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;
{
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;
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);
{
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);
/* 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);
{
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");
{
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;
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;
* 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;
#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;
#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 :
/* 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)
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")) )
}
setbuf(config->jar, NULL);
}
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
if ( NULL == config->haddr )
{
if ( NULL != config->haddr )
{
- if (NULL != (p = strchr(config->haddr, ':')))
+ if ((p = strchr(config->haddr, ':')))
{
*p++ = '\0';
if (*p)
}
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 */
}
-/*********************************************************************
- *
- * 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
-#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 $
* 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;
*/
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[];
} /* extern "C" */
#endif
-#endif /* ndef LOADCFG_H_INCLUDED */
+#endif /* ndef _JCC_H */
/*
Local Variables:
-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
*
* 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
#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;
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 */
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 ) )
{
(nfl->unloader)(nfl->f);
+#ifndef SPLIT_PROXY_ARGS
+ freez(nfl->proxy_args);
+#endif /* ndef SPLIT_PROXY_ARGS */
+
freez(nfl->filename);
freez(nfl);
}
+/*********************************************************************
+ *
+ * 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.
* 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
}
fs = (struct file_list *)zalloc(sizeof(struct file_list));
+
if (fs == NULL)
{
/* Out of memory error */
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
*********************************************************************/
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 */
/*********************************************************************
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))
{
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;
reject = 0;
p = buf;
q = p+1;
- while ((*p++ = *q++) != '\0')
+ while ((*p++ = *q++))
{
/* nop */
}
if (trusted)
{
*tl++ = b->url;
- /* FIXME BUFFER OVERFLOW if >=64 entries */
}
}
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)
{
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.
*********************************************************************/
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...)
{
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;
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;
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);
* 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;
-#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 $
* 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);
} /* extern "C" */
#endif
-#endif /* ndef LOADERS_H_INCLUDED */
+#endif /* ndef _LOADERS_H */
/*
Local Variables:
-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
*
* 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
*
#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
* Returns : Pointer to newly malloc'd memory chunk.
*
*********************************************************************/
-void *zalloc(size_t size)
+void *zalloc(int size)
{
void * ret;
}
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
* 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 )
{
}
-
/*********************************************************************
*
* 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
*********************************************************************/
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;
}
*********************************************************************/
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];
*
* 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;
}
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;
}
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;
}
-/*
- * 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
-#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 $
* 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);
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);
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[];
}
#endif
-#endif /* ndef MISCUTIL_H_INCLUDED */
+#endif /* ndef _MISCUTIL_H */
/*
Local Variables:
-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.18 2001/07/13 14:02:46 oes Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
* `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
*
* 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 '/'.
* 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.
#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
#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;
* 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))
{ "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
};
* 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);
}
* 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)
}
/* 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;
iob->cur = iob->buf;
iob->eod = p;
- return;
+ return(need);
}
*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')
}
-/*********************************************************************
- *
- * 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
* 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;
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);
+ freez(http->user_agent);
+
}
/*********************************************************************
*
- * 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;
+ }
+
+ if (n == 2)
+ {
+ http->host = strdup(v[0]);
+ http->port = atoi(v[1]);
+ }
- sprintf(*header, "Content-Length: %d", (int) csp->content_length);
+ freez(buf);
- log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", (int) csp->content_length);
+ 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
* 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);
}
* bug workarounds. 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;
+ /* Save the client's User-Agent: value */
+ if (strlen(s) >= 12)
+ {
+ csp->http->user_agent = strdup(s + 12);
+ }
+
+#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;
}
* 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;
}
* 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;
}
* 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
{
}
/*
- * 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;
}
* 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 */
/*********************************************************************
* 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;
- }
-
- tmp = strdup("Cookie: ");
+ struct list *lst;
+ char *tmp = NULL;
+ char *e;
- 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;
- }
+ char *ret;
- log_error(LOG_LEVEL_HEADER, "addh: %s", tmp);
- err = enlist(csp->headers, tmp);
- free(tmp);
- return err;
-}
-
-
-/*********************************************************************
- *
- * 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;
}
* 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;
}
* 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 :
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');
return(hits);
}
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
/*
-#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 $
* 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
*
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[];
} /* extern "C" */
#endif
-#endif /* ndef PARSERS_H_INCLUDED */
+#endif /* ndef _PARSERS_H */
/*
Local Variables:
-/* For Privoxy, we just use Privoxy's config.h */
+/* For JunkBuster, we just use JunkBuster's config.h */
#include "../config.h"
/* Win32 uses DLL by default */
#ifdef _WIN32
-# ifdef STATIC_PCRE
+# ifdef STATIC
# define PCRE_DL_IMPORT
# else
# define PCRE_DL_IMPORT __declspec(dllimport)
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];
-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
*
* - 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
*
* 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
*
#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
* 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;
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;
* 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
* 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;
}
* 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
}
-
/*********************************************************************
*
* Function : pcrs_free_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
*/
}
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 ?
*/
free(tokens[0]);
return NULL;
}
-
+
newjob = pcrs_compile(tokens[1], tokens[2], tokens[3], errptr);
free(tokens[0]);
return newjob;
-
+
}
* 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 = "";
/*
/*
* Evaluate the options
*/
- newjob->options = pcrs_parse_perl_options(options, &flags);
+ newjob->options = pcrs_compile_perl_options(options, &flags);
newjob->flags = flags;
}
- /*
- * 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;
}
-/*********************************************************************
- *
- * 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
* 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)
{
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];
/* 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;
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;
*/
if ((*result = (char *)malloc(newsize)) == NULL) /* must be free()d by caller */
{
- free(matches);
return PCRS_ERR_NOMEM;
}
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]);
/* ..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)
{
memcpy(result_offset, subject + offset, subject_length - offset);
*result_length = newsize;
- free(matches);
return matches_found;
}
-#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:
#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:
+++ /dev/null
-# $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.
-#
-#
-#
+++ /dev/null
-# $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
-#
-#
+++ /dev/null
-.\" 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.
+++ /dev/null
-#!/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
+++ /dev/null
-#! /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
-#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.23 2001/07/18 12:32:23 oes 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
#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;
+ char *user_agent; /* Client's User-Agent: header value */
};
-/*
- * 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 */
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. */
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 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.
*/
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: */
*/
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: */
};
+/* 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 */
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.
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];
/* 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
{
/*
* 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 *);
/* 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.
*/
};
-#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 */
/* 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 */
+ char *username;
+ char *filtername;
+ 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 */
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.
*
int debug;
int multi_threaded;
- /* Features that can be enabled/disabled throuigh the config file */
- unsigned feature_flags;
-
const char *logfile;
const char *confdir;
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;
#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:
--- /dev/null
+# ********************************************************************
+#
+# 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
--- /dev/null
+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:
+*/
--- /dev/null
+#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 */
-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 $
* 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.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
*
#include <string.h>
#include <stdlib.h>
+#ifdef _WIN32
+#include <malloc.h>
+#endif
+
#include "ssplit.h"
#include "miscutil.h"
-#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 $
* 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
*
} /* extern "C" */
#endif
-#endif /* ndef SSPLIT_H_INCLUDED */
+#endif /* ndef _SSPLIT_H */
/*
Local Variables:
##########################################################
#
-# "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
# - 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>
##########################################################
#
-# "Blocked" Error Output template for Privoxy.
+# "Blocked" Error Output template for junkbuster 2.9.x.
# Compact variant.
#
# USING HTML TEMPLATES:
# - 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>
<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@ -->
+++ /dev/null
-##########################################################
-#
-# 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>
+++ /dev/null
-##########################################################
-#
-# 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>
+++ /dev/null
-##########################################################
-#
-# 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>
+++ /dev/null
-##########################################################
-#
-# 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>
+++ /dev/null
-##########################################################
-#
-# 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>
+++ /dev/null
-##########################################################
-#
-# 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>
##########################################################
#
-# No-Such-Domain Error Output template for Privoxy.
+# No-Such-Domain Error Output template for junkbuster 2.9.x.
#
#
# USING HTML TEMPLATES:
# - 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>
##########################################################
#
-# Default-CGI Output template for Privoxy.
+# Default-CGI Output template for junkbuster 2.9.x.
#
#
# USING HTML TEMPLATES:
# - 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>
+++ /dev/null
-##############################################################################
-#
-# 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">
- <input type="reset" value="Reset">
- <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>
-
+++ /dev/null
-##############################################################################
-#
-# 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"> </td>
- <td class="dis1"> </td>
- <td class="noc1"> </td>
- <td> </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"> </td>
- <td class="dis1"> </td>
- <td class="noc1"> </td>
- <td> </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> <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"> </td>
- <td class="dis2"> </td>
- <td class="noc2"> </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"> </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"> 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"> </td>
- <td class="dis2"> </td>
- <td class="noc2"> </td>
- <td> </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. </td>
- </tr>
- <tr class="bg1" align="left" valign="top" id="hide_referer_opts">
- <td class="en1"> </td>
- <td class="dis1"> </td>
- <td class="noc1"> </td>
- <td> </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. (Breaks many web
- sites).</td>
- </tr>
- <tr class="bg2" align="left" valign="top" id="user_agent_opts">
- <td class="en2"> </td>
- <td class="dis2"> </td>
- <td class="noc2"> </td>
- <td> </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. Disable to always send a HTML
- "blocked" page.</td>
- </tr>
- <tr class="bg2" align="left" valign="top" id="image_blocker_opts">
- <td class="en2"> </td>
- <td class="dis2"> </td>
- <td class="noc2"> </td>
- <td> </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"> </td>
- <td class="dis1"> </td>
- <td class="noc1"> </td>
- <td> </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"> </td>
- <td class="dis2"> </td>
- <td class="noc2"> </td>
- <td> </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>
-
+++ /dev/null
-<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"> @description@ (@name@) <input type="hidden" name="filter_n@index@" value="@name@"></td>\r
-</tr>\r
+++ /dev/null
-##############################################################################
-#
-# 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@&v=@v@&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>
+++ /dev/null
-##############################################################################
-#
-# 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@&v=@v@&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@&v=@v@&s=@s@">Add</a></td>
- <td align="left"> </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"> @if-s-prev-exists-start@<a href="eass?f=@f@&v=@v@&s1=@s-prev@&s2=@s@">Move section up</a> @if-s-prev-exists-end@</td>
- <td class="nbr"> <a href="easa?f=@f@&v=@v@&s=@s@">Insert new section below</a> </td>
- </tr>
- <tr valign="middle" align="center">
- <td class="nbr"> @if-s-next-exists-start@<a href="eass?f=@f@&v=@v@&s1=@s@&s2=@s-next@">Move section down</a> @if-s-next-exists-end@</td>
- <td class="nbr"> @if-empty-section-start@<a href="easr?f=@f@&v=@v@&s=@s@">Delete whole section</a> @if-empty-section-end@</td>
- </tr>
- </table>
- </td>
-</tr>
-</table>
-<p> </p>
-
+++ /dev/null
-##############################################################################
-#
-# 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"> </td>
-<td align="center" class="nbr"><a name="l@p@"
-href="ear?f=@f@&v=@v@&p=@p@" onclick="return rm_p(@p@,'@url@');">Remove</a> <a
-href="eau?f=@f@&v=@v@&p=@p@">Edit</a> </td>
-<td class="url" align="left">@url-html@</td>
-</tr>
+++ /dev/null
-##############################################################################
-#
-# 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@&v=@v@&p=@p@">OK</a>
-
- <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>
-
+++ /dev/null
-##############################################################################
-#
-# 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">
- <input type="reset" value="Reset">
- <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>
-
##########################################################
#
-# No-Such-Domain Error Output template for Privoxy.
+# No-Such-Domain Error Output template for junkbuster 2.9.x.
#
#
# USING HTML TEMPLATES:
# - 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>
# 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>
+++ /dev/null
-##########################################################
-#
-# 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>
##########################################################
#
-# Show-Status-CGI Output template for Privoxy.
+# Show-Status-CGI Output template for junkbuster 2.9.x
#
# USING HTML TEMPLATES:
# ---------------------
# - 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
# 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
##########################################################
#
-# 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:
# - 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
##########################################################
#
-# Show-Url-Info-CGI Output template for Privoxy.
+# Show-Url-Info-CGI Output template for junkbuster 2.9.x.
#
#
# USING HTML TEMPLATES:
# - 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:
<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> </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>
+++ /dev/null
-##########################################################
-#
-# 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> </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>
+++ /dev/null
-##########################################################
-#
-# 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>
+++ /dev/null
-##########################################################
-#
-# 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>
##########################################################
#
-# "Untrusted" Error Output template for Privoxy.
+# "Untrusted" Error Output template for junkbuster 2.9.x.
#
#
# USING HTML TEMPLATES:
# - 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:
<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
+++ /dev/null
-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
-
+++ /dev/null
-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:
-*/
+++ /dev/null
-#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:
-*/
-# 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
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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
\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
\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
\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
*
* 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 */
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
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
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
"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 */
-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 $
* 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.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
*
#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;
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 */
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();
*********************************************************************/
HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance)
{
- static const char *szWndName = "PrivoxyLogOwner";
+ static const char *szWndName = "JunkbusterLogLogOwner";
WNDCLASS wc;
HWND hwnd;
*********************************************************************/
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;
* 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
*
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;
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);
/* 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)
{
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;
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:
{
/* 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
}
-#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 $
* 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.
*
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 */
} /* extern "C" */
#endif
-#endif /* ndef W32LOG_H_INCLUDED */
+#endif /* ndef _W32LOG_H */
/*
-#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:
--- /dev/null
+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:
+*/
--- /dev/null
+#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:
+*/
-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 $
* 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.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.
*
*
* 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
HWND CreateTrayWindow(HINSTANCE hInstance)
{
WNDCLASS wc;
- static const char *szWndName = "PrivoxyTrayWindow";
+ static const char *szWndName = "JunkbusterTrayWindow";
wc.style = 0;
wc.lpfnWndProc = TrayProc;
case WM_TRAYMSG:
{
- /* UINT uID = (UINT) wParam; */
+ UINT uID = (UINT) wParam;
UINT uMouseMsg = (UINT) lParam;
if (uMouseMsg == WM_RBUTTONDOWN)
-#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
} /* extern "C" */
#endif
-#endif /* ndef W32TASKBAR_H_INCLUDED */
+#endif /* ndef _W32TASKBAR_H */
/*
-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>
*
* 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
#include "project.h"
#include "jcc.h"
-#include "miscutil.h"
/* Uncomment this if you want to build Win32 as a console app */
/* #define _WIN_CONSOLE */
#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
* 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.
*********************************************************************/
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 */
#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;
}
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);
* 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'.
TermLogWindow();
/* Time to die... */
- exit(0);
+ raise(SIGINT);
}
-#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
} /* extern "C" */
#endif
-#endif /* ndef WIN32_H_INCLUDED */
-
+#endif /* ndef _WIN32_H */
+
/*
Local Variables:
tab-width: 3