*.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.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
+#
+# 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.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@
+
+# Need to define this in order to link PCRE statically under Win32
+# Also define under UNIX to use system PCRE headers.
+PCRE_WIN_FLAGS = @STATIC_PCRE_ONLY@-DSTATIC
+
+# 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) \
+ -Ipcre $(CYGWIN_FLAGS) $(PCRE_WIN_FLAGS)
+
+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
+
+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 = @PCRS_ONLY@pcrs.c
+PCRS_OBJS = $(PCRS_SRC:.c=.$(OBJEXT))
+PCRS_HDRS = $(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
+PCRE_LIB = @LIBRARY_PCRE_ONLY@-lpcre
+
+# No REGEX:
+@NO_REGEX_ONLY@REGEX_SRC =
+# Without PCRE:
+@GNU_REGEX_ONLY@REGEX_SRC = gnu_regex.c
+# With PCRE:
+@PCRE_REGEX_ONLY@REGEX_SRC = @STATIC_PCRE_ONLY@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
+
+LIBS = $(PCRE_LIB) $(W32_LIB) $(SOCKET_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 @WIN_ONLY@win32.h cgi.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
+
+# 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
- * 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
*/
#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".
+ * Regular expression matching for URLs. (Highly recommended). If this is
+ * not defined then you can ony use prefix matching.
*/
-#undef CODE_STATUS
+#undef REGEX
/*
- * 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.
+ * 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 REGEX_GNU
-#undef REGEX_PCRE
+#undef TOGGLE
-/*
- * 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.
+/*
+ * Enables arbitrary content modification regexps
*/
-#undef STATIC_PCRE
+#undef PCRS
-/*
- * 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.
+/*
+ * 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 STATIC_PCRS
+#undef DENY_GZIP
/*
- * Allows the use of an ACL to control access to the proxy by IP address.
+ * Enables statistics function.
*/
-#undef FEATURE_ACL
+#undef STATISTICS
/*
- * Enables the web-based configuration (actionsfile) editor. If you
- * have a shared proxy, you might want to turn this off.
+ * Bypass filtering for 1 page only
*/
-#undef FEATURE_CGI_EDIT_ACTIONS
+#undef FORCE_LOAD
/*
- * Allows the use of jar files to capture cookies.
+ * Locally redirect remote script-redirect URLs
*/
-#undef FEATURE_COOKIE_JAR
+#undef FAST_REDIRECTS
/*
- * Locally redirect remote script-redirect URLs
+ * Split the show-proxy-args page into a page for each config file.
*/
-#undef FEATURE_FAST_REDIRECTS
+#undef SPLIT_PROXY_ARGS
/*
- * Bypass filtering for 1 page only
+ * Kills JavaScript popups - window.open, onunload, etc.
*/
-#undef FEATURE_FORCE_LOAD
+#undef KILLPOPUPS
/*
- * 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.
+ * 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.
+ * Use PCRE rather than GNU Regex
*/
-#undef __EXTENSIONS__
+#undef PCRE
/*
- * 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
+ * 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 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 *)
- */
-#undef HAVE_GMTIME_R
-#undef HAVE_LOCALTIME_R
+#undef WIN_GUI_EDIT
@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/
- */
-#if defined(FEATURE_PTHREAD) && defined(_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
- *
- * Revision 1.3 2001/06/07 23:03:56 jongfoster
- * Added standard comment at top of file.
- *
*
*********************************************************************/
\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_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.1 2001/06/29 13:17:24 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
# +block
# Block this URL
#
-# +deanimate-gifs{last}
-# +deanimate-gifs{first}
-# Deanimate 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 propably 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).
-#
-# +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.
-
# 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.8 2001/06/29 13:21:46 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
- *
- * Revision 1.9 2001/06/29 21:45:41 oes
- * Indentation, CRLF->LF, Tab-> Space
- *
* Revision 1.8 2001/06/29 13:21:46 oes
* - Cosmetics: renamed and reordered functions, variables,
* texts, improved comments etc
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
-#include <assert.h>
#ifdef _WIN32
#define snprintf _snprintf
#include "project.h"
#include "cgi.h"
#include "list.h"
+#include "pcrs.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 == '?')
+ /* Get mem for response or fail*/
+ if (NULL == ( rsp = zalloc(sizeof(*rsp))))
{
- *query_args_start++ = '\0';
+ return NULL;
}
- if (NULL == (param_list = parse_cgi_parameters(query_args_start)))
+ /* Remove leading slash */
+ if (*argstring == '/')
{
- free(path_copy);
- return cgi_error_memory();
- }
-
-
- /*
- * 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()))
- {
- 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();
- }
+ char *p, *tmp = NULL;
+ struct map *exports = default_exports(csp, "");
- 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)
+ /* If there were other parameters, export a dump as "cgi-parameters" */
+ if(parameters)
{
- 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);
- }
+ 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 (err)
- {
- free_map(exports);
- free_http_response(rsp);
- return cgi_error_memory();
- }
-
- 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 : CGI function that returns a banner.
*
- * Description : Call at the start of the program to initialize
- * the error message used by cgi_error_memory().
+ * Parameters :
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ * 2 : rsp = http_response data structure for output
+ * 3 : parameters = map of cgi parameters
*
- * Parameters : N/A
+ * CGI Parameters :
+ * type : Selects the type of banner between "trans" and "jb".
+ * Defaults to "jb" if absent or != "trans".
*
- * Returns : N/A
+ * 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
*
- * Returns : JB_ERR_OK on success
- * JB_ERR_MEMORY on out-of-memory error.
+ * CGI Parameters :
+ * type : Selects the type of banner between "trans" and "jb".
+ * Defaults to "jb" if absent or != "trans".
+ *
+ * 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)
+ {
+ case 'p':
+ if (csp->actions_list)
+ {
+ filename = csp->actions_list->filename;
+ file_description = "Actions List";
+ }
+ break;
+
+#ifdef PCRS
+ case 'r':
+ if (csp->rlist)
+ {
+ filename = csp->rlist->filename;
+ file_description = "Regex Filter List";
+ }
+ break;
+#endif /* def PCRS */
+
+#ifdef TRUST_FILES
+ case 't':
+ if (csp->tlist)
+ {
+ filename = csp->tlist->filename;
+ file_description = "Trust List";
+ }
+ break;
+#endif /* def TRUST_FILES */
+ }
+
+ 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);
+
}
- strcpy(rsp->body, body_prefix);
- strcat(rsp->body, template_name);
- strcat(rsp->body, body_suffix);
- rsp->status = strdup(status);
- if (rsp->body == NULL)
+#endif /* def SPLIT_PROXY_ARGS */
+
+ exports = map(exports, "redirect-url", 1, REDIRECT_URL, 1);
+
+ s = NULL;
+ for (i=0; i < Argc; i++)
{
- return JB_ERR_MEMORY;
+ s = strsav(s, Argv[i]);
+ s = strsav(s, " ");
}
+ exports = map(exports, "invocation", 1, s, 0);
- return JB_ERR_OK;
-}
+ 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);
+ }
+
+#ifdef PCRS
+ 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);
+ }
+#else
+ exports = map_block_killer(exports, "pcrs-support");
+#endif /* ndef PCRS */
+
+#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);
+ }
+
+#ifdef PCRS
+ if (csp->rlist)
+ {
+ map(exports, "rlist", 1, csp->rlist->proxy_args , 1);
+ }
+#endif /* def PCRS */
+
+#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;
-
- assert(csp);
- assert(rsp);
+ struct map *exports = default_exports(csp, "show-url-info");
+ char *url_param, *host = NULL;
- 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);
}
- return template_fill_for_cgi(csp, "cgi-error-bad-param", exports, rsp);
+ rsp->body = fill_template(csp, "show-url-info", exports);
+ free_map(exports);
+ return 0;
+
}
/*********************************************************************
*
- * 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;
+ }
+
+ 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);
- /* 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
- );
+ 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;
+ 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));
-
-}
-
+
/*********************************************************************
*
*********************************************************************/
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)
- {
- 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)
+ if(NULL == (fp = fopen(buf, "r")))
{
- 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 in job */
+ if ( NULL == (job = (pcrs_make_job(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;
-}
-
-
-/*********************************************************************
- *
- * 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);
+ pcrs_free_joblist(joblist);
+ return(new);
- 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");
+ exports = map_block_killer(exports, "unstable");
}
- if (csp->config->admin_address != NULL)
+ if(csp->config->proxy_info_url != NULL)
{
- if (!err) err = map(exports, "admin-address", 1, html_encode(csp->config->admin_address), 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-adminaddr-info");
- }
+ exports = map_block_killer(exports, "have-proxy-info");
+ }
- 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;
- }
- else
- {
- if (!err) err = 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.15 2001/06/29 13:23: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 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 deanimation
-# debug 512 # CLF = Common Log Format
-# debug 1024 # = debug kill popups
+# debug 128 # RED = debug fast redirects
+# debug 256 # CLF = Common Log Format
# 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,
+# If you want to use CLF, you should set "debug 256" ONLY,
# do not enable anything else.
#
# Multiple "debug" directives, are OK - they're logical-OR'd
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 localhost.localdomain . # Loopback address
# forward www.ukc.mirror.ac.uk . # Specific host
#
-#
-# Note: If you intend to chain Privoxy and squid locally, the chain
-# broswer -> squid -> Privoxy is the recommended way.
-#
-# Your squid configuration could then look like this:
-#
-# # Define Privoxy as parent cache
-# cache_peer 127.0.0.1 8118 parent 0 no-query
-#
-# # Define ACL for protocol FTP
-# acl FTP proto FTP
-#
-# # Do not forward ACL FTP to Privoxy
-# always_direct allow FTP
-#
-# # Do not forward ACL CONNECT (https) to Privoxy
-# always_direct allow CONNECT
-#
-# # Forward the rest to Privoxy
-# never_direct allow all
-#
+
#############################################################################
# 5. WINDOWS GUI OPTIONS
#############################################################################
#
-# Privoxy has a number of options specific to the Windows GUI
+# Junkbuster has a number of options specific to the Windows GUI
# interface:
#
# activity-animation {1 or 0}
#
-# If set to 1, the Privoxy icon will animate when Privoxy is
+# If set to 1, the Junkbuster icon will animate when Junkbuster is
# active.
#
#Win32-only: activity-animation 1
# log-messages {1 or 0}
#
-# If set to 1, Privoxy will log messages to the console window.
+# If set to 1, Junkbuster will log messages to the console window.
#
#Win32-only: log-messages 1
# 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/config.h.in,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: config.h.in,v $
+ * Revision 1.3 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 this is
+ * not defined then you can ony use prefix matching.
+ */
+#undef REGEX
+
+/*
+ * 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
+
+/*
+ * Enables arbitrary content modification regexps
+ */
+#undef PCRS
+
+/*
+ * 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 PCRE rather than GNU Regex
+ */
+#undef PCRE
+
+/* 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
+
+#endif /* _CONFIG_H */
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
+/* config.h.win - Microsoft Visual C++ version of config.h */
+#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.1 2001/06/01 17:56:07 jongfoster
+ * Removing generated files config.h and pcre/chartables.c
+ * Now use a custom build step to copy config.h.win to config.h
+ * New VC++ project pcre/vc_dftables.dsp will generate pcre/chartables.c
+ * Also adding the new files list.[ch], actions.[ch] to the console build.
*
- * Revision 1.17 2002/03/24 13:33:26 swa
- * name change related issues
- *
- * Revision 1.16 2002/03/16 14:27:22 jongfoster
- * Ignoring a very common warning.
- *
- * Revision 1.15 2002/03/13 00:28:32 jongfoster
- * Hiding all the warnings generated by #include<windows.h>
- *
- * Revision 1.14 2001/11/30 21:35:54 jongfoster
- * Bumping version number to 2.9.10
- *
- * Revision 1.13 2001/10/23 21:24:09 jongfoster
- * Support for FEATURE_CGI_EDIT_ACTIONS
- *
- * Revision 1.12 2001/10/07 15:33:14 oes
- * Removed FEATURE_DENY_GZIP
- * Bumped up version number
- *
- * Revision 1.11 2001/09/16 16:59:34 jongfoster
- * Bugfix - couldn't build resources with previous version.
- *
- * Revision 1.10 2001/09/16 16:19:02 jongfoster
- * New version based on latest configure.in and acconfig.h
- *
- * Revision 1.9 2001/07/30 22:16:07 jongfoster
- * Tidying up #defines:
- * - All feature #defines are now of the form FEATURE_xxx
- * - Permanently turned off WIN_GUI_EDIT
- * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- * Revision 1.8 2001/07/25 19:16:27 oes
- * Bumping version number to 2.9.8
- *
- * Revision 1.7 2001/07/21 18:00:07 jongfoster
- * Bumping version number to 2.9.7
- *
- * Revision 1.6 2001/07/15 20:08:40 jongfoster
- * New build files for VC++ which provide the option of POSIX
- * or Win32 threads.
- *
- * Revision 1.5 2001/07/15 18:00:46 jongfoster
- * Renaming STATIC to STATIC_PCRE.
- * Replacing this file with one built by "configure" from
- * "config.h.in", for consistency.
- *
- * 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
- * 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
+ * Revision 1.6 2001/05/29 09:50:24 jongfoster
* Unified blocklist/imagelist/permissionslist.
* File format is still under discussion, but the internal changes
* are (mostly) done.
* 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
+ * 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/25 22:17:28 jongfoster
+ * Resurrecting these files which are required for the MS Visual C++
+ * build only.
+ *
+ * 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:49 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. */
+#define STDC_HEADERS 1
+
/*
* Version number - Major (X._._)
*/
/*
* Version number - Point (_._.X)
*/
-#define VERSION_POINT 13
+#define VERSION_POINT 4
/*
* Version number, as a string
*/
-#define VERSION "2.9.13"
+#define VERSION "2.9.4"
/*
* 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.
+ * Regular expression matching for URLs. (Highly recommended). If this is
+ * not defined then you can ony use prefix matching.
*/
-/* #define REGEX_GNU 1 */
-#define REGEX_PCRE 1
+#define REGEX 1
-/*
- * 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.
+/*
+ * 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 STATIC_PCRE 1
+#define TOGGLE 1
-/*
- * 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.
+/*
+ * Enables arbitrary content modification regexps
*/
-#define STATIC_PCRS 1
+#define PCRS 1
/*
- * Allows the use of an ACL to control access to the proxy by IP address.
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps. This forces it to be
+ * uncompressed.
*/
-#define FEATURE_ACL 1
+#define DENY_GZIP 1
/*
- * Enables the web-based configuration (actionsfile) editor. If you
- * have a shared proxy, you might want to turn this off.
+ * Enables statistics function.
*/
-#define FEATURE_CGI_EDIT_ACTIONS 1
+#define STATISTICS 1
/*
- * Allows the use of jar files to capture cookies.
+ * Bypass filtering for 1 page only
*/
-#define FEATURE_COOKIE_JAR 1
+#define FORCE_LOAD 1
/*
* Locally redirect remote script-redirect URLs
*/
-#define FEATURE_FAST_REDIRECTS 1
+#define FAST_REDIRECTS 1
/*
- * Bypass filtering for 1 page only
+ * Split the show-proxy-args page into a page for each config file.
*/
-#define FEATURE_FORCE_LOAD 1
+#define SPLIT_PROXY_ARGS 1
/*
- * Allow blocking using images as well as HTML.
- * If you do not define this then everything is blocked as HTML.
- *
- * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE.
+ * Kills JavaScript popups - window.open, onunload, etc.
*/
-#define FEATURE_IMAGE_BLOCKING 1
+#define KILLPOPUPS 1
+
+/*
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
+ */
+#define WEBDAV 1
/*
* Detect image requests automatically for MSIE. Will fall back to
* other image-detection methods (i.e. "+image" permission) for other
* browsers.
*
- * You must also define FEATURE_IMAGE_BLOCKING to use this feature.
+ * You must also define IMAGE_BLOCKING to use this feature.
*
* It detects the following header pair as an image request:
*
* These limitations are due to IE making inconsistent choices
* about which "Accept:" header to send.
*/
-#define FEATURE_IMAGE_DETECT_MSIE 1
+#define DETECT_MSIE_IMAGES 1
/*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#define FEATURE_KILL_POPUPS 1
-
-/*
- * Use POSIX threads instead of native threads.
- */
-#define FEATURE_PTHREAD 1
-
-/*
- * Enables statistics function.
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
*/
-#define FEATURE_STATISTICS 1
+#define IMAGE_BLOCKING 1
/*
- * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
- * non-anonymizing proxy. This is useful if you're trying to access a
- * blocked or broken site - just change the setting in the config file,
- * or use the handy "Disable" menu option in the Windows GUI.
+ * Allows the use of ACL files to control access to the proxy by IP address.
*/
-#define FEATURE_TOGGLE 1
+#define ACL_FILES 1
/*
* Allows the use of trust files.
*/
-#define FEATURE_TRUST 1
-
-
-/****************************************************************************
- * The following values are correct for MS VC++97.
- * You should normally not change them.
- ***************************************************************************/
-
-
-/*
- * Defined on Solaris only. Makes the system libraries thread safe.
- */
-/* #define _REENTRANT 1 */
+#define TRUST_FILES 1
/*
- * Defined on Solaris only. Without this, many important functions are not
- * defined in the system headers.
+ * Allows the use of jar files to capture cookies.
*/
-/* #define __EXTENSIONS__ 1 */
+#define JAR_FILES 1
/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
+ * Use PCRE rather than GNU Regex
*/
-#define __MT__ 1
-
+#define PCRE 1
-/* Define if you have the `bcopy' function. */
-/* #define HAVE_BCOPY 1 */
+/* Define if you have the bcopy function. */
+#define HAVE_BCOPY 1
-/* Define if you have the <inttypes.h> header file. */
-/* #define HAVE_INTTYPES_H 1 */
-
-/* Define if you have the `memmove' function. */
+/* Define if you have the memmove function. */
#define HAVE_MEMMOVE 1
-/* Define if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define if you have the <stdint.h> header file. */
-/* #define HAVE_STDINT_H 1 */
-
-/* Define if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define if you have the `strerror' function. */
+/* Define if you have the strerror function. */
#define HAVE_STRERROR 1
-/* Define if you have the <strings.h> header file. */
-/* #define HAVE_STRINGS_H 1 */
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if you have the <unistd.h> header file. */
-/* #define HAVE_UNISTD_H 1 */
-
-/* The size of a `char *', as computed by sizeof. */
-#define SIZEOF_CHAR_P 4
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* The size of a `long long', as computed by sizeof. */
-/* #define SIZEOF_LONG_LONG ---not supported--- */
-
-/* The size of a `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #define const */
-
-/* Define to `unsigned' if <sys/types.h> does not define. */
-/* #define size_t unsigned */
-
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with ANSI Standard C?)
- */
-/* Don't define for MS VC++ or you don't get strdup() declared.
-#ifndef __STDC__
-#define __STDC__ 1
-#endif
-*/
-
-/*
- * Need to set up this define only for the Pthreads library for
- * Win32, available from http://sources.redhat.com/pthreads-win32/
- */
-#if defined(FEATURE_PTHREAD) && defined(_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
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
-/*********************************************************************
- *
- * File : $Source: /cvsroot/ijbswa/current/config.h.win32threads.win,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
- * 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: config.h.win32threads.win,v $
- * Revision 1.13 2002/03/24 17:08:12 jongfoster
- * Version number bump
- *
- * Revision 1.12 2002/03/24 13:25:43 swa
- * name change related issues
- *
- * Revision 1.11 2002/03/16 14:27:22 jongfoster
- * Ignoring a very common warning.
- *
- * Revision 1.10 2002/03/13 00:28:32 jongfoster
- * Hiding all the warnings generated by #include<windows.h>
- *
- * Revision 1.9 2001/11/30 21:35:54 jongfoster
- * Bumping version number to 2.9.10
- *
- * Revision 1.8 2001/10/23 21:24:09 jongfoster
- * Support for FEATURE_CGI_EDIT_ACTIONS
- *
- * Revision 1.7 2001/10/07 15:33:14 oes
- * Removed FEATURE_DENY_GZIP
- * Bumped up version number
- *
- * Revision 1.6 2001/09/16 16:59:34 jongfoster
- * Bugfix - couldn't build resources with previous version.
- *
- * Revision 1.5 2001/09/16 16:19:02 jongfoster
- * New version based on latest configure.in and acconfig.h
- *
- * Revision 1.9 2001/07/30 22:16:07 jongfoster
- * Tidying up #defines:
- * - All feature #defines are now of the form FEATURE_xxx
- * - Permanently turned off WIN_GUI_EDIT
- * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- * Revision 1.8 2001/07/25 19:16:27 oes
- * Bumping version number to 2.9.8
- *
- * Revision 1.7 2001/07/21 18:00:07 jongfoster
- * Bumping version number to 2.9.7
- *
- * Revision 1.6 2001/07/15 20:08:40 jongfoster
- * New build files for VC++ which provide the option of POSIX
- * or Win32 threads.
- *
- * Revision 1.5 2001/07/15 18:00:46 jongfoster
- * Renaming STATIC to STATIC_PCRE.
- * Replacing this file with one built by "configure" from
- * "config.h.in", for consistency.
- *
- * 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
- * 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
-
-/*
- * Version number - Major (X._._)
- */
-#define VERSION_MAJOR 2
-
-/*
- * Version number - Minor (_.X._)
- */
-#define VERSION_MINOR 9
-
-/*
- * Version number - Point (_._.X)
- */
-#define VERSION_POINT 13
-
-/*
- * Version number, as a string
- */
-#define VERSION "2.9.13"
-
-/*
- * Status of the code: alpha, beta or stable
- */
-#define CODE_STATUS "beta"
-
-/*
- * 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 */
-#define REGEX_PCRE 1
-
-/*
- * 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.
- */
-#define STATIC_PCRE 1
-
-/*
- * 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.
- */
-#define STATIC_PCRS 1
-
-/*
- * Allows the use of an ACL to control access to the proxy by IP address.
- */
-#define FEATURE_ACL 1
-
-/*
- * Enables the web-based configuration (actionsfile) editor. If you
- * have a shared proxy, you might want to turn this off.
- */
-#define FEATURE_CGI_EDIT_ACTIONS 1
-
-/*
- * Allows the use of jar files to capture cookies.
- */
-#define FEATURE_COOKIE_JAR 1
-
-/*
- * Locally redirect remote script-redirect URLs
- */
-#define FEATURE_FAST_REDIRECTS 1
-
-/*
- * Bypass filtering for 1 page only
- */
-#define FEATURE_FORCE_LOAD 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.
- */
-#define FEATURE_IMAGE_BLOCKING 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.
- *
- * 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.
- */
-#define FEATURE_IMAGE_DETECT_MSIE 1
-
-/*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#define FEATURE_KILL_POPUPS 1
-
-/*
- * Use POSIX threads instead of native threads.
- */
-/* #define FEATURE_PTHREAD 1 */
-
-/*
- * Enables statistics function.
- */
-#define FEATURE_STATISTICS 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.
- */
-#define FEATURE_TOGGLE 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 */
-
-/*
- * Defined on Solaris only. Without this, many important functions are not
- * defined in the system headers.
- */
-/* #define __EXTENSIONS__ 1 */
-
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
- */
-#define __MT__ 1
-
-
-/* Define if you have the `bcopy' function. */
-/* #define HAVE_BCOPY 1 */
-
-/* Define if you have the <inttypes.h> header file. */
-/* #define HAVE_INTTYPES_H 1 */
-
-/* Define if you have the `memmove' function. */
-#define 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 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/
- */
-#if defined(FEATURE_PTHREAD) && defined(_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 */
-
+++ /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:
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
- --disable-shared build PCRE as a static library"
+ --enable-mingw32 Use mingw32 for a Windows GUI"
ac_help="$ac_help
- --enable-utf8 enable UTF8 support (incomplete)"
+ --disable-regex Don't allow regular expressions in the blockfile"
+ac_help="$ac_help
+ --disable-pcre-regex Use old, slow GNU Regex instead of PCRE."
+ac_help="$ac_help
+ --disable-toggle Don't support temporary disable"
+ac_help="$ac_help
+ --disable-pcrs Don't support arbitrary content modification"
+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
+ --disable-static-pcre Link dynamically with the pcre and pcreposix
+ libraries. You must build the libraries seperately."
# Initialize some variables set by options.
# The variables have the same names as the options, with
-help | --help | --hel | --he)
# Omit some internal or obsolete options to make the list less imposing.
- # The list generated by autoconf has been trimmed to remove many
- # options that are totally irrelevant to PCRE (e.g. relating to X),
- # or are not supported by its Makefile.
- # The list generated by autoconf has been trimmed to remove many
- # options that are totally irrelevant to PCRE (e.g. relating to X),
- # or are not supported by its Makefile.
- # The list generated by autoconf has been trimmed to remove many
- # options that are totally irrelevant to PCRE (e.g. relating to X),
- # or are not supported by its Makefile.
# This message is too long to be a string in the A/UX 3.1 sh.
cat << EOF
-Usage: ./configure [options]
+Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
--cache-file=FILE cache test results in FILE
--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"
| --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
# 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=dftables.c
+ac_unique_file=jcc.c
# Find the source files, if location was not specified.
if test -z "$srcdir"; 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=' '
+' ac_t=' '
else
ac_n=-n ac_c= ac_t=
fi
+VERSION_MAJOR=2
+VERSION_MINOR=9
+VERSION_POINT=4
+
-PCRE_MAJOR=3
-PCRE_MINOR=4
-PCRE_DATE=22-Aug-2000
-PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
-PCRE_LIB_VERSION=0:1:0
-PCRE_POSIXLIB_VERSION=0:0:0
+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:546: checking for $ac_word" >&5
+echo "configure:599: 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=":"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
# 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:576: checking for $ac_word" >&5
+echo "configure:629: 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=":"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
ac_prog_rejected=no
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
if test -f $ac_dir/$ac_word; then
if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
- continue
+ continue
fi
ac_cv_prog_CC="cc"
break
# 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:627: checking for $ac_word" >&5
+echo "configure:680: 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=":"
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
ac_dummy="$PATH"
for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:659: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:712: 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.
cat > conftest.$ac_ext << EOF
-#line 670 "configure"
+#line 723 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
-if { (eval echo configure:675: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:728: \"$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
{ 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:701: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:754: 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:706: checking whether we are using GNU C" >&5
+echo "configure:759: 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
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:715: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:768: \"$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
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:734: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:787: 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
fi
fi
-# Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:768: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # 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_RANLIB="ranlib"
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
- echo "$ac_t""$RANLIB" 1>&6
-else
- echo "$ac_t""no" 1>&6
-fi
-
-
-
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:798: checking how to run the C preprocessor" >&5
+echo "configure:819: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 813 "configure"
+#line 834 "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:819: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:840: \"$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*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 830 "configure"
+#line 851 "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:836: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:857: \"$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*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 847 "configure"
+#line 868 "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:853: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:874: \"$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
:
fi
echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:900: 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 905 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:912: \"$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:929: 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 934 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:945: \"$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:964: 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:974: \"$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:995: 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:1001: \"$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 ANSI C header files""... $ac_c" 1>&6
-echo "configure:878: checking for ANSI C header files" >&5
+echo "configure:1021: 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 883 "configure"
+#line 1026 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:891: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1034: \"$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*
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 908 "configure"
+#line 1051 "configure"
#include "confdefs.h"
#include <string.h>
EOF
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 926 "configure"
+#line 1069 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
:
else
cat > conftest.$ac_ext <<EOF
-#line 947 "configure"
+#line 1090 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
exit (0); }
EOF
-if { (eval echo configure:958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
fi
-for ac_hdr in limits.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:985: checking for $ac_hdr" >&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 990 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:995: \"$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
- ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-
-
echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1024: checking for working const" >&5
+echo "configure:1126: 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 1029 "configure"
+#line 1131 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:1078: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1180: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_const=yes
else
fi
echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1099: checking for size_t" >&5
+echo "configure:1201: 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 1104 "configure"
+#line 1206 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
fi
-
-for ac_func in bcopy memmove strerror
+for ac_func in strerror bcopy memmove
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1136: checking for $ac_func" >&5
+echo "configure:1237: 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 1141 "configure"
+#line 1242 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:1164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1265: \"$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
-LIBTOOL=./libtool
-LIBSUFFIX=la
-# Check whether --enable-shared or --disable-shared was given.
-if test "${enable_shared+set}" = set; then
- enableval="$enable_shared"
- if test "$enableval" = "no"; then
- LIBTOOL=
- LIBSUFFIX=a
+# 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"
+ echo "Using mingw32 (Win32 GUI)"
+ else
+ WIN_ONLY=#
+ if test "$CYGWIN" = "yes"; then
+ CYGWIN_FLAGS="-mno-win32"
+ echo "Using Cygnus (Win32 command line)"
+ else
+ CYGWIN_FLAGS=
+ fi
+ fi
+else
+ if test "$MINGW32" = "yes"; then
+ WIN_ONLY=
+ CYGWIN_FLAGS="-mwindows -mno-cygwin"
+ echo "Using mingw32 (Win32 GUI)"
+ else
+ WIN_ONLY=#
+ if test "$CYGWIN" = "yes"; then
+ CYGWIN_FLAGS="-mno-win32"
+ echo "Using Cygnus (Win32 command line)"
+ else
+ CYGWIN_FLAGS=
+ fi
+ fi
fi
+
+
+
+
+SOLARIS_ONLY=#
+
+
+
+
+GNU_REGEX_ONLY=
+PCRE_REGEX_ONLY=
+NO_REGEX_ONLY=#
+
+# Check whether --enable-regex or --disable-regex was given.
+if test "${enable_regex+set}" = set; then
+ enableval="$enable_regex"
+ if test $enableval = yes; then
+ cat >> confdefs.h <<\EOF
+#define REGEX 1
+EOF
+
+else
+ NO_REGEX_ONLY=
+ GNU_REGEX_ONLY=#
+ PCRE_REGEX_ONLY=#
fi
+else
+ cat >> confdefs.h <<\EOF
+#define REGEX 1
+EOF
+
+fi
+
+
+# Check whether --enable-pcre-regex or --disable-pcre-regex was given.
+if test "${enable_pcre_regex+set}" = set; then
+ enableval="$enable_pcre_regex"
+ if test $enableval = yes; then
+ cat >> confdefs.h <<\EOF
+#define PCRE 1
+EOF
+
+ GNU_REGEX_ONLY=#
+else
+ PCRE_REGEX_ONLY=#
+fi
+else
+ cat >> confdefs.h <<\EOF
+#define PCRE 1
+EOF
+
+ GNU_REGEX_ONLY=#
+
+fi
+
+
+
+
+
+
+
+
+# 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
+
+
+PCRS_ONLY=
+# Check whether --enable-pcrs or --disable-pcrs was given.
+if test "${enable_pcrs+set}" = set; then
+ enableval="$enable_pcrs"
+ if test $enableval = yes; then
+ cat >> confdefs.h <<\EOF
+#define PCRS 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define DENY_GZIP 1
+EOF
+
+else
+ PCRS_ONLY=#
+fi
+else
+ cat >> confdefs.h <<\EOF
+#define PCRS 1
+EOF
+ cat >> confdefs.h <<\EOF
+#define DENY_GZIP 1
+EOF
+
+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
-# Check whether --enable-utf8 or --disable-utf8 was given.
-if test "${enable_utf8+set}" = set; then
- enableval="$enable_utf8"
- if test "$enableval" = "yes"; then
- UTF8=-DSUPPORT_UTF8
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
+LIBRARY_PCRE_ONLY=#
+STATIC_PCRE_ONLY=
+# Check whether --enable-static-pcre or --disable-static-pcre was given.
+if test "${enable_static_pcre+set}" = set; then
+ enableval="$enable_static_pcre"
+ if test $enableval = no; then
+ LIBRARY_PCRE_ONLY=
+ STATIC_PCRE_ONLY=#
+fi
+fi
# 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'
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
fi
trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
ac_given_srcdir=$srcdir
-trap 'rm -fr `echo "Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF
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%@RANLIB@%$RANLIB%g
s%@CPP@%$CPP%g
-s%@HAVE_MEMMOVE@%$HAVE_MEMMOVE%g
-s%@HAVE_STRERROR@%$HAVE_STRERROR%g
-s%@LIBTOOL@%$LIBTOOL%g
-s%@LIBSUFFIX@%$LIBSUFFIX%g
-s%@UTF8@%$UTF8%g
-s%@PCRE_MAJOR@%$PCRE_MAJOR%g
-s%@PCRE_MINOR@%$PCRE_MINOR%g
-s%@PCRE_DATE@%$PCRE_DATE%g
-s%@PCRE_VERSION@%$PCRE_VERSION%g
-s%@PCRE_LIB_VERSION@%$PCRE_LIB_VERSION%g
-s%@PCRE_POSIXLIB_VERSION@%$PCRE_POSIXLIB_VERSION%g
+s%@EXEEXT@%$EXEEXT%g
+s%@OBJEXT@%$OBJEXT%g
+s%@WIN_ONLY@%$WIN_ONLY%g
+s%@CYGWIN_FLAGS@%$CYGWIN_FLAGS%g
+s%@SOLARIS_ONLY@%$SOLARIS_ONLY%g
+s%@GNU_REGEX_ONLY@%$GNU_REGEX_ONLY%g
+s%@PCRE_REGEX_ONLY@%$PCRE_REGEX_ONLY%g
+s%@NO_REGEX_ONLY@%$NO_REGEX_ONLY%g
+s%@PCRS_ONLY@%$PCRS_ONLY%g
+s%@LIBRARY_PCRE_ONLY@%$LIBRARY_PCRE_ONLY%g
+s%@STATIC_PCRE_ONLY@%$STATIC_PCRE_ONLY%g
CEOF
EOF
cat >> $CONFIG_STATUS <<EOF
-CONFIG_FILES=\${CONFIG_FILES-"Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in"}
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
# 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_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_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_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:config.in"
+ CONFIG_HEADERS="config.h"
EOF
cat >> $CONFIG_STATUS <<\EOF
fi
# 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]*%/* & */%
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
EOF
# Break up conftest.vals because some shells have a limit on
EOF
cat >> $CONFIG_STATUS <<\EOF
-chmod a+x RunTest pcre-config
+
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.4 2001/05/29 09:50:24 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 Revision 1.10 2001/07/18 17:25:04 oes
-dnl Fixed a typo
-dnl
-dnl Revision 1.9 2001/07/15 19:45:13 jongfoster
-dnl Added support for linking with POSIX threads library
-dnl
-dnl Revision 1.8 2001/07/15 17:54:29 jongfoster
-dnl Renaming #define STATIC to STATIC_PCRE
-dnl Adding new #define FEATURE_PTHREAD that will be used to enable
-dnl POSIX threads support.
-dnl
-dnl Revision 1.7 2001/07/13 13:58:05 oes
-dnl Completely reorganized the selection scheme for
-dnl pcre, pcreposix, pcrs and gnu_regex:
-dnl
-dnl The presence of shared pcre, pcreposix or pcrs
-dnl libraried is now autodetected. Additionally, the
-dnl user can enforce using the built-in static variants
-dnl by specifying --disable-dynamic-(pcre|pcrs).
-dnl Care is taken to avoid that pcre is dyn, while pcreposix
-dnl is static, if both are used and that pcrs is static if
-dnl pcrs is.
-dnl
-dnl The choice between pcre, gnu or no regex for actionsfile
-dnl URL matching is now via
-dnl --(enable|disable)-regex-matching[=(gnu|pcre|no)] with the
-dnl default being pcre.
-dnl
-dnl Revision 1.6 2001/06/29 21:56:40 oes
-dnl Version -> 2.9.5
-dnl
-dnl Revision 1.5 2001/06/29 13:26:27 oes
-dnl Introduced #define CODE_STATUS
-dnl
dnl Revision 1.4 2001/05/29 09:50:24 jongfoster
dnl Unified blocklist/imagelist/permissionslist.
dnl File format is still under discussion, but the internal changes
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=4
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
-
-
-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 =================================================================
-
AC_MINGW32
AC_CYGWIN
-
-if test "$MINGW32" = "yes"; then
- target_type=mingw
-else
- if test "$CYGWIN" = "yes"; then
- target_type=cygwin
- else
- target_type=unix
- fi
-fi
-
-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 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)"
- 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"
-
-# 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'
-
-
-dnl =================================================================
-dnl Thread support
-dnl =================================================================
-
-AC_CHECK_HEADER(pthread.h, [have_pthread=yes], [have_pthread=no])
-
-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
- 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)
-])
-
-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 libraries.
+dnl AC_CHECK_LIB(pcre, pcre_compile)
+dnl AC_CHECK_LIB(pcreposix, regcomp, pcre)
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)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
dnl Checks for library functions.
dnl AC_TYPE_SIGNAL
dnl bcopy and memmove are for PCRE
AC_CHECK_FUNCS(strerror bcopy memmove)
+dnl Build type
-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])
-
+AC_ARG_ENABLE(mingw32,
+[ --enable-mingw32 Use mingw32 for a Windows GUI],
+[if test $enableval = yes; then
+ WIN_ONLY=
+ CYGWIN_FLAGS="-mwindows -mno-cygwin"
+ echo "Using mingw32 (Win32 GUI)"
+ else
+ WIN_ONLY=#
+ if test "$CYGWIN" = "yes"; then
+ CYGWIN_FLAGS="-mno-win32"
+ echo "Using Cygnus (Win32 command line)"
+ else
+ CYGWIN_FLAGS=
+ fi
+ fi],
+[if test "$MINGW32" = "yes"; then
+ WIN_ONLY=
+ CYGWIN_FLAGS="-mwindows -mno-cygwin"
+ echo "Using mingw32 (Win32 GUI)"
+ else
+ WIN_ONLY=#
+ if test "$CYGWIN" = "yes"; then
+ CYGWIN_FLAGS="-mno-win32"
+ echo "Using Cygnus (Win32 command line)"
+ else
+ CYGWIN_FLAGS=
+ fi
+ fi])
-dnl =================================================================
-dnl Always defined
-dnl =================================================================
+AC_SUBST(WIN_ONLY)
+AC_SUBST(CYGWIN_FLAGS)
-AC_DEFINE(__MT__)
+SOLARIS_ONLY=#
+AC_SUBST(SOLARIS_ONLY)
-dnl =================================================================
dnl Features
-dnl =================================================================
+
+dnl Regex engine:
+
+GNU_REGEX_ONLY=
+PCRE_REGEX_ONLY=
+NO_REGEX_ONLY=#
+
+AC_ARG_ENABLE(regex,
+[ --disable-regex Don't allow regular expressions in the blockfile],
+[if test $enableval = yes; then
+ AC_DEFINE(REGEX)
+else
+ NO_REGEX_ONLY=
+ GNU_REGEX_ONLY=#
+ PCRE_REGEX_ONLY=#
+fi],AC_DEFINE(REGEX))
+
+AC_ARG_ENABLE(pcre-regex,
+[ --disable-pcre-regex Use old, slow GNU Regex instead of PCRE.],
+[if test $enableval = yes; then
+ AC_DEFINE(PCRE)
+ GNU_REGEX_ONLY=#
+else
+ PCRE_REGEX_ONLY=#
+fi],[AC_DEFINE(PCRE)
+ GNU_REGEX_ONLY=#
+])
+
+AC_SUBST(GNU_REGEX_ONLY)
+AC_SUBST(PCRE_REGEX_ONLY)
+AC_SUBST(NO_REGEX_ONLY)
+
+
+dnl Other features:
AC_ARG_ENABLE(toggle,
-[ --disable-toggle Don't support temporary disable],
+[ --disable-toggle Don't support temporary disable],
[if test $enableval = yes; then
- AC_DEFINE(FEATURE_TOGGLE)
-fi],AC_DEFINE(FEATURE_TOGGLE))
+ AC_DEFINE(TOGGLE)
+fi],AC_DEFINE(TOGGLE))
+
+PCRS_ONLY=
+AC_ARG_ENABLE(pcrs,
+[ --disable-pcrs Don't support arbitrary content modification],
+[if test $enableval = yes; then
+ AC_DEFINE(PCRS)
+ AC_DEFINE(DENY_GZIP)
+else
+ PCRS_ONLY=#
+fi],[AC_DEFINE(PCRS) AC_DEFINE(DENY_GZIP)])
+AC_SUBST(PCRS_ONLY)
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(FEATURE_STATISTICS)
-fi],AC_DEFINE(FEATURE_STATISTICS))
+ 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(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.],
+[ --disable-jar-files Prevents the use of jar files to capture cookies.],
[if test $enableval = yes; then
- AC_DEFINE(FEATURE_COOKIE_JAR)
+ AC_DEFINE(JAR_FILES)
fi],
-AC_DEFINE(FEATURE_COOKIE_JAR))
+AC_DEFINE(JAR_FILES))
-AC_ARG_ENABLE(editor,
-[ --disable-editor Prevents the use of the web-based actions file
- editor and web-based temporary disable setting.],
-[if test $enableval = yes; then
- AC_DEFINE(FEATURE_CGI_EDIT_ACTIONS)
-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])
-
-
-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)],
-[ 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],
-[ 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],
-[ if test $enableval = "no"; then have_pcrs=no; 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
+LIBRARY_PCRE_ONLY=#
+STATIC_PCRE_ONLY=
+AC_ARG_ENABLE(static-pcre,
+[ --disable-static-pcre Link dynamically with the pcre and pcreposix
+ libraries. You must build the libraries seperately.],
+[if test $enableval = no; then
+ LIBRARY_PCRE_ONLY=
STATIC_PCRE_ONLY=#
- LIBS="$LIBS -lpcre"
-else
- echo "using built-in static pcre"
- pcre_dyn=no
- AC_DEFINE(STATIC_PCRE)
- 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"
- AC_DEFINE(STATIC_PCRS)
- 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"
- AC_DEFINE(REGEX_GNU)
- GNU_REGEX_ONLY=
- PCRE_REGEX_ONLY=#
-elif test $regex_matching = "pcre"; then
- echo "using pcre regex for URL matching"
- AC_DEFINE(REGEX_PCRE)
- 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
-
-AC_SUBST(GNU_REGEX_ONLY)
-AC_SUBST(PCRE_REGEX_ONLY)
+fi])
+AC_SUBST(LIBRARY_PCRE_ONLY)
AC_SUBST(STATIC_PCRE_ONLY)
-AC_SUBST(STATIC_PCRS_ONLY)
-
-dnl =================================================================
-dnl Final cleanup and output
-dnl =================================================================
-
-dnl Remove the SPECIAL_CFLAGS stuff from CFLAGS, and add it seperately
-dnl in the Makefile
-CFLAGS=$old_CFLAGS_nospecial
-AC_SUBST(SPECIAL_CFLAGS)
-AC_SUBST(PTHREAD_LIB)
+AC_OUTPUT(Makefile)
-AC_OUTPUT(GNUmakefile)
-# 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\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"\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
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_console - 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 Debug" (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 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: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
+# 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 /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 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: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
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "console_"\r
-# PROP BASE Intermediate_Dir "console_"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "console_debug_winthr"\r
-# PROP Intermediate_Dir "console_debug_winthr"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /FR /YX /FD /c\r
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /FR /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
-# ADD RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\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: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
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "console0"\r
-# PROP BASE Intermediate_Dir "console0"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "console_release_winthr"\r
-# PROP Intermediate_Dir "console_release_winthr"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /YX /FD /c\r
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\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: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 /nologo /subsystem:console /machine:I386\r
-\r
!ENDIF \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
# 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
\r
-SOURCE=.\deanimate.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\deanimate.h\r
-# End Source File\r
-# Begin Source File\r
-\r
SOURCE=.\errlog.c\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
# PROP Default_Filter ""\r
+# Begin Group "File Copy"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\config.h.win\r
+\r
+!IF "$(CFG)" == "console_junkbuster - Win32 Release"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+ copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF "$(CFG)" == "console_junkbuster - Win32 Debug"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+ copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
# Begin Source File\r
\r
SOURCE=.\cygwin.h\r
# Begin Source File\r
\r
SOURCE=.\pcre\chartables.c\r
-\r
-!IF "$(CFG)" == "vc_console - Win32 Release"\r
-\r
# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_console - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_console - 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
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ENDIF \r
-\r
# End Source File\r
# Begin Source File\r
\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 */
/*
+++ /dev/null
-const char deanimate_rcs[] = "$Id: deanimate.c,v 1.10 2002/03/24 13:25:43 swa Exp $";
-/*********************************************************************
- *
- * File : $Source: /cvsroot/ijbswa/current/deanimate.c,v $
- *
- * Purpose : Declares functions to deanimate GIF images on the fly.
- *
- * Functions declared include: gif_deanimate, buf_free,
- * buf_copy, buf_getbyte, gif_skip_data_block, and
- * gif_extract_image
- *
- * Copyright : Written by and Copyright (C) 2001 by the the SourceForge
- * Privoxy team. http://www.privoxy.org/
- *
- * Based on the GIF file format specification (see
- * http://tronche.com/computer-graphics/gif/gif89a.html)
- * and ideas from the Image::DeAnim Perl module by
- * Ken MacFarlane, <ksm+cpan@universal.dca.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: 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
- *
- * Revision 1.2 2001/07/13 13:46:20 oes
- * Introduced GIF deanimation feature
- *
- *
- **********************************************************************/
-\f
-
-#include "config.h"
-
-#include <string.h>
-#include <fcntl.h>
-
-#include "project.h"
-#include "deanimate.h"
-#include "miscutil.h"
-
-const char deanimate_h_rcs[] = DEANIMATE_H_VERSION;
-
-/*********************************************************************
- *
- * Function : buf_free
- *
- * Description : Safely frees a struct binbuffer
- *
- * Parameters :
- * 1 : buf = Pointer to the binbuffer to be freed
- *
- * Returns : N/A
- *
- *********************************************************************/
-void buf_free(struct binbuffer *buf)
-{
- if (buf == NULL) return;
-
- if (buf->buffer != NULL)
- {
- free(buf->buffer);
- }
-
- free(buf);
-
-}
-
-
-/*********************************************************************
- *
- * Function : buf_extend
- *
- * 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
- * have to realloc() too often.
- *
- * Parameters :
- * 1 : buf = Pointer to the binbuffer
- * 2 : length = Desired minimum size
- *
- *
- * Returns : 0 on success, 1 on failiure.
- *
- *********************************************************************/
-int buf_extend(struct binbuffer *buf, size_t length)
-{
- char *newbuf;
-
- if (buf->offset + length > buf->size)
- {
- buf->size = ((buf->size + length + (size_t)1023) & ~(size_t)1023);
- newbuf = (char *)realloc(buf->buffer, buf->size);
-
- if (newbuf == NULL)
- {
- freez(buf->buffer);
- return 1;
- }
- else
- {
- buf->buffer = newbuf;
- return 0;
- }
- }
- return 0;
-
-}
-
-
-/*********************************************************************
- *
- * Function : buf_copy
- *
- * Description : Safely copies a given amount of bytes from one
- * struct binbuffer to another, advancing the
- * offsets appropriately.
- *
- * Parameters :
- * 1 : src = Pointer to the source binbuffer
- * 2 : dst = Pointer to the destination binbuffer
- * 3 : length = Number of bytes to be copied
- *
- * Returns : 0 on success, 1 on failiure.
- *
- *********************************************************************/
-int buf_copy(struct binbuffer *src, struct binbuffer *dst, size_t length)
-{
-
- /*
- * Sanity check: Can't copy more data than we have
- */
- if (src->offset + length > src->size)
- {
- return 1;
- }
-
- /*
- * Ensure that dst can hold the new data
- */
- if (buf_extend(dst, length))
- {
- return 1;
- }
-
- /*
- * Now that it's safe, memcpy() the desired amount of
- * data from src to dst and adjust the offsets
- */
- memcpy(dst->buffer + dst->offset, src->buffer + src->offset, length);
- src->offset += length;
- dst->offset += length;
-
- return 0;
-
-}
-
-
-/*********************************************************************
- *
- * Function : buf_getbyte
- *
- * Description : Safely gets a byte from a given binbuffer at a
- * given offset
- *
- * Parameters :
- * 1 : buf = Pointer to the source binbuffer
- * 2 : offset = Offset to the desired byte
- *
- * Returns : The byte on success, or 0 on failiure
- *
- *********************************************************************/
-unsigned char buf_getbyte(struct binbuffer *src, size_t offset)
-{
- if (src->offset + offset < src->size)
- {
- return (unsigned char)*(src->buffer + src->offset + offset);
- }
- else
- {
- return '\0';
- }
-
-}
-
-
-/*********************************************************************
- *
- * Function : gif_skip_data_block
- *
- * Description : Safely advances the offset of a given struct binbuffer
- * that contains a GIF image and whose offset is
- * positioned at the start of a data block, behind
- * that block.
- *
- * Parameters :
- * 1 : buf = Pointer to the binbuffer
- *
- * Returns : 0 on success, or 1 on failiure
- *
- *********************************************************************/
-int gif_skip_data_block(struct binbuffer *buf)
-{
- unsigned char c;
-
- /*
- * Data blocks are sequences of chunks, which are headed
- * by a one-byte length field, with the last chunk having
- * zero length.
- */
- while((c = buf_getbyte(buf, 0)) != '\0')
- {
- if ((buf->offset += c + 1) >= buf->size - 1)
- {
- return 1;
- }
- }
- buf->offset++;
-
- return 0;
-
-}
-
-
-/*********************************************************************
- *
- * Function : gif_extract_image
- *
- * Description : Safely extracts an image data block from a given
- * struct binbuffer that contains a GIF image and whose
- * offset is positioned at the start of a data block
- * into a given destination binbuffer.
- *
- * Parameters :
- * 1 : src = Pointer to the source binbuffer
- * 2 : dst = Pointer to the destination binbuffer
- *
- * Returns : 0 on success, or 1 on failiure
- *
- *********************************************************************/
-int gif_extract_image(struct binbuffer *src, struct binbuffer *dst)
-{
- unsigned char c;
-
- /*
- * Remember the colormap flag and copy the image head
- */
- c = buf_getbyte(src, 9);
- if (buf_copy(src, dst, 10))
- {
- return 1;
- }
-
- /*
- * If the image has a local colormap, copy it.
- */
- if (c & 0x80)
- {
- if (buf_copy(src, dst, (size_t) 3 * (1 << ((c & 0x07) + 1))))
- {
- return 1;
- }
- }
- if (buf_copy(src, dst, 1)) return 1;
-
- /*
- * Copy the image chunk by chunk.
- */
- while((c = buf_getbyte(src, 0)) != '\0')
- {
- if (buf_copy(src, dst, 1 + (size_t) c)) return 1;
- }
- if (buf_copy(src, dst, 1)) return 1;
-
- /*
- * Trim and rewind the dst buffer
- */
- if (NULL == (dst->buffer = (char *)realloc(dst->buffer, dst->offset))) return 1;
- dst->size = dst->offset;
- dst->offset = 0;
-
- return(0);
-
-}
-
-/*********************************************************************
- *
- * Function : gif_deanimate
- *
- * Description : Deanimate a given GIF image, i.e. given a GIF with
- * an (optional) image block and an arbitrary number
- * of image extension blocks, produce an output GIF with
- * only one image block that contains the last image
- * (extenstion) block of the original.
- * Also strip Comments, Application extenstions, etc.
- *
- * Parameters :
- * 1 : src = Pointer to the source binbuffer
- * 2 : dst = Pointer to the destination binbuffer
- * 3 : get_first_image = Flag: If set, get the first image
- * If unset (default), get the last
- *
- * Returns : 0 on success, or 1 on failiure
- *
- *********************************************************************/
-int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_image)
-{
- unsigned char c;
- struct binbuffer *image;
-
- if (NULL == src || NULL == dst)
- {
- return 1;
- }
-
- c = buf_getbyte(src, 10);
-
- /*
- * Check & copy GIF header
- */
- if (strncmp(src->buffer, "GIF89a", 6) && strncmp(src->buffer, "GIF87a", 6))
- {
- return 1;
- }
- else
- {
- if (buf_copy(src, dst, 13))
- {
- return 1;
- }
- }
-
- /*
- * Look for global colormap and copy if found.
- */
- if(c & 0x80)
- {
- if (buf_copy(src, dst, (size_t) 3 * (1 << ((c & 0x07) + 1))))
- {
- return 1;
- }
- }
-
- /*
- * Reserve a buffer for the current image block
- */
- if (NULL == (image = (struct binbuffer *)zalloc(sizeof(*image))))
- {
- return 1;
- }
-
- /*
- * Parse the GIF block by block and copy the relevant
- * parts to dst
- */
- while(src->offset < src->size)
- {
- switch(buf_getbyte(src, 0))
- {
- /*
- * End-of-GIF Marker: Append current image and return
- */
- case 0x3b:
- goto write;
-
- /*
- * Image block: Extract to current image buffer.
- */
- case 0x2c:
- image->offset = 0;
- if (gif_extract_image(src, image)) goto failed;
- if (get_first_image) goto write;
- continue;
-
- /*
- * Extension block: Look at next byte and decide
- */
- case 0x21:
- switch (buf_getbyte(src, 1))
- {
- /*
- * Image extension: Copy extension header and image
- * to the current image buffer
- */
- case 0xf9:
- image->offset = 0;
- if (buf_copy(src, image, 8) || buf_getbyte(src, 0) != 0x2c) goto failed;
- if (gif_extract_image(src, image)) goto failed;
- if (get_first_image) goto write;
- continue;
-
- /*
- * Application extension: Skip
- */
- case 0xff:
- if ((src->offset += 14) >= src->size || gif_skip_data_block(src)) goto failed;
- continue;
-
- /*
- * Comment extension: Skip
- */
- case 0xfe:
- if ((src->offset += 2) >= src->size || gif_skip_data_block(src)) goto failed;
- continue;
-
- /*
- * Plain text extension: Skip
- */
- case 0x01:
- if ((src->offset += 15) >= src->size || gif_skip_data_block(src)) goto failed;
- continue;
-
- /*
- * Ooops, what type of extension is that?
- */
- default:
- goto failed;
-
- }
-
- /*
- * Ooops, what type of block is that?
- */
- default:
- goto failed;
-
- }
- } /* -END- while src */
-
- /*
- * Either we got here by goto, or because the GIF is
- * bogus and EOF was reached before an end-of-gif marker
- * was found.
- */
-
-failed:
- buf_free(image);
- return 1;
-
- /*
- * Append the current image to dst and return
- */
-
-write:
- if (buf_copy(image, dst, image->size)) goto failed;
- if (buf_extend(dst, 1)) goto failed;
- *(dst->buffer + dst->offset++) = 0x3b;
- buf_free(image);
- return 0;
-
-}
-
-
-/*
- Local Variables:
- tab-width: 3
- end:
-*/
+++ /dev/null
-#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 $"
-/*********************************************************************
- *
- * File : $Source: /cvsroot/ijbswa/current/deanimate.h,v $
- *
- * Purpose : Declares functions to deanimate GIF images on the fly.
- *
- * Functions declared include: gif_deanimate, buf_free
- *
- *
- * Copyright : Written by and Copyright (C) 2001 Andreas S. Oesterhelt
- * for the Privoxy team. http://www.privoxy.org/
- *
- * Based on ideas from the Image::DeAnim Perl module by
- * Ken MacFarlane, <ksm+cpan@universal.dca.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: 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;
-};
-
-/*
- * Function prototypes
- */
-extern int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_image);
-extern void buf_free(struct binbuffer *buf);
-
-/*
- * Revision control strings from this header and associated .c file
- */
-extern const char deanimate_rcs[];
-extern const char deanimate_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef DEANIMATE_H_INCLUDED */
-
-/*
- Local Variables:
- tab-width: 3
- end:
-*/
+++ /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
+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.11 2001/06/01 18:14:49 jongfoster 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
- *
- * Revision 1.12 2001/06/09 10:55:28 jongfoster
- * Changing BUFSIZ ==> BUFFER_SIZE
- *
* Revision 1.11 2001/06/01 18:14:49 jongfoster
* Changing the calls to strerr() to check HAVE_STRERR (which is defined
* in config.h if appropriate) rather than the NO_STRERR macro.
\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;
+#ifdef PCRS
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
+#endif /* def PCRS */
+#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);
- break;
-#endif /* def FEATURE_FAST_REDIRECTS */
- case LOG_LEVEL_DEANIMATE:
- outc = sprintf(outbuf, "Privoxy(%ld) Gif-Deanimate: ", this_thread);
+ outc = sprintf(outbuf, "IJB(%d) Redirect: ", this_thread);
break;
+#endif /* def FAST_REDIRECTS */
case LOG_LEVEL_CLF:
- outbuf = outbuf_save;
outc = 0;
outbuf[0] = '\0';
break;
-#ifdef FEATURE_KILL_POPUPS
- 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);
- break;
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.4 2001/05/25 21:56:06 jongfoster 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
- * - Removed all #ifdef PCRS
- *
- * Revision 1.5 2001/05/26 17:25:14 jongfoster
- * Added support for CLF (Common Log Format) and fixed LOG_LEVEL_LOG
- *
* Revision 1.4 2001/05/25 21:56:06 jongfoster
* Added FIXME comment to (broken) LOG_LEVEL_LOG
*
#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 */
+#ifdef PCRS
#define LOG_LEVEL_RE_FILTER 0x0040
-#ifdef FEATURE_FAST_REDIRECTS
+#endif /* def PCRS */
+#ifdef FAST_REDIRECTS
#define LOG_LEVEL_REDIRECTS 0x0080
-#endif /* def FEATURE_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 */
+#endif /* def FAST_REDIRECTS */
-#define LOG_LEVEL_CGI 0x0800 /* CGI / templates */
+#define LOG_LEVEL_CLF 0x0100 /* Common Log File format */
/* 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.18 2001/06/29 13:27:38 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'
+ * `ij_untrusted_url', `intercept_url', `re_process_buffer',
+ * `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.
- *
- * Revision 1.22 2001/07/18 12:29:34 oes
- * - Made gif_deanimate_response respect
- * csp->action->string[ACTION_STRING_DEANIMATE]
- * - Logging cosmetics
- *
- * Revision 1.21 2001/07/13 13:59:53 oes
- * - Introduced gif_deanimate_response which shares the
- * generic content modification interface of pcrs_filter_response
- * and acts as a wrapper to deanimate.c:gif_deanimate()
- * - Renamed re_process_buffer to pcrs_filter_response
- * - pcrs_filter_response now returns NULL on failiure
- * - Removed all #ifdef PCRS
- *
- * Revision 1.20 2001/07/01 17:01:04 oes
- * Added comments and missing return statement in is_untrusted_url()
- *
- * Revision 1.19 2001/06/29 21:45:41 oes
- * Indentation, CRLF->LF, Tab-> Space
- *
* Revision 1.18 2001/06/29 13:27:38 oes
* - Cleaned up, renamed and reorderd functions
* and improved comments
#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 "actions.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;
- /*
- * Workaround for stupid Netscape bug which prevents
- * pages from being displayed if loading a referenced
- * JavaScript or style sheet fails. So make it appear
- * as if it succeeded.
- */
- if ( NULL != (p = get_header_value(csp->headers, "User-Agent:"))
- && !strncmpic(p, "mozilla", 7) /* Catch Netscape but */
- && !strstr(p, "Gecko") /* save Mozilla, */
- && !strstr(p, "compatible") /* MSIE */
- && !strstr(p, "Opera")) /* and Opera. */
- {
- rsp->status = strdup("200 Request for blocked URL");
- }
- else
- {
- rsp->status = strdup("404 Request for blocked URL");
- }
-
- if (rsp->status == NULL)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
-
- exports = default_exports(csp, NULL);
- if (exports == NULL)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
-
-#ifdef FEATURE_FORCE_LOAD
- err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
- err = map_block_killer(exports, "force-support");
-#endif /* ndef FEATURE_FORCE_LOAD */
+ exports = default_exports(csp, NULL);
+#ifdef FORCE_LOAD
+ exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
+#else
+ exports = map_block_killer(exports, "force-support");
+#endif /* ndef FORCE_LOAD */
- if (!err) err = map(exports, "hostport", 1, html_encode(csp->http->hostport), 0);
- if (!err) err = map(exports, "path", 1, html_encode(csp->http->path), 0);
+ exports = 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);
- 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();
- }
+ rsp->body = fill_template(csp, "blocked", exports);
+ free_map(exports);
+
+ rsp->status = strdup("403 Request for blocked URL");
}
- return finish_http_response(rsp);
+ return(finish_http_response(rsp));
}
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
/*********************************************************************
*
* Function : trust_url FIXME: I should be called distrust_url
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");
- }
-
- if (err)
- {
- free_map(exports);
- free_http_response(rsp);
- return cgi_error_memory();
+ exports = map_block_killer(exports, "have-trust-info");
}
-
+
/*
* Export the force prefix or the force conditional block killer
*/
-#ifdef FEATURE_FORCE_LOAD
- err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
- err = map_block_killer(exports, "force-support");
-#endif /* ndef FEATURE_FORCE_LOAD */
-
- if (err)
- {
- free_map(exports);
- free_http_response(rsp);
- return cgi_error_memory();
- }
+#ifdef FORCE_LOAD
+ exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
+#else
+ exports = map_block_killer(exports, "force-support");
+#endif /* ndef FORCE_LOAD */
/*
* Build the response
*/
- err = template_fill_for_cgi(csp, "untrusted", exports, rsp);
- if (err)
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
+ rsp->body = fill_template(csp, "untrusted", exports);
+ free_map(exports);
+
+ return(finish_http_response(rsp));
- return finish_http_response(rsp);
}
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
-#ifdef FEATURE_FAST_REDIRECTS
+#ifdef FAST_REDIRECTS
/*********************************************************************
*
* Function : redirect_url
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);
}
+ *url = dsplit(csp->http->host);
+
+ /* if splitting the domain fails, punt */
+ if (url->dbuf == NULL) return(0);
+
memset(rhttp, '\0', sizeof(*rhttp));
- /*
- * Do we trust the request URL itself?
- */
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).
- */
+ *url = dsplit(rhttp->host);
- FILE *fp;
+ /* if splitting the domain fails, punt */
+ if (url->dbuf == NULL) return(1);
- if (NULL != (fp = fopen(csp->config->trustfile, "a")))
+ 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)
{
- char * path;
- char * path_end;
- char * new_entry = strdup("~");
-
- string_append(&new_entry, csp->http->hostport);
-
- path = csp->http->path;
- if ( (path[0] == '/')
- && (path[1] == '~')
- && ((path_end = strchr(path + 2, '/')) != NULL))
+ 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;
+
}
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def TRUST_FILES */
+#ifdef PCRS
/*********************************************************************
*
- * Function : pcrs_filter_response
+ * Function : re_process_buffer
*
- * 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 an empty string in case something went wrong
+ *
*********************************************************************/
-char *pcrs_filter_response(struct client_state *csp)
+char *re_process_buffer(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);
+ return(strdup(""));
}
- 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);
+ return(strdup(""));
}
- /*
- * If the body has a "chunked" transfer-encoding,
- * get rid of it first, adjusting size and iob->eod
- */
- if (csp->flags & CSP_FLAG_CHUNKED)
- {
- log_error(LOG_LEVEL_RE_FILTER, "Need to de-chunk first");
- if (0 == (size = remove_chunked_transfer_coding(csp->iob->cur, size)))
- {
- return(NULL);
- }
- csp->iob->eod = csp->iob->cur + size;
- csp->flags |= CSP_FLAG_MODIFIED;
- }
+ log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) ...",
+ csp->http->hostport, csp->http->path, size);
- /*
- * For all applying +filter actions, look if a filter by that
- * name exists and if yes, execute it's pcrs_joblist on the
- * buffer.
- */
- for (b = fl->f; b; b = b->next)
+ /* Apply all jobs from the joblist */
+ for (job = b->joblist; NULL != job; job = job->next)
{
- for (filtername = csp->action->multi[ACTION_MULTI_FILTER]->first;
- filtername ; filtername = filtername->next)
- {
- if (strcmp(b->name, filtername->str) == 0)
- {
- int current_hits = 0;
-
- if ( NULL == b->joblist )
- {
- log_error(LOG_LEVEL_RE_FILTER, "Filter %s has empty joblist. Nothing to do.", b->name);
- return(NULL);
- }
-
- log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) with filter %s...",
- csp->http->hostport, csp->http->path, size, b->name);
-
- /* Apply all jobs from the joblist */
- for (job = b->joblist; NULL != job; job = job->next)
- {
- current_hits += pcrs_execute(job, old, size, &new, &size);
- if (old != csp->iob->cur) free(old);
- old=new;
- }
-
- log_error(LOG_LEVEL_RE_FILTER, " ...produced %d hits (new size %d).", current_hits, size);
- hits += current_hits;
- }
- }
+ hits += pcrs_execute(job, old, size, &new, &size);
+ if (old != csp->iob->cur) free(old);
+ old=new;
}
- /*
- * If there were no hits, destroy our copy and let
- * chat() use the original in csp->iob
- */
- if (!hits)
- {
- free(new);
- return(NULL);
- }
+ log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size);
- csp->flags |= CSP_FLAG_MODIFIED;
csp->content_length = size;
- IOB_RESET(csp);
+ /* fwiw, reset the iob */
+ IOB_RESET(csp);
return(new);
}
+#endif /* def PCRS */
/*********************************************************************
*
- * Function : gif_deanimate_response
+ * Function : url_actions
*
- * 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 : Gets the actions for this URL.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
+ * 1 : http = http_request request for blocked URLs
+ * 2 : csp = Current client state (buffers, headers, etc...)
*
- * Returns : a pointer to the (newly allocated) modified buffer.
- * or NULL in case something went wrong.
+ * Returns : N/A
*
*********************************************************************/
-char *gif_deanimate_response(struct client_state *csp)
+void url_actions(struct http_request *http,
+ struct client_state *csp)
{
- struct binbuffer *in, *out;
- char *p;
- size_t size = csp->iob->eod - csp->iob->cur;
+ struct file_list *fl;
+ struct url_actions *b;
- /*
- * If the body has a "chunked" transfer-encoding,
- * get rid of it first, adjusting size and iob->eod
- */
- if (csp->flags & CSP_FLAG_CHUNKED)
+ init_current_action(csp->action);
+
+ if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
{
- 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;
+ return;
}
- if ( (NULL == (in = (struct binbuffer *)zalloc(sizeof *in )))
- || (NULL == (out = (struct binbuffer *)zalloc(sizeof *out))) )
+ apply_url_actions(csp->action, http, b);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function : apply_url_actions
+ *
+ * Description : Applies a list of URL actions.
+ *
+ * Parameters :
+ * 1 : action = Destination.
+ * 2 : http = Current URL
+ * 3 : b = list of URL actions to apply
+ *
+ * Returns : N/A
+ *
+ *********************************************************************/
+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)
{
- log_error(LOG_LEVEL_DEANIMATE, "failed! (no mem)");
- return NULL;
+ /* Should never happen */
+ return;
}
- in->buffer = csp->iob->cur;
- in->size = size;
+ *url = dsplit(http->host);
- if (gif_deanimate(in, out, strncmp("last", csp->action->string[ACTION_STRING_DEANIMATE], 4)))
+ /* if splitting the domain fails, punt */
+ if (url->dbuf == NULL)
{
- log_error(LOG_LEVEL_DEANIMATE, "failed! (gif parsing)");
- free(in);
- buf_free(out);
- return(NULL);
+ return;
}
- else
+
+ for (b = b->next; NULL != b; b = b->next)
{
- if ((int)size == out->offset)
+ if ((b->url->port == 0) || (b->url->port == http->port))
{
- 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);
+ 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);
+ }
+ }
}
- csp->content_length = out->offset;
- csp->flags |= CSP_FLAG_MODIFIED;
- p = out->buffer;
- free(in);
- free(out);
- return(p);
}
+ freez(url->dbuf);
+ freez(url->dvec);
}
/*********************************************************************
*
- * Function : remove_chunked_transfer_coding
+ * Function : forward_url
*
- * Description : In-situ remove the "chunked" transfer coding as defined
- * in rfc2616 from a buffer.
+ * Description : Should we forward this to another proxy?
*
* Parameters :
- * 1 : buffer = Pointer to the text buffer
- * 2 : size = Number of bytes to be processed
+ * 1 : http = http_request request for current URL
+ * 2 : csp = Current client state (buffers, headers, etc...)
*
- * 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
+ * Returns : Pointer to forwarding information.
*
*********************************************************************/
-int remove_chunked_transfer_coding(char *buffer, const size_t size)
+const struct forward_spec * forward_url(struct http_request *http,
+ struct client_state *csp)
{
- size_t newsize = 0;
- unsigned int chunksize = 0;
- char *from_p, *to_p;
-
- assert(buffer);
- from_p = to_p = buffer;
+ static const struct forward_spec fwd_default[1] = { 0 }; /* All zeroes */
+ struct forward_spec *fwd = csp->config->forward;
+ struct url_spec url[1];
- if (sscanf(buffer, "%x", &chunksize) != 1)
+ if (fwd == NULL)
{
- log_error(LOG_LEVEL_ERROR, "Invalid first chunksize while stripping \"chunked\" transfer coding");
- return(0);
+ return(fwd_default);
}
- 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;
+ *url = dsplit(http->host);
- memmove(to_p, from_p, (size_t) chunksize);
- to_p = buffer + newsize;
- from_p += chunksize + 2;
+ /* if splitting the domain fails, punt */
+ if (url->dbuf == NULL)
+ {
+ return(fwd_default);
+ }
- if (sscanf(from_p, "%x", &chunksize) != 1)
+ while (fwd != NULL)
+ {
+ if ((fwd->url->port == 0) || (fwd->url->port == http->port))
{
- log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding");
- return(0);
+ 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;
}
- /* 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);
+ freez(url->dbuf);
+ freez(url->dvec);
+ return(fwd_default);
}
/*********************************************************************
*
- * Function : url_actions
+ * Function : dsplit
*
- * Description : Gets the actions for this URL.
+ * 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 : http = http_request request for blocked URLs
- * 2 : csp = Current client state (buffers, headers, etc...)
+ * 1 : domain = a URL address
*
- * Returns : N/A
+ * Returns : url_spec structure populated with dbuf, dcnt and dvec.
*
*********************************************************************/
-void url_actions(struct http_request *http,
- struct client_state *csp)
+struct url_spec dsplit(char *domain)
{
- struct file_list *fl;
- struct url_actions *b;
+ struct url_spec ret[1];
+ char *v[BUFFER_SIZE];
+ int size;
+ char *p;
- init_current_action(csp->action);
+ memset(ret, '\0', sizeof(*ret));
- if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
+ if (domain[strlen(domain) - 1] == '.')
{
- return;
+ ret->unanchored |= ANCHOR_RIGHT;
}
- apply_url_actions(csp->action, http, b);
+ 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 : apply_url_actions
+ * Function : simple_domaincmp
*
- * Description : Applies a list of URL actions.
+ * 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 : action = Destination.
- * 2 : http = Current URL
- * 3 : b = list of URL actions to apply
+ * 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 : N/A
+ * Returns : 0 => domains are equivalent, else no match.
*
*********************************************************************/
-void apply_url_actions(struct current_action_spec *action,
- struct http_request *http,
- struct url_actions *b)
+static int simple_domaincmp(char **pv, char **fv, int len)
{
- if (b == NULL)
- {
- /* Should never happen */
- return;
- }
+ int n;
- for (b = b->next; NULL != b; b = b->next)
+ for (n = 0; n < len; n++)
{
- if (url_match(b->url, http))
+ if (simplematch(pv[n], fv[n]))
{
- merge_current_action(action, b->action);
+ return 1;
}
}
+
+ return 0;
+
}
/*********************************************************************
*
- * Function : forward_url
+ * Function : domaincmp
*
- * Description : Should we forward this to another proxy?
+ * 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 : http = http_request request for current URL
- * 2 : csp = Current client state (buffers, headers, etc...)
+ * 1 : pattern = a domain that may contain a '*' as a wildcard.
+ * 2 : fqdn = domain name against which the patterns are compared.
*
- * Returns : Pointer to forwarding information.
+ * Returns : 0 => domains are equivalent, else no match.
*
*********************************************************************/
-const struct forward_spec * forward_url(struct http_request *http,
- struct client_state *csp)
+int domaincmp(struct url_spec *pattern, struct url_spec *fqdn)
{
- static const struct forward_spec fwd_default[1] = { FORWARD_SPEC_INITIALIZER };
- struct forward_spec *fwd = csp->config->forward;
+ char **pv, **fv; /* vectors */
+ int plen, flen;
+ int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT);
- if (fwd == NULL)
+ plen = pattern->dcnt;
+ flen = fqdn->dcnt;
+
+ if (flen < plen)
{
- return fwd_default;
+ /* fqdn is too short to match this pattern */
+ return 1;
}
- while (fwd != NULL)
+ 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)
{
- if (url_match(fwd->url, http))
+ /* Fully anchored, check length */
+ if (flen != plen)
{
- return fwd;
+ return 1;
}
- fwd = fwd->next;
+ 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;
}
- return fwd_default;
}
-#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.9 2001/06/07 23:10:53 jongfoster 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
- *
* Revision 1.9 2001/06/07 23:10:53 jongfoster
* Replacing struct gateway with struct forward_spec
*
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);
-/*
- * 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);
+extern struct url_spec dsplit(char *domain);
+extern int domaincmp(struct url_spec *pattern, struct url_spec *fqdn);
/*
- * Solaris fix:
+ * Content modification
*/
-#ifndef INADDR_NONE
-#define INADDR_NONE -1
-#endif
+#ifdef PCRS
+extern char *re_process_buffer(struct client_state *csp);
+#endif /* def PCRS */
-/*
- * Revision control strings from this header and associated .c file
- */
+/* Revision control strings from this header and associated .c file */
extern const char filters_rcs[];
extern const char filters_h_rcs[];
} /* 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.2 2001/06/07 23:11:38 jongfoster Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/gateway.c,v $
* 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
- *
* Revision 1.2 2001/06/07 23:11:38 jongfoster
* Removing gateways[] list - no longer used.
* Replacing function pointer in struct gateway with a directly
#include <stdio.h>
#include <sys/types.h>
-
-#ifndef _WIN32
-#include <netinet/in.h>
-#endif
-
#include <errno.h>
-#include <string.h>
#ifdef _WIN32
#include <winsock2.h>
#endif /* def _WIN32 */
-#ifdef __BEOS__
-#include <netdb.h>
-#endif /* def __BEOS__ */
-
-#ifdef __OS2__
-#include <utils.h>
-#endif /* def __OS2__ */
-
-#include "project.h"
#include "jcc.h"
#include "errlog.h"
#include "jbsockets.h"
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.10 2001/06/29 13:29:15 oes 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.
- *
- * Revision 1.12 2001/07/01 17:04:11 oes
- * Bugfix: accept_connection no longer uses the obsolete hstrerror() function
- *
- * Revision 1.11 2001/06/29 21:45:41 oes
- * Indentation, CRLF->LF, Tab-> Space
- *
* Revision 1.10 2001/06/29 13:29:15 oes
* - Added remote (server) host IP to csp->http->host_ip_addr_str
* - Added detection of local socket IP and fqdn
#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 sockaddr raddr, laddr;
+ struct sockaddr_in *rap = (struct sockaddr_in *) &raddr;
+ struct sockaddr_in *lap = (struct sockaddr_in *) &laddr;
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, raddrlen, laddrlen;
+ extern int h_errno;
+ char *p;
- c_length = s_length = sizeof(client);
-
-#ifdef _WIN32
- afd = accept (fd, (struct sockaddr *) &client, &c_length);
- if (afd == JB_INVALID_SOCKET)
- {
- return 0;
- }
-#else
+ raddrlen = sizeof raddr;
do
{
- afd = accept (fd, (struct sockaddr *) &client, &c_length);
+ afd = accept (fd, &raddr, &raddrlen);
} while (afd < 1 && errno == EINTR);
+
if (afd < 0)
{
return 0;
}
-#endif
/*
* Determine the IP-Adress that the client used to reach us
* and the hostname associated with that address
*/
- if (!getsockname(afd, (struct sockaddr *) &server, &s_length))
+ if (!getsockname(afd, &laddr, &laddrlen))
{
- 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
+ csp->my_ip_addr_str = strdup(inet_ntoa(lap->sin_addr));
+
+ host = gethostbyaddr(laddr.sa_data + 2, 4, AF_INET);
if (host == NULL)
{
- log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %E\n");
+ log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %s\n", hstrerror(h_errno));
}
else
{
}
csp->cfd = afd;
- csp->ip_addr_str = strdup(inet_ntoa(client.sin_addr));
- csp->ip_addr_long = ntohl(client.sin_addr.s_addr);
+ csp->ip_addr_str = strdup(inet_ntoa(rap->sin_addr));
+ csp->ip_addr_long = ntohl(rap->sin_addr.s_addr);
return 1;
* 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.21 2001/06/29 13:29:36 oes Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
*
- * Purpose : Main file. Contains main() method, main loop, and
+ * Purpose : Main file. Contains main() method, main loop, and
* the main connection-handling function.
*
* Copyright : Written by and Copyright (C) 2001 the SourceForge
- * Privoxy team. http://www.privoxy.org/
+ * IJBSWA team. http://ijbswa.sourceforge.net
*
* Based on the Internet Junkbuster originally written
- * by and Copyright (C) 1997 Anonymous Coders and
+ * by and Copyright (C) 1997 Anonymous Coders and
* Junkbusters Corporation. http://www.junkbusters.com
*
- * This program is free software; you can redistribute it
+ * This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
* Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at
*
* Revisions :
* $Log: jcc.c,v $
- * Revision 1.87 2002/03/26 22:29:54 swa
- * we have a new homepage!
- *
- * Revision 1.86 2002/03/25 17:04:55 david__schmidt
- * Workaround for closing the jarfile before load_config() comes around again
- *
- * Revision 1.85 2002/03/24 15:23:33 jongfoster
- * Name changes
- *
- * Revision 1.84 2002/03/24 13:25:43 swa
- * name change related issues
- *
- * Revision 1.83 2002/03/16 23:54:06 jongfoster
- * Adding graceful termination feature, to help look for memory leaks.
- * If you enable this (which, by design, has to be done by hand
- * editing config.h) and then go to http://i.j.b/die, then the program
- * will exit cleanly after the *next* request. It should free all the
- * memory that was used.
- *
- * Revision 1.82 2002/03/13 00:27:05 jongfoster
- * Killing warnings
- *
- * Revision 1.81 2002/03/12 01:42:50 oes
- * Introduced modular filters
- *
- * Revision 1.80 2002/03/11 22:07:05 david__schmidt
- * OS/2 port maintenance:
- * - Fixed EMX build - it had decayed a little
- * - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro.
- * substituted a memset for now.
- *
- * Revision 1.79 2002/03/09 20:03:52 jongfoster
- * - Making various functions return int rather than size_t.
- * (Undoing a recent change). Since size_t is unsigned on
- * Windows, functions like read_socket that return -1 on
- * error cannot return a size_t.
- *
- * THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- * crashes, and also frequently caused JB to jump to 100%
- * CPU and stay there. (Because it thought it had just
- * read ((unsigned)-1) == 4Gb of data...)
- *
- * - The signature of write_socket has changed, it now simply
- * returns success=0/failure=nonzero.
- *
- * - Trying to get rid of a few warnings --with-debug on
- * Windows, I've introduced a new type "jb_socket". This is
- * used for the socket file descriptors. On Windows, this
- * is SOCKET (a typedef for unsigned). Everywhere else, it's
- * an int. The error value can't be -1 any more, so it's
- * now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- * Windows it maps to the #define INVALID_SOCKET.)
- *
- * - The signature of bind_port has changed.
- *
- * Revision 1.78 2002/03/08 21:35:04 oes
- * Added optional group supplement to --user option. Will now use default group of user if no group given
- *
- * Revision 1.77 2002/03/07 03:52:06 oes
- * - Fixed compiler warnings etc
- * - Improved handling of failed DNS lookups
- *
- * Revision 1.76 2002/03/06 22:54:35 jongfoster
- * Automated function-comment nitpicking.
- *
- * Revision 1.75 2002/03/06 10:02:19 oes
- * Fixed stupid bug when --user was not given
- *
- * Revision 1.74 2002/03/06 00:49:31 jongfoster
- * Fixing warning on Windows
- * Making #ifdefs that refer to the same variable consistently
- * use #ifdef unix rather than mixing #ifdef unix & #ifndef OS2
- *
- * Revision 1.73 2002/03/05 23:57:30 hal9
- * Stray character 's' on line 1618 was breaking build.
- *
- * Revision 1.72 2002/03/05 21:33:45 david__schmidt
- * - Re-enable OS/2 building after new parms were added
- * - Fix false out of memory report when resolving CGI templates when no IP
- * address is available of failed attempt (a la no such domain)
- *
- * Revision 1.71 2002/03/05 18:13:56 oes
- * Added --user option
- *
- * Revision 1.70 2002/03/05 04:52:42 oes
- * Deleted non-errlog debugging code
- *
- * Revision 1.69 2002/03/04 23:50:00 jongfoster
- * Splitting off bind_port() call into bind_port_helper(), with
- * improved logging.
- *
- * Revision 1.68 2002/03/04 20:17:32 oes
- * Fixed usage info
- *
- * Revision 1.67 2002/03/04 18:18:57 oes
- * - Removed _DEBUG mode
- * - Cleand up cmdline parsing
- * - Introduced --no-daemon, --pidfile options
- * - Cleaned up signal handling:
- * - Terminate cleanly on INT, TERM and ABRT
- * - Schedule logfile for re-opening on HUP
- * - Ignore CHLD and PIPE
- * - Leave the rest with their default handlers
- * - Uniform handler registration
- * - Added usage() function
- * - Played styleguide police
- *
- * Revision 1.66 2002/03/03 15:06:55 oes
- * Re-enabled automatic config reloading
- *
- * Revision 1.65 2002/03/03 14:49:11 oes
- * Fixed CLF logging: Now uses client's original HTTP request
- *
- * Revision 1.64 2002/03/03 09:18:03 joergs
- * Made jumbjuster work on AmigaOS again.
- *
- * Revision 1.63 2002/03/02 04:14:50 david__schmidt
- * Clean up a little CRLF unpleasantness that suddenly appeared
- *
- * Revision 1.62 2002/02/20 23:17:23 jongfoster
- * Detecting some out-of memory conditions and exiting with a log message.
- *
- * Revision 1.61 2002/01/17 21:01:52 jongfoster
- * Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- * Revision 1.60 2001/12/30 14:07:32 steudten
- * - Add signal handling (unix)
- * - Add SIGHUP handler (unix)
- * - Add creation of pidfile (unix)
- * - Add action 'top' in rc file (RH)
- * - Add entry 'SIGNALS' to manpage
- * - Add exit message to logfile (unix)
- *
- * Revision 1.59 2001/12/13 14:07:18 oes
- * Fixed Bug: 503 error page now sent OK
- *
- * Revision 1.58 2001/11/30 23:37:24 jongfoster
- * Renaming the Win32 config file to config.txt - this is almost the
- * same as the corresponding UNIX name "config"
- *
- * Revision 1.57 2001/11/16 00:47:43 jongfoster
- * Changing the tty-disconnection code to use setsid().
- *
- * Revision 1.56 2001/11/13 20:20:54 jongfoster
- * Tabs->spaces, fixing a bug with missing {} around an if()
- *
- * Revision 1.55 2001/11/13 20:14:53 jongfoster
- * Patch for FreeBSD setpgrp() as suggested by Alexander Lazic
- *
- * Revision 1.54 2001/11/07 00:03:14 steudten
- * Give reliable return value if an error
- * occurs not just 0 with new daemon mode.
- *
- * Revision 1.53 2001/11/05 21:41:43 steudten
- * Add changes to be a real daemon just for unix os.
- * (change cwd to /, detach from controlling tty, set
- * process group and session leader to the own process.
- * Add DBG() Macro.
- * Add some fatal-error log message for failed malloc().
- * Add '-d' if compiled with 'configure --with-debug' to
- * enable debug output.
- *
- * Revision 1.52 2001/10/26 20:11:20 jongfoster
- * Fixing type mismatch
- *
- * Revision 1.51 2001/10/26 17:38:28 oes
- * Cosmetics
- *
- * Revision 1.50 2001/10/25 03:40:48 david__schmidt
- * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- * threads to call select() simultaneously. So, it's time to do a real, live,
- * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__
- * (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- * Revision 1.49 2001/10/23 21:41:35 jongfoster
- * Added call to initialize the (statically-allocated of course)
- * "out of memory" CGI response.
- *
- * Revision 1.48 2001/10/10 19:56:46 jongfoster
- * Moving some code that wasn't cookie-related out of an #ifdef
- * FEATURE_COOKIE_JAR
- *
- * Revision 1.47 2001/10/10 16:44:36 oes
- * Added CONNECT destination port limitation check
- *
- * Revision 1.46 2001/10/08 15:17:41 oes
- * Re-enabled SSL forwarding
- *
- * Revision 1.45 2001/10/07 15:42:11 oes
- * Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- * Moved downgrading of the HTTP version from parse_http_request to
- * chat(), since we can't decide if it is necessary before we have
- * determined the actions for the URL. The HTTP command is now
- * *always* re-built so the repairs need no longer be special-cased.
- *
- * filter_popups now gets a csp pointer so it can raise the new
- * CSP_FLAG_MODIFIED flag.
- *
- * Bugfix
- *
- * Added configurable size limit for the IOB. If the IOB grows so
- * large that the next read would exceed the limit, the header
- * is generated, and the header & unfiltered buffer are flushed
- * to the client. Chat then continues in non-buffering,
- * non-filtering body mode.
- *
- * Revision 1.44 2001/10/02 18:13:57 oes
- * Ooops
- *
- * Revision 1.43 2001/10/02 15:32:13 oes
- * Moved generation of hdr
- *
- * Revision 1.42 2001/09/21 23:02:02 david__schmidt
- * Cleaning up 2 compiler warnings on OS/2.
- *
- * Revision 1.41 2001/09/16 17:05:14 jongfoster
- * Removing unused #include showarg.h
- *
- * Revision 1.40 2001/09/16 15:41:45 jongfoster
- * Fixing signed/unsigned comparison warning.
- *
- * Revision 1.39 2001/09/16 13:21:27 jongfoster
- * Changes to use new list functions.
- *
- * Revision 1.38 2001/09/16 13:01:46 jongfoster
- * Removing redundant function call that zeroed zalloc()'d memory.
- *
- * Revision 1.37 2001/09/10 11:12:24 oes
- * Deleted unused variable
- *
- * Revision 1.36 2001/09/10 10:56:15 oes
- * Silenced compiler warnings
- *
- * Revision 1.35 2001/07/31 14:44:22 oes
- * Deleted unused size parameter from filter_popups()
- *
- * Revision 1.34 2001/07/30 22:08:36 jongfoster
- * Tidying up #defines:
- * - All feature #defines are now of the form FEATURE_xxx
- * - Permanently turned off WIN_GUI_EDIT
- * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- * Revision 1.33 2001/07/29 19:32:00 jongfoster
- * Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
- *
- * Revision 1.32 2001/07/29 18:47:05 jongfoster
- * Adding missing #include "loadcfg.h"
- *
- * Revision 1.31 2001/07/29 12:17:48 oes
- * Applied pthread fix by Paul Lieverse
- *
- * Revision 1.30 2001/07/25 22:57:13 jongfoster
- * __BEOS__ no longer overrides FEATURE_PTHREAD.
- * This is because FEATURE_PTHREAD will soon be widely used, so I
- * want to keep it simple.
- *
- * Revision 1.29 2001/07/24 12:47:06 oes
- * Applied BeOS support update by Eugenia
- *
- * Revision 1.28 2001/07/23 13:26:12 oes
- * Fixed bug in popup-killing for the first read that caused binary garbage to be sent between headers and body
- *
- * Revision 1.27 2001/07/19 19:09:47 haroon
- * - Added code to take care of the situation where while processing the first
- * server response (which includes the server header), after finding the end
- * of the headers we were not looking past the end of the headers for
- * content modification. I enabled it for filter_popups.
- * Someone else should look to see if other similar operations should be
- * done to the discarded portion of the buffer.
- *
- * Note 2001/07/20: No, the other content modification mechanisms will process
- * the whole iob later anyway. --oes
- *
- * Revision 1.26 2001/07/18 12:31:36 oes
- * cosmetics
- *
- * Revision 1.25 2001/07/15 19:43:49 jongfoster
- * Supports POSIX threads.
- * Also removed some unused #includes.
- *
- * Revision 1.24 2001/07/13 14:00:40 oes
- * - Generic content modification scheme:
- * Each feature has its own applicability flag that is set
- * from csp->action->flags.
- * Replaced the "filtering" int flag , by a function pointer
- * "content_filter" to the function that will do the content
- * modification. If it is != NULL, the document will be buffered
- * and processed through *content_filter, which must set
- * csp->content_length and return a modified copy of the body
- * or return NULL (on failiure).
- * - Changed csp->is_text to the more generic bitmap csp->content_type
- * which can currently take the valued CT_TEXT or CT_GIF
- * - Reformatting etc
- * - Removed all #ifdef PCRS
- *
- * Revision 1.23 2001/07/02 02:28:25 iwanttokeepanon
- * Added "#ifdef ACL_FILES" conditional compilation to line 1291 to exclude
- * the `block_acl' call. This prevents a compilation error when the user
- * does not wish to use the "ACL" feature.
- *
- * Revision 1.22 2001/06/29 21:45:41 oes
- * Indentation, CRLF->LF, Tab-> Space
- *
* Revision 1.21 2001/06/29 13:29:36 oes
* - Cleaned up, improved comments
* - Unified all possible interceptors (CGI,
#include <fcntl.h>
#include <errno.h>
-#ifdef FEATURE_PTHREAD
-#include <pthread.h>
-#endif /* def FEATURE_PTHREAD */
-
#ifdef _WIN32
-# ifndef FEATURE_PTHREAD
-# include <windows.h>
-# include <process.h>
-# endif /* ndef FEATURE_PTHREAD */
+
+# include <sys/timeb.h>
+# include <windows.h>
+# include <io.h>
+# include <process.h>
+# ifdef TOGGLE
+# include <time.h>
+# endif /* def TOGGLE */
# include "win32.h"
# ifndef _WIN_CONSOLE
#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 */
-
- 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;
-
- /* Skeleton for HTTP response, if we should intercept the request */
+#endif /* def KILLPOPUPS */
+#ifdef PCRS
+ int pcrs_filter; /* bool, 1==will filter through pcrs */
+ int filtering = 0; /* bool, 1==currently filtering through pcrs */
+#endif /* def PCRS */
struct http_response *rsp;
http = csp->http;
* 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 */
+#ifdef PCRS
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);
+#endif /* def PCRS */
- 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;
/*
* The server wants to talk. It could be the header or the body.
* If `hdr' is null, then it's the header otherwise it's the body.
- * FIXME: Does `hdr' really mean `host'? No.
+ * FIXME: Does `hdr' really mean `host'?
*/
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)
{
-
+ /* This hack must only be enforced for headers. */
if (server_body || http->ssl)
{
- /*
- * If we have been buffering up the document,
- * now is the time to apply content modification
- * and send the result to the client.
- */
- if (content_filter)
+#ifdef PCRS
+ if (filtering)
{
- /*
- * If the content filter fails, use the original
- * buffer and length.
- * (see p != NULL ? p : csp->iob->cur below)
- */
- if (NULL == (p = (*content_filter)(csp)))
- {
- csp->content_length = csp->iob->eod - csp->iob->cur;
- }
-
+ p = re_process_buffer(csp);
hdr = sed(server_patterns, add_server_headers, csp);
- if (hdr == NULL)
- {
- /* FIXME Should handle error properly */
- log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
- }
-
- if (write_socket(csp->cfd, hdr, strlen(hdr))
- || write_socket(csp->cfd, p != NULL ? p : csp->iob->cur, csp->content_length))
+ n = strlen(hdr);
+ if ((write_socket(csp->cfd, hdr, n) != n)
+ || (write_socket(csp->cfd, p, 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(hdr);
+ freez(p);
}
-
+#endif /* def PCRS */
break; /* "game over, man" */
}
- /*
- * This is NOT the body, so
- * Let's pretend the server just sent us a blank line.
- */
- len = sprintf(buf, "\r\n");
+ /* Let's pretend the server just sent us a blank line. */
+ n = sprintf(buf, "\r\n");
/*
* Now, let the normal header parsing algorithm below do its
/*
* If this is an SSL connection or we're in the body
- * of the server document, just write it to the client,
- * unless we need to buffer the body for later content-filtering
+ * of the server document, just write it to the client.
*/
if (server_body || http->ssl)
{
- if (content_filter)
+#ifdef PCRS
+ if (filtering)
{
- 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); /* Buffer the body for filtering */
}
else
+#endif /* def PCRS */
{
- if (write_socket(csp->cfd, buf, (size_t)len))
+ /* just write */
+ 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 */
- !http->ssl && /* We talk plaintext */
- block_popups) /* Policy allows */
+ if (csp->is_text && /* It's a text / * MIME-Type */
+ !http->ssl && /* We talk plaintext */
+ block_popups) /* Policy allows */
{
block_popups_now = 1;
- /*
- * Filter the part of the body that came in the same read
- * as the last headers:
- */
- filter_popups(csp->iob->cur, csp);
}
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
- /* Buffer and pcrs filter this if appropriate. */
+#ifdef PCRS
+ /* Start re_filtering this if appropriate. */
- if ((csp->content_type & CT_TEXT) && /* It's a text / * MIME-Type */
- !http->ssl && /* We talk plaintext */
- pcrs_filter) /* Policy allows */
+ if (csp->is_text && /* It's a text / * MIME-Type */
+ !http->ssl && /* We talk plaintext */
+ pcrs_filter) /* Policy allows */
{
- content_filter = pcrs_filter_response;
+ filtering = 1;
}
- /* Buffer and gif_deanimate this if appropriate. */
+/* This next line is a little ugly, but it simplifies the if statement below. */
+/* Basically if using PCRS, we want the OR condition to require "!filtering" */
+#define NOT_FILTERING_AND !filtering &&
- if ((csp->content_type & CT_GIF) && /* It's a image/gif MIME-Type */
- !http->ssl && /* We talk plaintext */
- gif_deanimate) /* Policy allows */
- {
- content_filter = gif_deanimate_response;
- }
+#else /* not def PCRS */
- /*
- * Only write if we're not buffering for content modification
- */
- if (!content_filter)
- {
- /* write the server's (modified) header to
- * the client (along with anything else that
- * may be in the buffer)
- */
+#define NOT_FILTERING_AND
- 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");
+#endif /* def PCRS */
- /* the write failed, so don't bother
- * mentioning it to the client...
- * it probably can't hear us anyway.
- */
- freez(hdr);
- return;
- }
+ if (NOT_FILTERING_AND ((write_socket(csp->cfd, hdr, n) != n)
+ || (n = flush_socket(csp->cfd, csp) < 0)))
+ {
+ 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;
}
+ NOT_FILTERING_AND (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))
+ {
+ printf("JunkBuster proxy version " VERSION ".\n\n"
+ "Usage: %s [configfile]\n\n"
+ "See " HOME_PAGE_URL " for details.\n"
+ "This program is distributed under the GNU GPL, version 2 or later.\n",
+ argv[0]);
+ exit(2);
+ }
+ if ((argc >= 2) && (strcmp(argv[1], "--version")==0))
{
- char *abs_file;
+ printf(VERSION "\n");
+ exit(2);
+ }
+#endif /* !defined(_WIN32) || defined(_WIN_CONSOLE) */
- /* make config-filename absolute here */
- if ( !(basedir = getcwd( NULL, 1024 )))
- {
- perror("get working dir failed");
- exit( 1 );
- }
+ Argc = argc;
+ Argv = argv;
- if ( !(abs_file = malloc( strlen( basedir ) + strlen( configfile ) + 5 )))
- {
- perror("malloc failed");
- exit( 1 );
- }
- strcpy( abs_file, basedir );
- strcat( abs_file, "/" );
- strcat( abs_file, configfile );
- configfile = abs_file;
+ if (argc > 1)
+ {
+ configfile = argv[1];
}
-#endif /* defined unix */
-
files->next = NULL;
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)
+ {
+ log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E "
+ "- There may be another junkbuster or some other "
+ "proxy running on port %d",
+ (NULL != config->haddr) ? config->haddr : "INADDR_ANY",
+ config->hport, config->hport
+ );
+ /* shouldn't get here */
+ return;
+ }
+
+ config->need_bind = 0;
+
+
+ while (FOREVER)
{
-#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+#if !defined(_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
- */
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
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
if (block_acl(NULL,csp))
{
log_error(LOG_LEVEL_CONNECT, "Connection dropped due to ACL");
freez(csp);
continue;
}
-#endif /* def FEATURE_ACL */
/* add it to the list of clients */
csp->next = clients->next;
/* this is a switch () statment in the C preprocessor - ugh */
#undef SELECTED_ONE_OPTION
-/* Use Pthreads in preference to native code */
-#if defined(FEATURE_PTHREAD) && !defined(SELECTED_ONE_OPTION)
-#define SELECTED_ONE_OPTION
- {
- pthread_t the_thread;
- 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);
- }
-#endif
-
#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)))
{
#if !defined(SELECTED_ONE_OPTION)
child_id = fork();
+#endif
+
+#undef SELECTED_ONE_OPTION
+/* end of cpp switch () */
+
+ if (child_id < 0) /* failed */
+ {
+ char buf[BUFFER_SIZE];
+
+ log_error(LOG_LEVEL_ERROR, "can't fork: %E");
+
+ sprintf(buf , "JunkBuster: can't fork: errno = %d", errno);
+
+ write_socket(csp->cfd, buf, strlen(buf));
+ close_socket(csp->cfd);
+ csp->active = 0;
+ sleep(5);
+ continue;
+ }
+#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
/* This block is only needed when using fork().
* When using threads, the server thread was
* created and run by the call to _beginthread().
_exit(0);
}
- else if (child_id > 0) /* parent */
+ else /* parent */
{
/* in a fork()'d environment, the parent's
* copy of the client socket and the CSP
wait( NULL );
#endif /* !defined(_WIN32) && defined(__CYGWIN__) */
close_socket(csp->cfd);
- csp->flags &= ~CSP_FLAG_ACTIVE;
- }
-#endif
-
-#undef SELECTED_ONE_OPTION
-/* end of cpp switch () */
-
- if (child_id < 0) /* failed */
- {
- char buf[BUFFER_SIZE];
-
- log_error(LOG_LEVEL_ERROR, "can't fork: %E");
-
- sprintf(buf , "JunkBuster: can't fork: errno = %d", errno);
-
- write_socket(csp->cfd, buf, strlen(buf));
- close_socket(csp->cfd);
- csp->flags &= ~CSP_FLAG_ACTIVE;
- sleep(5);
- continue;
+ csp->active = 0;
}
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
}
else
{
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.1.1.1 2001/05/15 13:58:56 oes 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.
- * Moved vanilla wafer check into chat(), since we must now
- * decide whether or not to add it based on the URL.
- *
* Revision 1.1.1.1 2001/05/15 13:58:56 oes
* Initial import of version 2.9.3 source tree
*
*********************************************************************/
\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;
+#define freez(X) if(X) free(X); X = NULL
+
/* 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.8 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
+#
+# 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.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.4
+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 permissionsfile $RPM_BUILD_ROOT%{ijbconf}/permissionsfile
+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.3 2001/05/22 18:56:28 oes 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(
- *
- * Revision 1.5 2001/07/18 15:02:52 haroon
- * improved nuking of window.open
- *
- * Revision 1.4 2001/06/29 13:29:55 oes
- * Added FIXMEs (and didn't repair, hehe)
- *
* Revision 1.3 2001/05/22 18:56:28 oes
* CRLF -> LF
*
#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 "errlog.h"
+#include "jcc.h"
const char killpopup_h_rcs[] = KILLPOPUP_H_VERSION;
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
+
+/* Change these for debug output. *lots*. */
+/*#define POPUP_VERBOSE 1*/
+#undef POPUP_VERBOSE
+
/*********************************************************************
*
* 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.
+ * FIXME: Should use the replacements proposed by Guy
*
* 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;
+ char *q = NULL; /* by BREITENB NEW! */
- /*
- * 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)
+#ifdef POPUP_VERBOSE
+ fprintf(logfp, "Found start of window open" );
+#endif
+ close = strstr( popup+1, ");" );
+ if ( close )
{
- strncpy(start_p, "1;''.concat(", 12);
- log_error(LOG_LEVEL_POPUPS, "Blocked popup window open");
- csp->flags |= CSP_FLAG_MODIFIED;
+#ifdef POPUP_VERBOSE
+ fprintf(logfp, "Found end of window open" );
+#endif
+ for ( p = popup; p != (close+1); p++ )
+ {
+ *p = ' ';
+ }
+#ifdef POPUP_VERBOSE
+ fprintf(logfp, "Blocked %s\n", host_name );
+#endif
+ }
+ else
+ {
+#ifdef POPUP_VERBOSE
+ fprintf(logfp, "Couldn't find end, turned into comment. Read boundary?\n" );
+#endif
+ *popup = '/';
+ popup++;
+ *popup = '/';
}
- }
- /*
- * replace the .resizeTo( with a harmless JavaScript replacement
- */
- while ((start_p = strstr(buff, ".resizeTo(")) != NULL)
- {
- if (start_p)
+
+ q=popup; /* by BREITENB NEW! */
+ while (q>=buff)
+ {
+ if (*q==' ' || *q=='\t')
+ q--;
+ else break;
+ }
+ if (q>=buff)
{
- strncpy(start_p, ".scrollTo(", 10);
- log_error(LOG_LEVEL_POPUPS, "Blocked popup window resize");
- csp->flags |= CSP_FLAG_MODIFIED;
+ if (*q=='=') *++q='1';
+ /* result of popup is assigned to a variable! ensure success. hehehe. */
}
}
- /*
- * 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 $";
+/* vim:ts=3: */
+const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.16 2001/06/09 10:55:28 jongfoster 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
- *
- * Revision 1.17 2001/06/29 13:31:03 oes
- * - Improved comments
- * - Fixed (actionsfile) and sorted hashes
- * - Introduced admin_address and proxy-info-url
- * as config parameters
- * - Renamed config->proxy_args_invocation (which didn't have
- * the invocation but the options!) to config->proxy_args
- * - Various adaptions
- * - Removed logentry from cancelled commit
- *
* Revision 1.16 2001/06/09 10:55:28 jongfoster
* Changing BUFSIZ ==> BUFFER_SIZE
*
#include <fcntl.h>
#include <errno.h>
#include <ctype.h>
-#include <assert.h>
#ifdef _WIN32
+# include <sys/timeb.h>
# include <windows.h>
+# include <io.h>
+# include <process.h>
+# ifdef TOGGLE
+# include <time.h>
+# endif /* def TOGGLE */
# include "win32.h"
# ifndef _WIN_CONSOLE
#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 */
+#ifdef PCRS
+ freez((char *)config->re_filterfile);
+#endif /* def PCRS */
-#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);
+ ****************************************************************************/
+#ifdef PCRS
+ case hash_re_filterfile :
+ freez((char *)config->re_filterfile);
config->re_filterfile = make_path(config->confdir, arg);
continue;
+#endif /* def PCRS */
-/* *************************************************************************
+/****************************************************************************
* 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 */
+#ifndef PCRS
+ case hash_re_filterfile :
+#endif /* ndef PCRS */
+#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_actions_file, config);
}
+#ifdef PCRS
if (config->re_filterfile)
{
add_loader(load_re_filterfile, config);
}
+#endif /* def PCRS */
-#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;
+#ifdef PCRS
g_re_filterfile = config->re_filterfile;
-
-#ifdef FEATURE_TRUST
+#endif
+#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.17 2001/06/29 13:31:51 oes 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
- * as well
- *
- * Revision 1.21 2001/07/18 17:26:24 oes
- * Changed to conform to new pcrs interface
- *
- * Revision 1.20 2001/07/17 13:07:01 oes
- * Fixed segv when last line in config files
- * lacked a terminating (\r)\n
- *
- * Revision 1.19 2001/07/13 14:01:54 oes
- * Removed all #ifdef PCRS
- *
- * Revision 1.18 2001/06/29 21:45:41 oes
- * Indentation, CRLF->LF, Tab-> Space
- *
* Revision 1.17 2001/06/29 13:31:51 oes
* Various adaptions
*
#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 */
+#ifdef PCRS
static struct file_list *current_re_filterfile = NULL;
-
+#endif /* def PCRS */
/*********************************************************************
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->actions_list->active = 1;
}
- if (ncsp->rlist) /* pcrsjob files */
+#ifdef PCRS
+ if (ncsp->rlist) /* perl re files */
{
ncsp->rlist->active = 1;
}
+#endif /* def PCRS */
-#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
- * and the ones of all inactive clients that might
- * follow it
- */
{
- while (!(ncsp->flags & CSP_FLAG_ACTIVE))
- {
- csp->next = ncsp->next;
-
- freez(ncsp->ip_addr_str);
- freez(ncsp->my_ip_addr_str);
- freez(ncsp->my_hostname);
- freez(ncsp->x_forwarded);
- freez(ncsp->iob->buf);
+ /* this client one is not active, release its resources */
+ csp->next = ncsp->next;
- free_http_request(ncsp->http);
+ freez(ncsp->ip_addr_str);
+ freez(ncsp->my_ip_addr_str);
+ freez(ncsp->my_hostname);
- destroy_list(ncsp->headers);
- destroy_list(ncsp->cookie_list);
+#ifdef TRUST_FILES
+ freez(ncsp->referrer);
+#endif /* def TRUST_FILES */
+ freez(ncsp->x_forwarded);
+ freez(ncsp->iob->buf);
- free_current_action(ncsp->action);
+ free_http_request(ncsp->http);
-#ifdef FEATURE_STATISTICS
- urls_read++;
- if (ncsp->flags & CSP_FLAG_REJECTED)
- {
- urls_rejected++;
- }
-#endif /* def FEATURE_STATISTICS */
+ destroy_list(ncsp->headers);
+ destroy_list(ncsp->cookie_list);
- freez(ncsp);
+ free_current_action(ncsp->action);
- /* are there any more in sequence after it? */
- if( (ncsp = csp->next) == NULL)
- break;
+#ifdef STATISTICS
+ urls_read++;
+ if (ncsp->rejected)
+ {
+ urls_rejected++;
}
+#endif /* def STATISTICS */
+
+ freez(ncsp);
}
}
- 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)))
+#ifndef SPLIT_PROXY_ARGS
+ if (!suppress_blocklists)
{
- 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 (;;)
- {
- 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;
- }
-
- /* 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. */
-
- if (raw_out)
- {
- if ((raw = malloc(1)) == NULL)
- {
- 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;
- }
- *data = '\0';
- }
+ char *p, *q;
+ char linebuf[BUFFER_SIZE];
+ int contflag = 0;
- /* Main loop. Loop while we need more data & it's not EOF. */
+ *buf = '\0';
- while ( (contflag || is_empty)
- && (JB_ERR_OK == (rval = simple_read_line(fp, &linebuf, newline))))
+ while (fgets(linebuf, sizeof(linebuf), fp))
{
- if (line_number)
- {
- (*line_number)++;
- }
- if (raw)
+#ifndef SPLIT_PROXY_ARGS
+ if (fs && !suppress_blocklists)
{
- string_append(&raw,linebuf);
- if (string_append(&raw,NEWLINE(*newline)))
+ char *html_line = html_encode(linebuf);
+ if (html_line != NULL)
{
- freez(prefix);
- freez(data);
- free(linebuf);
- return JB_ERR_MEMORY;
+ fs->proxy_args = strsav(fs->proxy_args, html_line);
+ freez(html_line);
}
+ fs->proxy_args = strsav(fs->proxy_args, "<br>");
}
+#endif /* ndef SPLIT_PROXY_ARGS */
- /* Line continuation? Trim escape and set flag. */
- p = linebuf + strlen(linebuf) - 1;
- contflag = ((*linebuf != '\0') && (*p == '\\'));
- if (contflag)
+ /* Trim off newline */
+ if ((p = strpbrk(linebuf, "\r\n")) != NULL)
{
*p = '\0';
}
- /* Trim leading spaces if we're at the start of the line */
- linestart = linebuf;
- if (*data == '\0')
+ /* Line continuation? Trim escape and set flag. */
+ if ((p != linebuf) && (*--p == '\\'))
{
- /* Trim leading spaces */
- while (*linestart && isspace((int)(unsigned char)*linestart))
- {
- linestart++;
- }
+ contflag = 1;
+ *p = '\0';
}
- /* 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 */
+#ifdef PCRS
/*********************************************************************
*
* 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;
-
- while (b != NULL)
- {
- a = b->next;
+ struct re_filterfile_spec *b = (struct re_filterfile_spec *)f;
- 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(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);
}
+#endif /* def PCRS */
/*********************************************************************
* 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.5 2001/05/31 21:28:49 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.
- *
* Revision 1.5 2001/05/31 21:28:49 jongfoster
* Removed all permissionsfile code - it's now called the actions
* file, and (almost) all the code is in actions.c
*********************************************************************/
\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 */
+#ifdef PCRS
+extern int load_re_filterfile(struct client_state *csp);
+#endif /* def PCRS */
+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 $";
+/* vim:ts=3: */
+const char miscutil_rcs[] = "$Id: miscutil.c,v 1.13 2001/06/29 13:32:14 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
- *
* Revision 1.13 2001/06/29 13:32:14 oes
* Removed logentry from cancelled commit
*
#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 */
/*********************************************************************
* 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)
+ if (NULL != old)
{
- log_error(LOG_LEVEL_FATAL, "realloc(%d) bytes failed!", new_len);
- /* Never get here - LOG_LEVEL_FATAL causes program exit */
+ old_len = strlen(old);
}
-
- 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)
- {
- return JB_ERR_MEMORY;
- }
-
- 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.16 2001/06/29 13:32:42 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 '/'.
- * - Removed all #ifdef PCRS
- * - content_type now always inspected and classified as
- * text, gif or other.
- * - formatting / comments
- *
- * Revision 1.17 2001/06/29 21:45:41 oes
- * Indentation, CRLF->LF, Tab-> Space
- *
* Revision 1.16 2001/06/29 13:32:42 oes
* - Fixed a comment
* - Adapted free_http_request
* 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 },
+#if defined(PCRS) || defined(KILLPOPUPS)
+ { "Content-Type:", 13, content_type },
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
+#ifdef PCRS
+ { "Content-Length:", 15, content_length },
+#endif /* def PCRS */
{ 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);
+
}
/*********************************************************************
*
- * 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);
- /*
- * Raise flag if body chunked
- */
- if (strstr(*header, "chunked"))
+ n = ssplit(buf, " \r\n", v, SZ(v), 1, 1);
+
+ 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 && (p = strchr(url, '/')))
+ {
+ http->path = strdup(p);
+ *p = '\0';
+ http->hostport = strdup(url);
+ }
}
}
- 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;
+ }
+
+ n = ssplit(buf, ":", v, SZ(v), 1, 1);
-/*********************************************************************
- *
- * 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 */
+ 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]);
+ }
+
+ freez(buf);
- sprintf(*header, "Content-Length: %d", (int) csp->content_length);
+ if (http->host == NULL)
+ {
+ free_http_request(http);
+ }
- log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", (int) csp->content_length);
+ 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;
}
+#if defined(PCRS) || defined(KILLPOPUPS)
+
/*********************************************************************
*
- * 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->is_text = 1;
+ else
+ csp->is_text = 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;
}
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
+#ifdef PCRS
/*********************************************************************
*
- * 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 have
+ * filtered this page through PCRS.
*
* 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;
}
+#endif /* def PCRS */
+
+
/*********************************************************************
*
* 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);
}
*
* Function : client_uagent
*
- * Description : Handle the "user-agent" config setting properly
- * and remember its original value to enable browser
- * bug workarounds. Called from `sed'.
+ * Description : Handle the "user-agent" config setting properly.
+ * Called from `sed'.
*
* Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- * 2 : header = On input, pointer to header to modify.
- * On output, pointer to the modified header, or NULL
- * to remove the header. This function frees the
- * original string if necessary.
+ * 1 : v = ignored
+ * 2 : s = header (from sed) to "crunch"
+ * 3 : csp = Current client state (buffers, headers, etc...)
*
- * Returns : JB_ERR_OK on success, or
- * JB_ERR_MEMORY on out-of-memory error.
+ * Returns : A malloc'ed pointer to the default agent, or
+ * a malloc'ed string pointer to this header (ie. pass thru).
*
*********************************************************************/
-jb_err client_uagent(struct client_state *csp, char **header)
+char *client_uagent(const struct parsers *v, char *s, struct client_state *csp)
{
const char * newval;
+#ifdef DETECT_MSIE_IMAGES
+ if (strstr (s, "MSIE "))
+ {
+ /* This is Microsoft Internet Explorer.
+ * Enable auto-detect.
+ */
+ csp->accept_types |= ACCEPT_TYPE_IS_MSIE;
+ }
+#endif /* def DETECT_MSIE_IMAGES */
+
if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0)
{
- return JB_ERR_OK;
+ return(strdup(s));
}
newval = csp->action->string[ACTION_STRING_USER_AGENT];
if (newval == NULL)
{
- return JB_ERR_OK;
+ return(strdup(s));
}
log_error(LOG_LEVEL_HEADER, "modified");
- freez(*header);
- *header = strdup("User-Agent: ");
- string_append(header, newval);
+ s = strsav( NULL, "User-Agent: " );
+ s = strsav( s, newval );
+ return(s);
- return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
}
* 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))
- {
- return JB_ERR_OK;
- }
-
- p = strdup("Host: ");
- /*
- ** remove 'user:pass@' from 'proto://user:pass@host'
- */
- if ( (pos = strchr( csp->http->hostport, '@')) != NULL )
+#ifdef DETECT_MSIE_IMAGES
+ if (strstr (s, "image/gif"))
{
- 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;
- }
+ struct list *lst;
+ char *tmp = NULL;
+ char *e;
- tmp = strdup("Cookie: ");
-
- for (lst = list1; lst ; lst = lst->next)
+ for (lst = csp->cookie_list->next; lst ; lst = lst->next)
{
- if (first_cookie)
- {
- first_cookie = 0;
- }
- else
+ if (tmp)
{
- string_append(&tmp, "; ");
+ tmp = strsav(tmp, "; ");
}
- string_append(&tmp, lst->str);
+ tmp = strsav(tmp, lst->str);
}
- for (lst = list2; lst ; lst = lst->next)
+ for (lst = csp->action->multi[ACTION_MULTI_WAFER]->next; lst ; lst = lst->next)
{
- if (first_cookie)
+ if (tmp)
{
- first_cookie = 0;
+ tmp = strsav(tmp, "; ");
}
- else
+
+ if ((e = cookie_encode(lst->str)))
{
- string_append(&tmp, "; ");
+ tmp = strsav(tmp, e);
+ freez(e);
}
- string_join(&tmp, cookie_encode(lst->str));
}
- if (tmp == NULL)
+ if (tmp)
{
- return JB_ERR_MEMORY;
- }
-
- log_error(LOG_LEVEL_HEADER, "addh: %s", tmp);
- err = enlist(csp->headers, tmp);
- free(tmp);
- return err;
-}
-
+ char *ret;
-/*********************************************************************
- *
- * Function : client_accept_encoding_adder
- *
- * Description : Add an Accept-Encoding header to the client's request
- * that disables compression if the action applies, and
- * the header is not already there. Called from `sed'.
- * Note: For HTTP/1.0, the absence of the header is enough.
- *
- * Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- *
- * Returns : JB_ERR_OK on success, or
- * JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err client_accept_encoding_adder(struct client_state *csp)
-{
- if ( ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
- && (!strcmpic(csp->http->ver, "HTTP/1.1")) )
- {
- return enlist_unique(csp->headers, "Accept-Encoding: identity;q=1.0, *;q=0", 16);
+ ret = strdup("Cookie: ");
+ ret = strsav(ret, tmp);
+ log_error(LOG_LEVEL_HEADER, "addh: %s", ret);
+ enlist(csp->headers, ret);
+ freez(tmp);
+ freez(ret);
}
- return JB_ERR_OK;
}
* 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.6 2001/06/03 19:12:38 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
- *
* Revision 1.6 2001/06/03 19:12:38 oes
* deleted const struct interceptors
*
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);
+
+#if defined(PCRS) || defined(KILLPOPUPS)
+extern char *content_type(const struct parsers *v, char *s, struct client_state *csp);
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
+
+#ifdef PCRS
+extern char *content_length(const struct parsers *v, char *s, struct client_state *csp);
+#endif /* def PCRS */
+
+#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:
+++ /dev/null
-chartables.c
-dftables
+++ /dev/null
-
-# Makefile.in for PCRE (Perl-Compatible Regular Expression) library.
-
-#---------------------------------------------------------------------------#
-# To build mingw32 DLL uncomment the next two lines. This addition for #
-# mingw32 was contributed by <Paul.Sokolovsky@technologist.com>. I (Philip #
-# Hazel) don't know anything about it! There are some additional targets at #
-# the bottom of this Makefile. #
-#---------------------------------------------------------------------------#
-#
-# include dll.mk
-# DLL_LDFLAGS=-s
-
-
-#---------------------------------------------------------------------------#
-# The next few lines are modified by "configure" to insert data that it is #
-# given in its arguments, or which it finds out for itself. #
-#---------------------------------------------------------------------------#
-
-# BINDIR is the directory in which the pcregrep command is installed.
-# INCDIR is the directory in which the public header file pcre.h is installed.
-# LIBDIR is the directory in which the libraries are installed.
-# MANDIR is the directory in which the man pages are installed.
-# The pcretest program, as it is a test program, does not get installed
-# anywhere.
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-BINDIR = @bindir@
-LIBDIR = @libdir@
-INCDIR = @includedir@
-MANDIR = @mandir@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-RANLIB = @RANLIB@
-UTF8 = @UTF8@
-
-# LIBTOOL defaults to "./libtool", which enables the building of shared
-# libraries. If "configure" is called with --disable-shared-libraries, LIBTOOL
-# is set to "", which stops shared libraries from being built, and LIBSUFFIX
-# is set to "a" instead of "la", which causes the shared libraries not to be
-# installed.
-
-LIBTOOL = @LIBTOOL@
-LIBSUFFIX = @LIBSUFFIX@
-
-# These are the version numbers for the shared libraries
-
-PCRELIBVERSION = @PCRE_LIB_VERSION@
-PCREPOSIXLIBVERSION = @PCRE_POSIXLIB_VERSION@
-
-
-#---------------------------------------------------------------------------#
-# A copy of install-sh is in this distribution and is used by default. #
-#---------------------------------------------------------------------------#
-
-INSTALL = ./install-sh -c
-INSTALL_DATA = ${INSTALL} -m 644
-
-
-#---------------------------------------------------------------------------#
-# For almost all systems, the command to create a library is "ar cq", but #
-# there is at least one where it is different, so this command must be #
-# configurable. However, I haven't got round to learning how to make #
-# "configure" find this out for itself. It is necessary to use a command #
-# such as "make AR='ar -rc'" if you need to vary this. The setting of AR is #
-# *not* passed over to ./ltconfig, because it does its own setting up. #
-#---------------------------------------------------------------------------#
-
-AR = ar cq
-
-
-##############################################################################
-
-
-OBJ = maketables.o get.o study.o pcre.o
-LOBJ = maketables.lo get.lo study.lo pcre.lo
-
-all: libtool libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest pcregrep
-
-libtool: config.guess config.sub ltconfig ltmain.sh
- @if test "$(LIBTOOL)" = "./libtool"; then \
- echo '--- Building libtool ---'; \
- CC=$(CC) CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)' ./ltconfig ./ltmain.sh; \
- echo '--- Built libtool ---'; fi
-
-pcregrep: libpcre.$(LIBSUFFIX) pcregrep.o
- @echo ' '
- @echo '--- Building pcregrep utility'
- @echo ' '
- $(LIBTOOL) $(CC) $(CFLAGS) -o pcregrep pcregrep.o libpcre.$(LIBSUFFIX)
-
-pcretest: libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest.o
- @echo ' '
- @echo '--- Building pcretest testing program'
- @echo ' '
- $(LIBTOOL) $(PURIFY) $(CC) $(CFLAGS) -o pcretest pcretest.o \
- libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX)
-
-libpcre.a: $(OBJ)
- @echo ' '
- @echo '--- Building static library: libpcre'
- @echo ' '
- -rm -f libpcre.a
- $(AR) libpcre.a $(OBJ)
- $(RANLIB) libpcre.a
-
-libpcre.la: $(OBJ)
- @echo ' '
- @echo '--- Building shared library: libpcre'
- @echo ' '
- -rm -f libpcre.la
- ./libtool $(CC) -version-info '$(PCRELIBVERSION)' -o libpcre.la -rpath $(LIBDIR) $(LOBJ)
-
-libpcreposix.a: pcreposix.o
- @echo ' '
- @echo '--- Building static library: libpcreposix'
- @echo ' '
- -rm -f libpcreposix.a
- $(AR) libpcreposix.a pcreposix.o
- $(RANLIB) libpcreposix.a
-
-libpcreposix.la: pcreposix.o
- @echo ' '
- @echo '--- Building shared library: libpcreposix'
- @echo ' '
- -rm -f libpcreposix.la
- ./libtool $(CC) -version-info '$(PCREPOSIXLIBVERSION)' -o libpcreposix.la -rpath $(LIBDIR) pcreposix.lo
-
-pcre.o: chartables.c pcre.c pcre.h internal.h config.h Makefile
- $(LIBTOOL) $(CC) -c $(CFLAGS) $(UTF8) pcre.c
-
-pcreposix.o: pcreposix.c pcreposix.h internal.h pcre.h config.h Makefile
- $(LIBTOOL) $(CC) -c $(CFLAGS) pcreposix.c
-
-maketables.o: maketables.c pcre.h internal.h config.h Makefile
- $(LIBTOOL) $(CC) -c $(CFLAGS) maketables.c
-
-get.o: get.c pcre.h internal.h config.h Makefile
- $(LIBTOOL) $(CC) -c $(CFLAGS) get.c
-
-study.o: study.c pcre.h internal.h config.h Makefile
- $(LIBTOOL) $(CC) -c $(CFLAGS) $(UTF8) study.c
-
-pcretest.o: pcretest.c pcre.h config.h Makefile
- $(CC) -c $(CFLAGS) $(UTF8) pcretest.c
-
-pcregrep.o: pcregrep.c pcre.h Makefile config.h
- $(CC) -c $(CFLAGS) $(UTF8) pcregrep.c
-
-# An auxiliary program makes the default character table source
-
-chartables.c: dftables
- ./dftables >chartables.c
-
-dftables: dftables.c maketables.c pcre.h internal.h config.h Makefile
- $(CC) -o dftables $(CFLAGS) dftables.c
-
-install: all
- $(LIBTOOL) $(INSTALL_DATA) libpcre.$(LIBSUFFIX) $(DESTDIR)/$(LIBDIR)/libpcre.$(LIBSUFFIX)
- $(LIBTOOL) $(INSTALL_DATA) libpcreposix.$(LIBSUFFIX) $(DESTDIR)/$(LIBDIR)/libpcreposix.$(LIBSUFFIX)
- $(INSTALL_DATA) pcre.h $(DESTDIR)/$(INCDIR)/pcre.h
- $(INSTALL_DATA) pcreposix.h $(DESTDIR)/$(INCDIR)/pcreposix.h
- $(INSTALL_DATA) doc/pcre.3 $(DESTDIR)/$(MANDIR)/man3/pcre.3
- $(INSTALL_DATA) doc/pcreposix.3 $(DESTDIR)/$(MANDIR)/man3/pcreposix.3
- $(INSTALL_DATA) doc/pcregrep.1 $(DESTDIR)/$(MANDIR)/man1/pcregrep.1
- @if test "$(LIBTOOL)" = "./libtool"; then \
- echo ' '; \
- echo '--- Rebuilding pcregrep to use installed shared library ---'; \
- echo $(CC) $(CFLAGS) -o pcregrep pcregrep.o -L$(DESTDIR)/$(LIBDIR) -lpcre; \
- $(CC) $(CFLAGS) -o pcregrep pcregrep.o -L$(DESTDIR)/$(LIBDIR) -lpcre; \
- echo '--- Rebuilding pcretest to use installed shared library ---'; \
- echo $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(DESTDIR)/$(LIBDIR) -lpcre -lpcreposix; \
- $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(DESTDIR)/$(LIBDIR) -lpcre -lpcreposix; \
- fi
- $(INSTALL) pcregrep $(DESTDIR)/$(BINDIR)/pcregrep
- $(INSTALL) pcre-config $(DESTDIR)/$(BINDIR)/pcre-config
-
-# We deliberately omit dftables and chartables.c from 'make clean'; once made
-# chartables.c shouldn't change, and if people have edited the tables by hand,
-# you don't want to throw them away.
-
-clean:; -rm -rf *.o *.lo *.a *.la .libs pcretest pcregrep testtry
-
-# But "make distclean" should get back to a virgin distribution
-
-distclean: clean
- -rm -f chartables.c libtool pcre-config pcre.h \
- Makefile config.h config.status config.log config.cache
-
-check: runtest
-
-test: runtest
-
-runtest: all
- ./RunTest
-
-######## MINGW32 ############### MINGW32 ############### MINGW32 #############
-
-# This addition for mingw32 was contributed by Paul Sokolovsky
-# <Paul.Sokolovsky@technologist.com>. I (PH) don't know anything about it!
-
-dll: _dll libpcre.dll.a pcregrep_d pcretest_d
-
-_dll:
- $(MAKE) CFLAGS=-DSTATIC pcre.dll
-
-pcre.dll: $(OBJ) pcreposix.o pcre.def
-libpcre.dll.a: pcre.def
-
-pcregrep_d: libpcre.dll.a pcregrep.o
- $(CC) $(CFLAGS) -L. -o pcregrep pcregrep.o -lpcre.dll
-
-pcretest_d: libpcre.dll.a pcretest.o
- $(PURIFY) $(CC) $(CFLAGS) -L. -o pcretest pcretest.o -lpcre.dll
-
-# End
+++ /dev/null
-#! /bin/sh
-
-# This file is generated by configure from RunTest.in. Make any changes
-# to that file.
-
-# Run PCRE tests
-
-cf=diff
-
-# Select which tests to run; if no selection, run all
-
-do1=no
-do2=no
-do3=no
-do4=no
-do5=no
-do6=no
-
-while [ $# -gt 0 ] ; do
- case $1 in
- 1) do1=yes;;
- 2) do2=yes;;
- 3) do3=yes;;
- 4) do4=yes;;
- 5) do5=yes;;
- 6) do6=yes;;
- *) echo "Unknown test number $1"; exit 1;;
- esac
- shift
-done
-
-if [ "@UTF8@" = "" ] ; then
- if [ $do5 = yes ] ; then
- echo "Can't run test 5 because UFT8 support is not configured"
- exit 1
- fi
- if [ $do6 = yes ] ; then
- echo "Can't run test 6 because UFT8 support is not configured"
- exit 1
- fi
-fi
-
-if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a\
- $do5 = no -a $do6 = no ] ; then
- do1=yes
- do2=yes
- do3=yes
- do4=yes
- if [ "@UTF8@" != "" ] ; then do5=yes; fi
- if [ "@UTF8@" != "" ] ; then do6=yes; fi
-fi
-
-# Primary test, Perl-compatible
-
-if [ $do1 = yes ] ; then
- echo "Testing main functionality (Perl compatible)"
- ./pcretest testdata/testinput1 testtry
- if [ $? = 0 ] ; then
- $cf testtry testdata/testoutput1
- if [ $? != 0 ] ; then exit 1; fi
- else exit 1
- fi
-fi
-
-# PCRE tests that are not Perl-compatible - API & error tests, mostly
-
-if [ $do2 = yes ] ; then
- echo "Testing API and error handling (not Perl compatible)"
- ./pcretest -i testdata/testinput2 testtry
- if [ $? = 0 ] ; then
- $cf testtry testdata/testoutput2
- if [ $? != 0 ] ; then exit 1; fi
- else exit 1
- fi
-fi
-
-# Additional Perl-compatible tests for Perl 5.005's new features
-
-if [ $do3 = yes ] ; then
- echo "Testing Perl 5.005 features (Perl 5.005 compatible)"
- ./pcretest testdata/testinput3 testtry
- if [ $? = 0 ] ; then
- $cf testtry testdata/testoutput3
- if [ $? != 0 ] ; then exit 1; fi
- else exit 1
- fi
-fi
-
-if [ $do1 = yes -a $do2 = yes -a $do3 = yes ] ; then
- echo " "
- echo "The three main tests all ran OK"
- echo " "
-fi
-
-# Locale-specific tests, provided the "fr" locale is available
-
-if [ $do4 = yes ] ; then
- locale -a | grep '^fr$' >/dev/null
- if [ $? -eq 0 ] ; then
- echo "Testing locale-specific features (using 'fr' locale)"
- ./pcretest testdata/testinput4 testtry
- if [ $? = 0 ] ; then
- $cf testtry testdata/testoutput4
- if [ $? != 0 ] ; then
- echo " "
- echo "Locale test did not run entirely successfully."
- echo "This usually means that there is a problem with the locale"
- echo "settings rather than a bug in PCRE."
- else
- echo "Locale test ran OK"
- fi
- echo " "
- else exit 1
- fi
- else
- echo "Cannot test locale-specific features - 'fr' locale not found,"
- echo "or the \"locale\" command is not available to check for it."
- echo " "
- fi
-fi
-
-# Additional tests for UTF8 support
-
-if [ $do5 = yes ] ; then
- echo "Testing experimental, incomplete UTF8 support (Perl compatible)"
- ./pcretest testdata/testinput5 testtry
- if [ $? = 0 ] ; then
- $cf testtry testdata/testoutput5
- if [ $? != 0 ] ; then exit 1; fi
- else exit 1
- fi
- echo "UTF8 test ran OK"
- echo " "
-fi
-
-if [ $do6 = yes ] ; then
- echo "Testing API and internals for UTF8 support (not Perl compatible)"
- ./pcretest testdata/testinput6 testtry
- if [ $? = 0 ] ; then
- $cf testtry testdata/testoutput6
- if [ $? != 0 ] ; then exit 1; fi
- else exit 1
- fi
- echo "UTF8 internals test ran OK"
- echo " "
-fi
-
-# End
+++ /dev/null
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
-# Free Software Foundation, Inc.
-#
-# 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>.
-# The master version of this file is at the FSF in /home/gd/gnu/lib.
-# Please send patches to <autoconf-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 system type (host/target name).
-#
-# Only a few systems have been added to this list; please add others
-# (but try to keep the structure clean).
-#
-
-# Use $HOST_CC if defined. $CC may point to a cross-compiler
-if test x"$CC_FOR_BUILD" = x; then
- if test x"$HOST_CC" != x; then
- CC_FOR_BUILD="$HOST_CC"
- else
- if test x"$CC" != x; then
- CC_FOR_BUILD="$CC"
- else
- CC_FOR_BUILD=cc
- fi
- fi
-fi
-
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 8/24/94.)
-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
-
-dummy=dummy-$$
-trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
- 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
- .globl main
- .ent main
-main:
- .frame \$30,0,\$26,0
- .prologue 0
- .long 0x47e03d80 # implver $0
- lda \$2,259
- .long 0x47e20c21 # amask $2,$1
- srl \$1,8,\$2
- sll \$2,2,\$2
- sll \$0,3,\$0
- addl \$1,\$0,\$0
- addl \$2,\$0,\$0
- ret \$31,(\$26),1
- .end main
-EOF
- $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
- if test "$?" = 0 ; then
- ./$dummy
- case "$?" in
- 7)
- UNAME_MACHINE="alpha"
- ;;
- 15)
- UNAME_MACHINE="alphaev5"
- ;;
- 14)
- UNAME_MACHINE="alphaev56"
- ;;
- 10)
- UNAME_MACHINE="alphapca56"
- ;;
- 16)
- UNAME_MACHINE="alphaev6"
- ;;
- 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-cbm-sysv4
- exit 0;;
- amiga:NetBSD:*:*)
- echo m68k-cbm-netbsd${UNAME_RELEASE}
- 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;;
- arm32:NetBSD:*:*)
- echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- exit 0 ;;
- SR2?01: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 ;;
- atari*:NetBSD:*:*)
- echo m68k-atari-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*:NetBSD:*:*)
- echo m68k-sun-netbsd${UNAME_RELEASE}
- exit 0 ;;
- sun3*:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mac68k:NetBSD:*:*)
- echo m68k-apple-netbsd${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 ;;
- macppc:NetBSD:*:*)
- echo powerpc-apple-netbsd${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
- 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
- $CC_FOR_BUILD $dummy.c -o $dummy \
- && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
- && rm $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- echo mips-mips-riscos${UNAME_RELEASE}
- 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 ;;
- *: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
- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $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:*:4)
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
- if /usr/sbin/lsattr -EHl ${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=4.${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 NetBSD 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:*:*)
- case "${UNAME_MACHINE}" in
- 9000/31? ) HP_ARCH=m68000 ;;
- 9000/[34]?? ) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- sed 's/^ //' << EOF >$dummy.c
- #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
- (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
- rm -f $dummy.c $dummy
- esac
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ${HP_ARCH}-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
- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $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:*:*)
- 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}
- 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/
- exit 0 ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE}
- exit 0 ;;
- CRAY*T3E:*:*:*)
- echo alpha-cray-unicosmk${UNAME_RELEASE}
- exit 0 ;;
- CRAY-2:*:*:*)
- echo cray2-cray-unicos
- exit 0 ;;
- F300:UNIX_System_V:*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit 0 ;;
- F301:UNIX_System_V:*:*)
- echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
- exit 0 ;;
- hp3[0-9][05]:NetBSD:*:*)
- echo m68k-hp-netbsd${UNAME_RELEASE}
- exit 0 ;;
- hp300:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- i?86:BSD/386:*:* | i?86:BSD/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:*:*)
- if test -x /usr/bin/objformat; then
- if test "elf" = "`/usr/bin/objformat`"; then
- echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
- exit 0
- fi
- fi
- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit 0 ;;
- *:NetBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-netbsd`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*: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 ;;
- *: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_help_string=`cd /; ld --help 2>&1`
- ld_supported_emulations=`echo $ld_help_string \
- | sed -ne '/supported emulations:/!d
- s/[ ][ ]*/ /g
- s/.*supported emulations: *//
- s/ .*//
- p'`
- case "$ld_supported_emulations" in
- *ia64)
- echo "${UNAME_MACHINE}-unknown-linux"
- exit 0
- ;;
- i?86linux)
- echo "${UNAME_MACHINE}-pc-linux-gnuaout"
- exit 0
- ;;
- i?86coff)
- echo "${UNAME_MACHINE}-pc-linux-gnucoff"
- exit 0
- ;;
- sparclinux)
- echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
- exit 0
- ;;
- armlinux)
- echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
- exit 0
- ;;
- elf32arm*)
- echo "${UNAME_MACHINE}-unknown-linux-gnu"
- exit 0
- ;;
- armelf_linux*)
- echo "${UNAME_MACHINE}-unknown-linux-gnu"
- exit 0
- ;;
- m68klinux)
- echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
- exit 0
- ;;
- elf32ppc)
- # Determine Lib Version
- cat >$dummy.c <<EOF
-#include <features.h>
-#if defined(__GLIBC__)
-extern char __libc_version[];
-extern char __libc_release[];
-#endif
-main(argc, argv)
- int argc;
- char *argv[];
-{
-#if defined(__GLIBC__)
- printf("%s %s\n", __libc_version, __libc_release);
-#else
- printf("unkown\n");
-#endif
- return 0;
-}
-EOF
- LIBC=""
- $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
- if test "$?" = 0 ; then
- ./$dummy | grep 1\.99 > /dev/null
- if test "$?" = 0 ; then
- LIBC="libc1"
- fi
- fi
- rm -f $dummy.c $dummy
- echo powerpc-unknown-linux-gnu${LIBC}
- exit 0
- ;;
- esac
-
- if test "${UNAME_MACHINE}" = "alpha" ; then
- sed 's/^ //' <<EOF >$dummy.s
- .globl main
- .ent main
- main:
- .frame \$30,0,\$26,0
- .prologue 0
- .long 0x47e03d80 # implver $0
- lda \$2,259
- .long 0x47e20c21 # amask $2,$1
- srl \$1,8,\$2
- sll \$2,2,\$2
- sll \$0,3,\$0
- addl \$1,\$0,\$0
- addl \$2,\$0,\$0
- ret \$31,(\$26),1
- .end main
-EOF
- LIBC=""
- $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
- if test "$?" = 0 ; then
- ./$dummy
- case "$?" in
- 7)
- UNAME_MACHINE="alpha"
- ;;
- 15)
- UNAME_MACHINE="alphaev5"
- ;;
- 14)
- UNAME_MACHINE="alphaev56"
- ;;
- 10)
- UNAME_MACHINE="alphapca56"
- ;;
- 16)
- UNAME_MACHINE="alphaev6"
- ;;
- esac
-
- objdump --private-headers $dummy | \
- grep ld.so.1 > /dev/null
- if test "$?" = 0 ; then
- LIBC="libc1"
- fi
- fi
- rm -f $dummy.s $dummy
- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
- elif test "${UNAME_MACHINE}" = "mips" ; then
- cat >$dummy.c <<EOF
-#ifdef __cplusplus
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __MIPSEB__
- printf ("%s-unknown-linux-gnu\n", argv[1]);
-#endif
-#ifdef __MIPSEL__
- printf ("%sel-unknown-linux-gnu\n", argv[1]);
-#endif
- return 0;
-}
-EOF
- $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- else
- # Either a pre-BFD a.out linker (linux-gnuoldld)
- # or one that does not give us useful --help.
- # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
- # If ld does not provide *any* "supported emulations:"
- # that means it is gnuoldld.
- echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
- test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
-
- case "${UNAME_MACHINE}" in
- i?86)
- VENDOR=pc;
- ;;
- *)
- VENDOR=unknown;
- ;;
- esac
- # Determine whether the default compiler is a.out or elf
- cat >$dummy.c <<EOF
-#include <features.h>
-#ifdef __cplusplus
- 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-${VENDOR}-linux-gnu\n", argv[1]);
-# else
- printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
-# endif
-# else
- printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
-# endif
-#else
- printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
-#endif
- return 0;
-}
-EOF
- $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- fi ;;
-# 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.
- i?86:DYNIX/ptx:4*:*)
- 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:7*)
- # Fixed at (any) Pentium or better
- UNAME_MACHINE=i586
- if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
- echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
- else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
- fi
- 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 ;;
- pc:*:*:*)
- # 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]??,*:*: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.*:*)
- 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]*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
- echo rs6000-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:CPunix: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 ;;
- 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 ;;
- *:QNX:*:4*)
- echo i386-qnx-qnx${UNAME_VERSION}
- 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)
- printf ("vax-dec-bsd\n"); exit (0);
-#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
-
-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $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
-
-#echo '(Unable to guess system type)' 1>&2
-
-exit 1
+++ /dev/null
-
-/* For Privoxy, we just use Privoxy's config.h */
-
-#include "../config.h"
-
+++ /dev/null
-
-/* On Unix systems config.in is converted by configure into config.h. PCRE is
-written in Standard C, but there are a few non-standard things it can cope
-with, allowing it to run on SunOS4 and other "close to standard" systems.
-
-On a non-Unix system you should just copy this file into config.h and change
-the definitions of HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because
-of the way autoconf works, these cannot be made the defaults. If your system
-has bcopy() and not memmove(), change the definition of HAVE_BCOPY instead of
-HAVE_MEMMOVE. If your system has neither bcopy() nor memmove(), leave them both
-as 0; an emulation function will be used. */
-
-/* Define to empty if the keyword does not work. */
-
-#undef const
-
-/* Define to `unsigned' if <stddef.h> doesn't define size_t. */
-
-#undef size_t
-
-/* The following two definitions are mainly for the benefit of SunOS4, which
-doesn't have the strerror() or memmove() functions that should be present in
-all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should
-normally be defined with the value 1 for other systems, but unfortunately we
-can't make this the default because "configure" files generated by autoconf
-will only change 0 to 1; they won't change 1 to 0 if the functions are not
-found. If HAVE_MEMMOVE is set to 1, the value of HAVE_BCOPY is not relevant. */
-
-#define HAVE_STRERROR 0
-#define HAVE_MEMMOVE 0
-#define HAVE_BCOPY 0
-
-/* End */
+++ /dev/null
-#! /bin/sh
-# Configuration validation subroutine script, version 1.1.
-# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
-# 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.
-
-# 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.
-
-if [ x$1 = x ]
-then
- echo Configuration name missing. 1>&2
- echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
- echo "or $0 ALIAS" 1>&2
- echo where ALIAS is a recognized configuration type. 1>&2
- exit 1
-fi
-
-# First pass through any local machine types.
-case $1 in
- *local*)
- echo $1
- exit 0
- ;;
- *)
- ;;
-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
- linux-gnu*)
- 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)
- os=
- basic_machine=$1
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- 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.
- tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
- | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
- | 580 | i960 | h8300 \
- | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
- | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
- | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
- | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
- | mips64orion | mips64orionel | mipstx39 | mipstx39el \
- | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
- | mips64vr5000 | miprs64vr5000el | mcore \
- | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
- | thumb | d10v | fr30)
- basic_machine=$basic_machine-unknown
- ;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
- ;;
-
- # 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[34567]86)
- 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.
- # FIXME: clean up the formatting here.
- vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
- | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
- | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
- | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
- | xmp-* | ymp-* \
- | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
- | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
- | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
- | clipper-* | orion-* \
- | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
- | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
- | mips64el-* | mips64orion-* | mips64orionel-* \
- | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
- | mipstx39-* | mipstx39el-* | mcore-* \
- | f301-* | armv*-* | t3e-* \
- | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
- | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* )
- ;;
- # 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-cbm
- ;;
- amigaos | amigados)
- basic_machine=m68k-cbm
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-cbm
- 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
- ;;
- [ctj]90-cray)
- basic_machine=c90-cray
- os=-unicos
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- 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
- ;;
- 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[34567]86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i[34567]86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i[34567]86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i[34567]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
- ;;
- i386-go32 | go32)
- basic_machine=i386-unknown
- os=-go32
- ;;
- i386-mingw32 | mingw32)
- basic_machine=i386-unknown
- os=-mingw32
- ;;
- i386-qnx | qnx)
- basic_machine=i386-qnx
- ;;
- 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
- ;;
- 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
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- msdos)
- basic_machine=i386-unknown
- 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
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- 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 | nexen)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2)
- basic_machine=i786-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexen-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-*)
- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=rs6000-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/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- 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
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- t3e)
- basic_machine=t3e-cray
- os=-unicos
- ;;
- 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
- ;;
- 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
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sparc | sparcv9)
- 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
- ;;
- *)
- 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* \
- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
- | -macos* | -mpw* | -magic* | -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
- ;;
- -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
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -qnx)
- os=-qnx4
- ;;
- -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)
- 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
- ;;
- 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
- ;;
- f301-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)
- vendor=atari
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
+++ /dev/null
-dnl Process this file with autoconf to produce a configure script.
-
-dnl This is required at the start; the name is the name of a file
-dnl it should be seeing, to verify it is in the same directory.
-
-AC_INIT(dftables.c)
-
-dnl Arrange to build config.h from config.in. Note that pcre.h is
-dnl built differently, as it is just a "substitution" file.
-dnl Manual says this macro should come right after AC_INIT.
-AC_CONFIG_HEADER(config.h:config.in)
-
-dnl Provide the current PCRE version information. Do not use numbers
-dnl with leading zeros for the minor version, as they end up in a C
-dnl macro, and may be treated as octal constants. Stick to single
-dnl digits for minor numbers less than 10. There are unlikely to be
-dnl that many releases anyway.
-
-PCRE_MAJOR=3
-PCRE_MINOR=4
-PCRE_DATE=22-Aug-2000
-PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
-
-dnl Provide versioning information for libtool shared libraries that
-dnl are built by default on Unix systems.
-
-PCRE_LIB_VERSION=0:1:0
-PCRE_POSIXLIB_VERSION=0:0:0
-
-dnl Checks for programs.
-
-AC_PROG_CC
-AC_PROG_RANLIB
-
-dnl Checks for header files.
-
-AC_HEADER_STDC
-AC_CHECK_HEADERS(limits.h)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-
-AC_C_CONST
-AC_TYPE_SIZE_T
-
-dnl Checks for library functions.
-
-AC_CHECK_FUNCS(bcopy memmove strerror)
-
-dnl Handle --enable-shared-libraries
-
-LIBTOOL=./libtool
-LIBSUFFIX=la
-AC_ARG_ENABLE(shared,
-[ --disable-shared build PCRE as a static library],
-if test "$enableval" = "no"; then
- LIBTOOL=
- LIBSUFFIX=a
-fi
-)
-
-dnl Handle --enable-utf8
-
-AC_ARG_ENABLE(utf8,
-[ --enable-utf8 enable UTF8 support (incomplete)],
-if test "$enableval" = "yes"; then
- UTF8=-DSUPPORT_UTF8
-fi
-)
-
-dnl "Export" these variables
-
-AC_SUBST(HAVE_MEMMOVE)
-AC_SUBST(HAVE_STRERROR)
-AC_SUBST(LIBTOOL)
-AC_SUBST(LIBSUFFIX)
-AC_SUBST(UTF8)
-AC_SUBST(PCRE_MAJOR)
-AC_SUBST(PCRE_MINOR)
-AC_SUBST(PCRE_DATE)
-AC_SUBST(PCRE_VERSION)
-AC_SUBST(PCRE_LIB_VERSION)
-AC_SUBST(PCRE_POSIXLIB_VERSION)
-
-dnl This must be last; it determines what files are written
-AC_OUTPUT(Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in,[chmod a+x RunTest pcre-config])
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/*
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
- Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-
-See the file Tech.Notes for some information on the internals.
-*/
-
-
-/* This is a support program to generate the file chartables.c, containing
-character tables of various kinds. They are built according to the default C
-locale and used as the default tables by PCRE. Now that pcre_maketables is
-a function visible to the outside world, we make use of its code from here in
-order to be consistent. */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "internal.h"
-
-#define DFTABLES /* maketables.c notices this */
-#include "maketables.c"
-
-
-int main(void)
-{
-int i;
-unsigned const char *tables = pcre_maketables();
-
-printf(
- "/*************************************************\n"
- "* Perl-Compatible Regular Expressions *\n"
- "*************************************************/\n\n"
- "/* This file is automatically written by the dftables auxiliary \n"
- "program. If you edit it by hand, you might like to edit the Makefile to \n"
- "prevent its ever being regenerated.\n\n"
- "This file is #included in the compilation of pcre.c to build the default\n"
- "character tables which are used when no tables are passed to the compile\n"
- "function. */\n\n"
- "static unsigned char pcre_default_tables[] = {\n\n"
- "/* This table is a lower casing table. */\n\n");
-
-printf(" ");
-for (i = 0; i < 256; i++)
- {
- if ((i & 7) == 0 && i != 0) printf("\n ");
- printf("%3d", *tables++);
- if (i != 255) printf(",");
- }
-printf(",\n\n");
-
-printf("/* This table is a case flipping table. */\n\n");
-
-printf(" ");
-for (i = 0; i < 256; i++)
- {
- if ((i & 7) == 0 && i != 0) printf("\n ");
- printf("%3d", *tables++);
- if (i != 255) printf(",");
- }
-printf(",\n\n");
-
-printf(
- "/* This table contains bit maps for various character classes.\n"
- "Each map is 32 bytes long and the bits run from the least\n"
- "significant end of each byte. The classes that have their own\n"
- "maps are: space, xdigit, digit, upper, lower, word, graph\n"
- "print, punct, and cntrl. Other classes are built from combinations. */\n\n");
-
-printf(" ");
-for (i = 0; i < cbit_length; i++)
- {
- if ((i & 7) == 0 && i != 0)
- {
- if ((i & 31) == 0) printf("\n");
- printf("\n ");
- }
- printf("0x%02x", *tables++);
- if (i != cbit_length - 1) printf(",");
- }
-printf(",\n\n");
-
-printf(
- "/* This table identifies various classes of character by individual bits:\n"
- " 0x%02x white space character\n"
- " 0x%02x letter\n"
- " 0x%02x decimal digit\n"
- " 0x%02x hexadecimal digit\n"
- " 0x%02x alphanumeric or '_'\n"
- " 0x%02x regular expression metacharacter or binary zero\n*/\n\n",
- ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,
- ctype_meta);
-
-printf(" ");
-for (i = 0; i < 256; i++)
- {
- if ((i & 7) == 0 && i != 0)
- {
- printf(" /* ");
- if (isprint(i-8)) printf(" %c -", i-8);
- else printf("%3d-", i-8);
- if (isprint(i-1)) printf(" %c ", i-1);
- else printf("%3d", i-1);
- printf(" */\n ");
- }
- printf("0x%02x", *tables++);
- if (i != 255) printf(",");
- }
-
-printf("};/* ");
-if (isprint(i-8)) printf(" %c -", i-8);
- else printf("%3d-", i-8);
-if (isprint(i-1)) printf(" %c ", i-1);
- else printf("%3d", i-1);
-printf(" */\n\n/* End of chartables.c */\n");
-
-return 0;
-}
-
-/* End of dftables.c */
+++ /dev/null
-# dll.mk - auxilary Makefile to easy build dll's for mingw32 target
-# ver. 0.6 of 1999-03-25
-#
-# Homepage of this makefile - http://www.is.lg.ua/~paul/devel/
-# Homepage of original mingw32 project -
-# http://www.fu.is.saga-u.ac.jp/~colin/gcc.html
-#
-# How to use:
-# This makefile can:
-# 1. Create automatical .def file from list of objects
-# 2. Create .dll from objects and .def file, either automatical, or your
-# hand-written (maybe) file, which must have same basename as dll
-# WARNING! There MUST be object, which name match dll's name. Make sux.
-# 3. Create import library from .def (as for .dll, only its name required,
-# not dll itself)
-# By convention implibs for dll have .dll.a suffix, e.g. libstuff.dll.a
-# Why not just libstuff.a? 'Cos that's name for static lib, ok?
-# Process divided into 3 phases because:
-# 1. Pre-existent .def possible
-# 2. Generating implib is enough time-consuming
-#
-# Variables:
-# DLL_LDLIBS - libs for linking dll
-# DLL_LDFLAGS - flags for linking dll
-#
-# By using $(DLL_SUFFIX) instead of 'dll', e.g. stuff.$(DLL_SUFFIX)
-# you may help porting makefiles to other platforms
-#
-# Put this file in your make's include path (e.g. main include dir, for
-# more information see include section in make doc). Put in the beginning
-# of your own Makefile line "include dll.mk". Specify dependences, e.g.:
-#
-# Do all stuff in one step
-# libstuff.dll.a: $(OBJECTS) stuff.def
-# stuff.def: $(OBJECTS)
-#
-# Steps separated, pre-provided .def, link with user32
-#
-# DLL_LDLIBS=-luser32
-# stuff.dll: $(OBJECTS)
-# libstuff.dll.a: $(OBJECTS)
-
-
-DLLWRAP=dllwrap
-DLLTOOL=dlltool
-
-DLL_SUFFIX=dll
-
-.SUFFIXES: .o .$(DLL_SUFFIX)
-
-_%.def: %.o
- $(DLLTOOL) --export-all --output-def $@ $^
-
-%.$(DLL_SUFFIX): %.o
- $(DLLWRAP) --dllname $(notdir $@) --driver-name $(CC) --def $*.def -o $@ $(filter %.o,$^) $(DLL_LDFLAGS) $(DLL_LDLIBS)
-
-lib%.$(DLL_SUFFIX).a:%.def
- $(DLLTOOL) --dllname $(notdir $*.dll) --def $< --output-lib $@
-
-# End
+++ /dev/null
-ChangeLog for PCRE
-------------------
-
-
-Version 3.4 22-Aug-00
----------------------
-
-1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *.
-
-2. Diagnose condition (?(0) as an error instead of crashing on matching.
-
-
-Version 3.3 01-Aug-00
----------------------
-
-1. If an octal character was given, but the value was greater than \377, it
-was not getting masked to the least significant bits, as documented. This could
-lead to crashes in some systems.
-
-2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats
-the hyphen as a literal. PCRE used to give an error; it now behaves like Perl.
-
-3. Added the functions pcre_free_substring() and pcre_free_substring_list().
-These just pass their arguments on to (pcre_free)(), but they are provided
-because some uses of PCRE bind it to non-C systems that can call its functions,
-but cannot call free() or pcre_free() directly.
-
-4. Add "make test" as a synonym for "make check". Corrected some comments in
-the Makefile.
-
-5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the
-Makefile.
-
-6. Changed the name of pgrep to pcregrep, because Solaris has introduced a
-command called pgrep for grepping around the active processes.
-
-7. Added the beginnings of support for UTF-8 character strings.
-
-8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and
-RANLIB to ./ltconfig so that they are used by libtool. I think these are all
-the relevant ones. (AR is not passed because ./ltconfig does its own figuring
-out for the ar command.)
-
-
-Version 3.2 12-May-00
----------------------
-
-This is purely a bug fixing release.
-
-1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
-of ZA. This was just one example of several cases that could provoke this bug,
-which was introduced by change 9 of version 2.00. The code for breaking
-infinite loops after an iteration that matches an empty string was't working
-correctly.
-
-2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
-when matched against abbab (for example). After matching an empty string, it
-wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
-caused it to match further down the string than it should.
-
-3. The code contained an inclusion of sys/types.h. It isn't clear why this
-was there because it doesn't seem to be needed, and it causes trouble on some
-systems, as it is not a Standard C header. It has been removed.
-
-4. Made 4 silly changes to the source to avoid stupid compiler warnings that
-were reported on the Macintosh. The changes were from
-
- while ((c = *(++ptr)) != 0 && c != '\n');
-to
- while ((c = *(++ptr)) != 0 && c != '\n') ;
-
-Totally extraordinary, but if that's what it takes...
-
-5. PCRE is being used in one environment where neither memmove() nor bcopy() is
-available. Added HAVE_BCOPY and an autoconf test for it; if neither
-HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
-assumes the way PCRE uses memmove() (always moving upwards).
-
-6. PCRE is being used in one environment where strchr() is not available. There
-was only one use in pcre.c, and writing it out to avoid strchr() probably gives
-faster code anyway.
-
-
-Version 3.1 09-Feb-00
----------------------
-
-The only change in this release is the fixing of some bugs in Makefile.in for
-the "install" target:
-
-(1) It was failing to install pcreposix.h.
-
-(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page.
-
-
-Version 3.0 01-Feb-00
----------------------
-
-1. Add support for the /+ modifier to perltest (to output $` like it does in
-pcretest).
-
-2. Add support for the /g modifier to perltest.
-
-3. Fix pcretest so that it behaves even more like Perl for /g when the pattern
-matches null strings.
-
-4. Fix perltest so that it doesn't do unwanted things when fed an empty
-pattern. Perl treats empty patterns specially - it reuses the most recent
-pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this
-effect.
-
-5. The POSIX interface was broken in that it was just handing over the POSIX
-captured string vector to pcre_exec(), but (since release 2.00) PCRE has
-required a bigger vector, with some working space on the end. This means that
-the POSIX wrapper now has to get and free some memory, and copy the results.
-
-6. Added some simple autoconf support, placing the test data and the
-documentation in separate directories, re-organizing some of the
-information files, and making it build pcre-config (a GNU standard). Also added
-libtool support for building PCRE as a shared library, which is now the
-default.
-
-7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and
-09 are not valid octal constants. Single digits will be used for minor values
-less than 10.
-
-8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that
-existing programs that set these in the POSIX interface can use PCRE without
-modification.
-
-9. Added a new function, pcre_fullinfo() with an extensible interface. It can
-return all that pcre_info() returns, plus additional data. The pcre_info()
-function is retained for compatibility, but is considered to be obsolete.
-
-10. Added experimental recursion feature (?R) to handle one common case that
-Perl 5.6 will be able to do with (?p{...}).
-
-11. Added support for POSIX character classes like [:alpha:], which Perl is
-adopting.
-
-
-Version 2.08 31-Aug-99
-----------------------
-
-1. When startoffset was not zero and the pattern began with ".*", PCRE was not
-trying to match at the startoffset position, but instead was moving forward to
-the next newline as if a previous match had failed.
-
-2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,
-and could get into a loop if a null string was matched other than at the start
-of the subject.
-
-3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can
-be distinguished at compile time, and for completeness also added PCRE_DATE.
-
-5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL
-in GnuWin32 environments.
-
-
-Version 2.07 29-Jul-99
-----------------------
-
-1. The documentation is now supplied in plain text form and HTML as well as in
-the form of man page sources.
-
-2. C++ compilers don't like assigning (void *) values to other pointer types.
-In particular this affects malloc(). Although there is no problem in Standard
-C, I've put in casts to keep C++ compilers happy.
-
-3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call
-should be (const char *).
-
-4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may
-be useful for non-Unix systems who don't want to bother with the POSIX stuff.
-However, I haven't made this a standard facility. The documentation doesn't
-mention it, and the Makefile doesn't support it.
-
-5. The Makefile now contains an "install" target, with editable destinations at
-the top of the file. The pcretest program is not installed.
-
-6. pgrep -V now gives the PCRE version number and date.
-
-7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was
-causing the entire string to be ignored, instead of just the last character.
-
-8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a
-non-matching string, it can take a very, very long time, even for strings of
-quite modest length, because of the nested recursion. PCRE now does better in
-some of these cases. It does this by remembering the last required literal
-character in the pattern, and pre-searching the subject to ensure it is present
-before running the real match. In other words, it applies a heuristic to detect
-some types of certain failure quickly, and in the above example, if presented
-with a string that has no trailing " it gives "no match" very quickly.
-
-9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;
-other alternatives are tried instead.
-
-
-Version 2.06 09-Jun-99
-----------------------
-
-1. Change pcretest's output for amount of store used to show just the code
-space, because the remainder (the data block) varies in size between 32-bit and
-64-bit systems.
-
-2. Added an extra argument to pcre_exec() to supply an offset in the subject to
-start matching at. This allows lookbehinds to work when searching for multiple
-occurrences in a string.
-
-3. Added additional options to pcretest for testing multiple occurrences:
-
- /+ outputs the rest of the string that follows a match
- /g loops for multiple occurrences, using the new startoffset argument
- /G loops for multiple occurrences by passing an incremented pointer
-
-4. PCRE wasn't doing the "first character" optimization for patterns starting
-with \b or \B, though it was doing it for other lookbehind assertions. That is,
-it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with
-the letter 'x'. On long subject strings, this gives a significant speed-up.
-
-
-Version 2.05 21-Apr-99
-----------------------
-
-1. Changed the type of magic_number from int to long int so that it works
-properly on 16-bit systems.
-
-2. Fixed a bug which caused patterns starting with .* not to work correctly
-when the subject string contained newline characters. PCRE was assuming
-anchoring for such patterns in all cases, which is not correct because .* will
-not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if
-DOTALL is set at top level; otherwise it knows that patterns starting with .*
-must be retried after every newline in the subject.
-
-
-Version 2.04 18-Feb-99
-----------------------
-
-1. For parenthesized subpatterns with repeats whose minimum was zero, the
-computation of the store needed to hold the pattern was incorrect (too large).
-If such patterns were nested a few deep, this could multiply and become a real
-problem.
-
-2. Added /M option to pcretest to show the memory requirement of a specific
-pattern. Made -m a synonym of -s (which does this globally) for compatibility.
-
-3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being
-compiled in such a way that the backtracking after subsequent failure was
-pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of
-((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size.
-
-
-Version 2.03 02-Feb-99
-----------------------
-
-1. Fixed typo and small mistake in man page.
-
-2. Added 4th condition (GPL supersedes if conflict) and created separate
-LICENCE file containing the conditions.
-
-3. Updated pcretest so that patterns such as /abc\/def/ work like they do in
-Perl, that is the internal \ allows the delimiter to be included in the
-pattern. Locked out the use of \ as a delimiter. If \ immediately follows
-the final delimiter, add \ to the end of the pattern (to test the error).
-
-4. Added the convenience functions for extracting substrings after a successful
-match. Updated pcretest to make it able to test these functions.
-
-
-Version 2.02 14-Jan-99
-----------------------
-
-1. Initialized the working variables associated with each extraction so that
-their saving and restoring doesn't refer to uninitialized store.
-
-2. Put dummy code into study.c in order to trick the optimizer of the IBM C
-compiler for OS/2 into generating correct code. Apparently IBM isn't going to
-fix the problem.
-
-3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution
-calls, and wasn't printing the correct value for compiling calls. Increased the
-default value of LOOPREPEAT, and the number of significant figures in the
-times.
-
-4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT.
-
-5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid
-a building problem on Windows NT with a FAT file system.
-
-
-Version 2.01 21-Oct-98
-----------------------
-
-1. Changed the API for pcre_compile() to allow for the provision of a pointer
-to character tables built by pcre_maketables() in the current locale. If NULL
-is passed, the default tables are used.
-
-
-Version 2.00 24-Sep-98
-----------------------
-
-1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable
-it any more.
-
-2. Allow quantification of (?>) groups, and make it work correctly.
-
-3. The first character computation wasn't working for (?>) groups.
-
-4. Correct the implementation of \Z (it is permitted to match on the \n at the
-end of the subject) and add 5.005's \z, which really does match only at the
-very end of the subject.
-
-5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater.
-
-6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and
-DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005
-localized options. All options to pcre_study() were also removed.
-
-7. Add other new features from 5.005:
-
- $(?<= positive lookbehind
- $(?<! negative lookbehind
- (?imsx-imsx) added the unsetting capability
- such a setting is global if at outer level; local otherwise
- (?imsx-imsx:) non-capturing groups with option setting
- (?(cond)re|re) conditional pattern matching
-
- A backreference to itself in a repeated group matches the previous
- captured string.
-
-8. General tidying up of studying (both automatic and via "study")
-consequential on the addition of new assertions.
-
-9. As in 5.005, unlimited repeated groups that could match an empty substring
-are no longer faulted at compile time. Instead, the loop is forcibly broken at
-runtime if any iteration does actually match an empty substring.
-
-10. Include the RunTest script in the distribution.
-
-11. Added tests from the Perl 5.005_02 distribution. This showed up a few
-discrepancies, some of which were old and were also with respect to 5.004. They
-have now been fixed.
-
-
-Version 1.09 28-Apr-98
-----------------------
-
-1. A negated single character class followed by a quantifier with a minimum
-value of one (e.g. [^x]{1,6} ) was not compiled correctly. This could lead to
-program crashes, or just wrong answers. This did not apply to negated classes
-containing more than one character, or to minima other than one.
-
-
-Version 1.08 27-Mar-98
-----------------------
-
-1. Add PCRE_UNGREEDY to invert the greediness of quantifiers.
-
-2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The
-latter must appear before anything that relies on it in the pattern.
-
-
-Version 1.07 16-Feb-98
-----------------------
-
-1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited
-repeat of a potentially empty string).
-
-
-Version 1.06 23-Jan-98
-----------------------
-
-1. Added Markus Oberhumer's little patches for C++.
-
-2. Literal strings longer than 255 characters were broken.
-
-
-Version 1.05 23-Dec-97
-----------------------
-
-1. Negated character classes containing more than one character were failing if
-PCRE_CASELESS was set at run time.
-
-
-Version 1.04 19-Dec-97
-----------------------
-
-1. Corrected the man page, where some "const" qualifiers had been omitted.
-
-2. Made debugging output print "{0,xxx}" instead of just "{,xxx}" to agree with
-input syntax.
-
-3. Fixed memory leak which occurred when a regex with back references was
-matched with an offsets vector that wasn't big enough. The temporary memory
-that is used in this case wasn't being freed if the match failed.
-
-4. Tidied pcretest to ensure it frees memory that it gets.
-
-5. Temporary memory was being obtained in the case where the passed offsets
-vector was exactly big enough.
-
-6. Corrected definition of offsetof() from change 5 below.
-
-7. I had screwed up change 6 below and broken the rules for the use of
-setjmp(). Now fixed.
-
-
-Version 1.03 18-Dec-97
-----------------------
-
-1. A erroneous regex with a missing opening parenthesis was correctly
-diagnosed, but PCRE attempted to access brastack[-1], which could cause crashes
-on some systems.
-
-2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because
-it was reported that one broken compiler failed on the former because "code" is
-also an independent variable.
-
-3. The erroneous regex a[]b caused an array overrun reference.
-
-4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not
-fail on data ending with that character. (It was going on too far, and checking
-the next character, typically a binary zero.) This was specific to the
-optimized code for single-character negative classes.
-
-5. Added a contributed patch from the TIN world which does the following:
-
- + Add an undef for memmove, in case the the system defines a macro for it.
-
- + Add a definition of offsetof(), in case there isn't one. (I don't know
- the reason behind this - offsetof() is part of the ANSI standard - but
- it does no harm).
-
- + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating
- most of the places where whitespace preceded '#'. I have given up and
- allowed the remaining 2 cases to be at the margin.
-
- + Rename some variables in pcre to eliminate shadowing. This seems very
- pedantic, but does no harm, of course.
-
-6. Moved the call to setjmp() into its own function, to get rid of warnings
-from gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used.
-
-7. Constructs such as \d{8,} were compiling into the equivalent of
-\d{8}\d{0,65527} instead of \d{8}\d* which didn't make much difference to the
-outcome, but in this particular case used more store than had been allocated,
-which caused the bug to be discovered because it threw up an internal error.
-
-8. The debugging code in both pcre and pcretest for outputting the compiled
-form of a regex was going wrong in the case of back references followed by
-curly-bracketed repeats.
-
-
-Version 1.02 12-Dec-97
-----------------------
-
-1. Typos in pcre.3 and comments in the source fixed.
-
-2. Applied a contributed patch to get rid of places where it used to remove
-'const' from variables, and fixed some signed/unsigned and uninitialized
-variable warnings.
-
-3. Added the "runtest" target to Makefile.
-
-4. Set default compiler flag to -O2 rather than just -O.
-
-
-Version 1.01 19-Nov-97
-----------------------
-
-1. PCRE was failing to diagnose unlimited repeat of empty string for patterns
-like /([ab]*)*/, that is, for classes with more than one character in them.
-
-2. Likewise, it wasn't diagnosing patterns with "once-only" subpatterns, such
-as /((?>a*))*/ (a PCRE_EXTRA facility).
-
-
-Version 1.00 18-Nov-97
-----------------------
-
-1. Added compile-time macros to support systems such as SunOS4 which don't have
-memmove() or strerror() but have other things that can be used instead.
-
-2. Arranged that "make clean" removes the executables.
-
-
-Version 0.99 27-Oct-97
-----------------------
-
-1. Fixed bug in code for optimizing classes with only one character. It was
-initializing a 32-byte map regardless, which could cause it to run off the end
-of the memory it had got.
-
-2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction.
-
-
-Version 0.98 22-Oct-97
-----------------------
-
-1. Fixed bug in code for handling temporary memory usage when there are more
-back references than supplied space in the ovector. This could cause segfaults.
-
-
-Version 0.97 21-Oct-97
-----------------------
-
-1. Added the \X "cut" facility, conditional on PCRE_EXTRA.
-
-2. Optimized negated single characters not to use a bit map.
-
-3. Brought error texts together as macro definitions; clarified some of them;
-fixed one that was wrong - it said "range out of order" when it meant "invalid
-escape sequence".
-
-4. Changed some char * arguments to const char *.
-
-5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX).
-
-6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in
-pcretest.
-
-
-Version 0.96 16-Oct-97
-----------------------
-
-1. Added a simple "pgrep" utility to the distribution.
-
-2. Fixed an incompatibility with Perl: "{" is now treated as a normal character
-unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}"
-where "ddd" means "one or more decimal digits".
-
-3. Fixed serious bug. If a pattern had a back reference, but the call to
-pcre_exec() didn't supply a large enough ovector to record the related
-identifying subpattern, the match always failed. PCRE now remembers the number
-of the largest back reference, and gets some temporary memory in which to save
-the offsets during matching if necessary, in order to ensure that
-backreferences always work.
-
-4. Increased the compatibility with Perl in a number of ways:
-
- (a) . no longer matches \n by default; an option PCRE_DOTALL is provided
- to request this handling. The option can be set at compile or exec time.
-
- (b) $ matches before a terminating newline by default; an option
- PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline
- mode). The option can be set at compile or exec time.
-
- (c) The handling of \ followed by a digit other than 0 is now supposed to be
- the same as Perl's. If the decimal number it represents is less than 10
- or there aren't that many previous left capturing parentheses, an octal
- escape is read. Inside a character class, it's always an octal escape,
- even if it is a single digit.
-
- (d) An escaped but undefined alphabetic character is taken as a literal,
- unless PCRE_EXTRA is set. Currently this just reserves the remaining
- escapes.
-
- (e) {0} is now permitted. (The previous item is removed from the compiled
- pattern).
-
-5. Changed all the names of code files so that the basic parts are no longer
-than 10 characters, and abolished the teeny "globals.c" file.
-
-6. Changed the handling of character classes; they are now done with a 32-byte
-bit map always.
-
-7. Added the -d and /D options to pcretest to make it possible to look at the
-internals of compilation without having to recompile pcre.
-
-
-Version 0.95 23-Sep-97
-----------------------
-
-1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or
-\x20 at the start of a run of normal characters. These were being treated as
-real characters, instead of the source characters being re-checked.
-
-
-Version 0.94 18-Sep-97
-----------------------
-
-1. The functions are now thread-safe, with the caveat that the global variables
-containing pointers to malloc() and free() or alternative functions are the
-same for all threads.
-
-2. Get pcre_study() to generate a bitmap of initial characters for non-
-anchored patterns when this is possible, and use it if passed to pcre_exec().
-
-
-Version 0.93 15-Sep-97
-----------------------
-
-1. /(b)|(:+)/ was computing an incorrect first character.
-
-2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(),
-but not actually doing anything yet.
-
-3. Treat "-" characters in classes that cannot be part of ranges as literals,
-as Perl does (e.g. [-az] or [az-]).
-
-4. Set the anchored flag if a branch starts with .* or .*? because that tests
-all possible positions.
-
-5. Split up into different modules to avoid including unneeded functions in a
-compiled binary. However, compile and exec are still in one module. The "study"
-function is split off.
-
-6. The character tables are now in a separate module whose source is generated
-by an auxiliary program - but can then be edited by hand if required. There are
-now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or
-toupper() in the code.
-
-7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and
-make them global. Abolish the function for setting them, as the caller can now
-set them directly.
-
-
-Version 0.92 11-Sep-97
-----------------------
-
-1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character
-(e.g. /a{1,3}/) was broken (I mis-optimized it).
-
-2. Caseless matching was not working in character classes if the characters in
-the pattern were in upper case.
-
-3. Make ranges like [W-c] work in the same way as Perl for caseless matching.
-
-4. Make PCRE_ANCHORED public and accept as a compile option.
-
-5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and
-PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to
-pass them.
-
-6. Give an error if bad option bits passed at compile or run time.
-
-7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to
-pcretest to cause it to pass that flag.
-
-8. Add pcre_info(), to get the number of identifying subpatterns, the stored
-options, and the first character, if set.
-
-9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character.
-
-
-Version 0.91 10-Sep-97
-----------------------
-
-1. PCRE was failing to diagnose unlimited repeats of subpatterns that could
-match the empty string as in /(a*)*/. It was looping and ultimately crashing.
-
-2. PCRE was looping on encountering an indefinitely repeated back reference to
-a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what
-Perl does - treats the match as successful.
-
-****
+++ /dev/null
-Compiling PCRE on non-Unix systems
-----------------------------------
-
-If you want to compile PCRE for a non-Unix system, note that it consists
-entirely of code written in Standard C, and so should compile successfully
-on any machine with a Standard C compiler and library, using normal compiling
-commands to do the following:
-
-(1) Copy or rename the file config.in as config.h, and change the macros that
-define HAVE_STRERROR and HAVE_MEMMOVE to define them as 1 rather than 0.
-Unfortunately, because of the way Unix autoconf works, the default setting has
-to be 0.
-
-(2) Copy or rename the file pcre.in as pcre.h, and change the macro definitions
-for PCRE_MAJOR, PCRE_MINOR, and PCRE_DATE near its start to the values set in
-configure.in.
-
-(3) Compile dftables.c as a stand-alone program, and then run it with
-the standard output sent to chartables.c. This generates a set of standard
-character tables.
-
-(4) Compile maketables.c, get.c, study.c and pcre.c and link them all
-together into an object library in whichever form your system keeps such
-libraries. This is the pcre library (chartables.c gets included by means of an
-#include directive).
-
-(5) Similarly, compile pcreposix.c and link it as the pcreposix library.
-
-(6) Compile the test program pcretest.c. This needs the functions in the
-pcre and pcreposix libraries when linking.
-
-(7) Run pcretest on the testinput files in the testdata directory, and check
-that the output matches the corresponding testoutput files. You must use the
--i option when checking testinput2.
-
-If you have a system without "configure" but where you can use a Makefile, edit
-Makefile.in to create Makefile, substituting suitable values for the variables
-at the head of the file.
-
-Some help in building a Win32 DLL of PCRE in GnuWin32 environments was
-contributed by Paul.Sokolovsky@technologist.com. These environments are
-Mingw32 (http://www.xraylith.wisc.edu/~khan/software/gnu-win32/) and
-CygWin (http://sourceware.cygnus.com/cygwin/). Paul comments:
-
- For CygWin, set CFLAGS=-mno-cygwin, and do 'make dll'. You'll get
- pcre.dll (containing pcreposix also), libpcre.dll.a, and dynamically
- linked pgrep and pcretest. If you have /bin/sh, run RunTest (three
- main test go ok, locale not supported).
-
-****
+++ /dev/null
-Technical Notes about PCRE
---------------------------
-
-Many years ago I implemented some regular expression functions to an algorithm
-suggested by Martin Richards. These were not Unix-like in form, and were quite
-restricted in what they could do by comparison with Perl. The interesting part
-about the algorithm was that the amount of space required to hold the compiled
-form of an expression was known in advance. The code to apply an expression did
-not operate by backtracking, as the Henry Spencer and Perl code does, but
-instead checked all possibilities simultaneously by keeping a list of current
-states and checking all of them as it advanced through the subject string. (In
-the terminology of Jeffrey Friedl's book, it was a "DFA algorithm".) When the
-pattern was all used up, all remaining states were possible matches, and the
-one matching the longest subset of the subject string was chosen. This did not
-necessarily maximize the individual wild portions of the pattern, as is
-expected in Unix and Perl-style regular expressions.
-
-By contrast, the code originally written by Henry Spencer and subsequently
-heavily modified for Perl actually compiles the expression twice: once in a
-dummy mode in order to find out how much store will be needed, and then for
-real. The execution function operates by backtracking and maximizing (or,
-optionally, minimizing in Perl) the amount of the subject that matches
-individual wild portions of the pattern. This is an "NFA algorithm" in Friedl's
-terminology.
-
-For the set of functions that forms PCRE (which are unrelated to those
-mentioned above), I tried at first to invent an algorithm that used an amount
-of store bounded by a multiple of the number of characters in the pattern, to
-save on compiling time. However, because of the greater complexity in Perl
-regular expressions, I couldn't do this. In any case, a first pass through the
-pattern is needed, in order to find internal flag settings like (?i) at top
-level. So PCRE works by running a very degenerate first pass to calculate a
-maximum store size, and then a second pass to do the real compile - which may
-use a bit less than the predicted amount of store. The idea is that this is
-going to turn out faster because the first pass is degenerate and the second
-pass can just store stuff straight into the vector. It does make the compiling
-functions bigger, of course, but they have got quite big anyway to handle all
-the Perl stuff.
-
-The compiled form of a pattern is a vector of bytes, containing items of
-variable length. The first byte in an item is an opcode, and the length of the
-item is either implicit in the opcode or contained in the data bytes which
-follow it. A list of all the opcodes follows:
-
-Opcodes with no following data
-------------------------------
-
-These items are all just one byte long
-
- OP_END end of pattern
- OP_ANY match any character
- OP_SOD match start of data: \A
- OP_CIRC ^ (start of data, or after \n in multiline)
- OP_NOT_WORD_BOUNDARY \W
- OP_WORD_BOUNDARY \w
- OP_NOT_DIGIT \D
- OP_DIGIT \d
- OP_NOT_WHITESPACE \S
- OP_WHITESPACE \s
- OP_NOT_WORDCHAR \W
- OP_WORDCHAR \w
- OP_EODN match end of data or \n at end: \Z
- OP_EOD match end of data: \z
- OP_DOLL $ (end of data, or before \n in multiline)
- OP_RECURSE match the pattern recursively
-
-
-Repeating single characters
----------------------------
-
-The common repeats (*, +, ?) when applied to a single character appear as
-two-byte items using the following opcodes:
-
- OP_STAR
- OP_MINSTAR
- OP_PLUS
- OP_MINPLUS
- OP_QUERY
- OP_MINQUERY
-
-Those with "MIN" in their name are the minimizing versions. Each is followed by
-the character that is to be repeated. Other repeats make use of
-
- OP_UPTO
- OP_MINUPTO
- OP_EXACT
-
-which are followed by a two-byte count (most significant first) and the
-repeated character. OP_UPTO matches from 0 to the given number. A repeat with a
-non-zero minimum and a fixed maximum is coded as an OP_EXACT followed by an
-OP_UPTO (or OP_MINUPTO).
-
-
-Repeating character types
--------------------------
-
-Repeats of things like \d are done exactly as for single characters, except
-that instead of a character, the opcode for the type is stored in the data
-byte. The opcodes are:
-
- OP_TYPESTAR
- OP_TYPEMINSTAR
- OP_TYPEPLUS
- OP_TYPEMINPLUS
- OP_TYPEQUERY
- OP_TYPEMINQUERY
- OP_TYPEUPTO
- OP_TYPEMINUPTO
- OP_TYPEEXACT
-
-
-Matching a character string
----------------------------
-
-The OP_CHARS opcode is followed by a one-byte count and then that number of
-characters. If there are more than 255 characters in sequence, successive
-instances of OP_CHARS are used.
-
-
-Character classes
------------------
-
-OP_CLASS is used for a character class, provided there are at least two
-characters in the class. If there is only one character, OP_CHARS is used for a
-positive class, and OP_NOT for a negative one (that is, for something like
-[^a]). Another set of repeating opcodes (OP_NOTSTAR etc.) are used for a
-repeated, negated, single-character class. The normal ones (OP_STAR etc.) are
-used for a repeated positive single-character class.
-
-OP_CLASS is followed by a 32-byte bit map containing a 1 bit for every
-character that is acceptable. The bits are counted from the least significant
-end of each byte.
-
-
-Back references
----------------
-
-OP_REF is followed by a single byte containing the reference number.
-
-
-Repeating character classes and back references
------------------------------------------------
-
-Single-character classes are handled specially (see above). This applies to
-OP_CLASS and OP_REF. In both cases, the repeat information follows the base
-item. The matching code looks at the following opcode to see if it is one of
-
- OP_CRSTAR
- OP_CRMINSTAR
- OP_CRPLUS
- OP_CRMINPLUS
- OP_CRQUERY
- OP_CRMINQUERY
- OP_CRRANGE
- OP_CRMINRANGE
-
-All but the last two are just single-byte items. The others are followed by
-four bytes of data, comprising the minimum and maximum repeat counts.
-
-
-Brackets and alternation
-------------------------
-
-A pair of non-capturing (round) brackets is wrapped round each expression at
-compile time, so alternation always happens in the context of brackets.
-Non-capturing brackets use the opcode OP_BRA, while capturing brackets use
-OP_BRA+1, OP_BRA+2, etc. [Note for North Americans: "bracket" to some English
-speakers, including myself, can be round, square, curly, or pointy. Hence this
-usage.]
-
-A bracket opcode is followed by two bytes which give the offset to the next
-alternative OP_ALT or, if there aren't any branches, to the matching KET
-opcode. Each OP_ALT is followed by two bytes giving the offset to the next one,
-or to the KET opcode.
-
-OP_KET is used for subpatterns that do not repeat indefinitely, while
-OP_KETRMIN and OP_KETRMAX are used for indefinite repetitions, minimally or
-maximally respectively. All three are followed by two bytes giving (as a
-positive number) the offset back to the matching BRA opcode.
-
-If a subpattern is quantified such that it is permitted to match zero times, it
-is preceded by one of OP_BRAZERO or OP_BRAMINZERO. These are single-byte
-opcodes which tell the matcher that skipping this subpattern entirely is a
-valid branch.
-
-A subpattern with an indefinite maximum repetition is replicated in the
-compiled data its minimum number of times (or once with a BRAZERO if the
-minimum is zero), with the final copy terminating with a KETRMIN or KETRMAX as
-appropriate.
-
-A subpattern with a bounded maximum repetition is replicated in a nested
-fashion up to the maximum number of times, with BRAZERO or BRAMINZERO before
-each replication after the minimum, so that, for example, (abc){2,5} is
-compiled as (abc)(abc)((abc)((abc)(abc)?)?)?. The 200-bracket limit does not
-apply to these internally generated brackets.
-
-
-Assertions
-----------
-
-Forward assertions are just like other subpatterns, but starting with one of
-the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes
-OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion
-is OP_REVERSE, followed by a two byte count of the number of characters to move
-back the pointer in the subject string. When operating in UTF-8 mode, the count
-is a character count rather than a byte count. A separate count is present in
-each alternative of a lookbehind assertion, allowing them to have different
-fixed lengths.
-
-
-Once-only subpatterns
----------------------
-
-These are also just like other subpatterns, but they start with the opcode
-OP_ONCE.
-
-
-Conditional subpatterns
------------------------
-
-These are like other subpatterns, but they start with the opcode OP_COND. If
-the condition is a back reference, this is stored at the start of the
-subpattern using the opcode OP_CREF followed by one byte containing the
-reference number. Otherwise, a conditional subpattern will always start with
-one of the assertions.
-
-
-Changing options
-----------------
-
-If any of the /i, /m, or /s options are changed within a parenthesized group,
-an OP_OPT opcode is compiled, followed by one byte containing the new settings
-of these flags. If there are several alternatives in a group, there is an
-occurrence of OP_OPT at the start of all those following the first options
-change, to set appropriate options for the start of the alternative.
-Immediately after the end of the group there is another such item to reset the
-flags to their previous values. Other changes of flag within the pattern can be
-handled entirely at compile time, and so do not cause anything to be put into
-the compiled data.
-
-
-Philip Hazel
-August 2000
+++ /dev/null
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-University of Cambridge Computing Service,
-Cambridge, England. Phone: +44 1223 334714.
-
-Copyright (c) 1997-2000 University of Cambridge
+++ /dev/null
-PCRE LICENCE
-------------
-
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-University of Cambridge Computing Service,
-Cambridge, England. Phone: +44 1223 334714.
-
-Copyright (c) 1997-2000 University of Cambridge
-
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission. In practice, this means that if you use
- PCRE in software which you distribute to others, commercially or
- otherwise, you must put a sentence like this
-
- Regular expression support is provided by the PCRE library package,
- which is open source software, written by Philip Hazel, and copyright
- by the University of Cambridge, England.
-
- somewhere reasonably visible in your documentation and in any relevant
- files or online help data or similar. A reference to the ftp site for
- the source, that is, to
-
- ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-
- should also be given in the documentation.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
-
-End
+++ /dev/null
-News about PCRE releases
-------------------------
-
-Release 3.3 01-Aug-00
----------------------
-
-There is some support for UTF-8 character strings. This is incomplete and
-experimental. The documentation describes what is and what is not implemented.
-Otherwise, this is just a bug-fixing release.
-
-
-Release 3.0 01-Feb-00
----------------------
-
-1. A "configure" script is now used to configure PCRE for Unix systems. It
-builds a Makefile, a config.h file, and the pcre-config script.
-
-2. PCRE is built as a shared library by default.
-
-3. There is support for POSIX classes such as [:alpha:].
-
-5. There is an experimental recursion feature.
-
-----------------------------------------------------------------------------
- IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00
-
-Please note that there has been a change in the API such that a larger
-ovector is required at matching time, to provide some additional workspace.
-The new man page has details. This change was necessary in order to support
-some of the new functionality in Perl 5.005.
-
- IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00
-
-Another (I hope this is the last!) change has been made to the API for the
-pcre_compile() function. An additional argument has been added to make it
-possible to pass over a pointer to character tables built in the current
-locale by pcre_maketables(). To use the default tables, this new arguement
-should be passed as NULL.
-
- IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05
-
-Yet another (and again I hope this really is the last) change has been made
-to the API for the pcre_exec() function. An additional argument has been
-added to make it possible to start the match other than at the start of the
-subject string. This is important if there are lookbehinds. The new man
-page has the details, but you just want to convert existing programs, all
-you need to do is to stick in a new fifth argument to pcre_exec(), with a
-value of zero. For example, change
-
- pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)
-to
- pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)
-
-****
+++ /dev/null
-.TH PCRE 3\r
-.SH NAME\r
-pcre - Perl-compatible regular expressions.\r
-.SH SYNOPSIS\r
-.B #include <pcre.h>\r
-.PP\r
-.SM\r
-.br\r
-.B pcre *pcre_compile(const char *\fIpattern\fR, int \fIoptions\fR,\r
-.ti +5n\r
-.B const char **\fIerrptr\fR, int *\fIerroffset\fR,\r
-.ti +5n\r
-.B const unsigned char *\fItableptr\fR);\r
-.PP\r
-.br\r
-.B pcre_extra *pcre_study(const pcre *\fIcode\fR, int \fIoptions\fR,\r
-.ti +5n\r
-.B const char **\fIerrptr\fR);\r
-.PP\r
-.br\r
-.B int pcre_exec(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR,"\r
-.ti +5n\r
-.B "const char *\fIsubject\fR," int \fIlength\fR, int \fIstartoffset\fR,\r
-.ti +5n\r
-.B int \fIoptions\fR, int *\fIovector\fR, int \fIovecsize\fR);\r
-.PP\r
-.br\r
-.B int pcre_copy_substring(const char *\fIsubject\fR, int *\fIovector\fR,\r
-.ti +5n\r
-.B int \fIstringcount\fR, int \fIstringnumber\fR, char *\fIbuffer\fR,\r
-.ti +5n\r
-.B int \fIbuffersize\fR);\r
-.PP\r
-.br\r
-.B int pcre_get_substring(const char *\fIsubject\fR, int *\fIovector\fR,\r
-.ti +5n\r
-.B int \fIstringcount\fR, int \fIstringnumber\fR,\r
-.ti +5n\r
-.B const char **\fIstringptr\fR);\r
-.PP\r
-.br\r
-.B int pcre_get_substring_list(const char *\fIsubject\fR,\r
-.ti +5n\r
-.B int *\fIovector\fR, int \fIstringcount\fR, "const char ***\fIlistptr\fR);"\r
-.PP\r
-.br\r
-.B void pcre_free_substring(const char *\fIstringptr\fR);\r
-.PP\r
-.br\r
-.B void pcre_free_substring_list(const char **\fIstringptr\fR);\r
-.PP\r
-.br\r
-.B const unsigned char *pcre_maketables(void);\r
-.PP\r
-.br\r
-.B int pcre_fullinfo(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR,"\r
-.ti +5n\r
-.B int \fIwhat\fR, void *\fIwhere\fR);\r
-.PP\r
-.br\r
-.B int pcre_info(const pcre *\fIcode\fR, int *\fIoptptr\fR, int\r
-.B *\fIfirstcharptr\fR);\r
-.PP\r
-.br\r
-.B char *pcre_version(void);\r
-.PP\r
-.br\r
-.B void *(*pcre_malloc)(size_t);\r
-.PP\r
-.br\r
-.B void (*pcre_free)(void *);\r
-\r
-\r
-\r
-.SH DESCRIPTION\r
-The PCRE library is a set of functions that implement regular expression\r
-pattern matching using the same syntax and semantics as Perl 5, with just a few\r
-differences (see below). The current implementation corresponds to Perl 5.005,\r
-with some additional features from later versions. This includes some\r
-experimental, incomplete support for UTF-8 encoded strings. Details of exactly\r
-what is and what is not supported are given below.\r
-\r
-PCRE has its own native API, which is described in this document. There is also\r
-a set of wrapper functions that correspond to the POSIX regular expression API.\r
-These are described in the \fBpcreposix\fR documentation.\r
-\r
-The native API function prototypes are defined in the header file \fBpcre.h\fR,\r
-and on Unix systems the library itself is called \fBlibpcre.a\fR, so can be\r
-accessed by adding \fB-lpcre\fR to the command for linking an application which\r
-calls it. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to\r
-contain the major and minor release numbers for the library. Applications can\r
-use these to include support for different releases.\r
-\r
-The functions \fBpcre_compile()\fR, \fBpcre_study()\fR, and \fBpcre_exec()\fR\r
-are used for compiling and matching regular expressions.\r
-\r
-The functions \fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and\r
-\fBpcre_get_substring_list()\fR are convenience functions for extracting\r
-captured substrings from a matched subject string; \fBpcre_free_substring()\fR\r
-and \fBpcre_free_substring_list()\fR are also provided, to free the memory used\r
-for extracted strings.\r
-\r
-The function \fBpcre_maketables()\fR is used (optionally) to build a set of\r
-character tables in the current locale for passing to \fBpcre_compile()\fR.\r
-\r
-The function \fBpcre_fullinfo()\fR is used to find out information about a\r
-compiled pattern; \fBpcre_info()\fR is an obsolete version which returns only\r
-some of the available information, but is retained for backwards compatibility.\r
-The function \fBpcre_version()\fR returns a pointer to a string containing the\r
-version of PCRE and its date of release.\r
-\r
-The global variables \fBpcre_malloc\fR and \fBpcre_free\fR initially contain\r
-the entry points of the standard \fBmalloc()\fR and \fBfree()\fR functions\r
-respectively. PCRE calls the memory management functions via these variables,\r
-so a calling program can replace them if it wishes to intercept the calls. This\r
-should be done before calling any PCRE functions.\r
-\r
-\r
-.SH MULTI-THREADING\r
-The PCRE functions can be used in multi-threading applications, with the\r
-proviso that the memory management functions pointed to by \fBpcre_malloc\fR\r
-and \fBpcre_free\fR are shared by all threads.\r
-\r
-The compiled form of a regular expression is not altered during matching, so\r
-the same compiled pattern can safely be used by several threads at once.\r
-\r
-\r
-.SH COMPILING A PATTERN\r
-The function \fBpcre_compile()\fR is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument \fIpattern\fR. A pointer to a single block of memory\r
-that is obtained via \fBpcre_malloc\fR is returned. This contains the\r
-compiled code and related data. The \fBpcre\fR type is defined for this for\r
-convenience, but in fact \fBpcre\fR is just a typedef for \fBvoid\fR, since the\r
-contents of the block are not externally defined. It is up to the caller to\r
-free the memory when it is no longer required.\r
-.PP\r
-The size of a compiled pattern is roughly proportional to the length of the\r
-pattern string, except that each character class (other than those containing\r
-just a single character, negated or not) requires 33 bytes, and repeat\r
-quantifiers with a minimum greater than one or a bounded maximum cause the\r
-relevant portions of the compiled pattern to be replicated.\r
-.PP\r
-The \fIoptions\fR argument contains independent bits that affect the\r
-compilation. It should be zero if no options are required. Some of the options,\r
-in particular, those that are compatible with Perl, can also be set and unset\r
-from within the pattern (see the detailed description of regular expressions\r
-below). For these options, the contents of the \fIoptions\fR argument specifies\r
-their initial settings at the start of compilation and execution. The\r
-PCRE_ANCHORED option can be set at the time of matching as well as at compile\r
-time.\r
-.PP\r
-If \fIerrptr\fR is NULL, \fBpcre_compile()\fR returns NULL immediately.\r
-Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fR returns\r
-NULL, and sets the variable pointed to by \fIerrptr\fR to point to a textual\r
-error message. The offset from the start of the pattern to the character where\r
-the error was discovered is placed in the variable pointed to by\r
-\fIerroffset\fR, which must not be NULL. If it is, an immediate error is given.\r
-.PP\r
-If the final argument, \fItableptr\fR, is NULL, PCRE uses a default set of\r
-character tables which are built when it is compiled, using the default C\r
-locale. Otherwise, \fItableptr\fR must be the result of a call to\r
-\fBpcre_maketables()\fR. See the section on locale support below.\r
-.PP\r
-The following option bits are defined in the header file:\r
-\r
- PCRE_ANCHORED\r
-\r
-If this bit is set, the pattern is forced to be "anchored", that is, it is\r
-constrained to match only at the start of the string which is being searched\r
-(the "subject string"). This effect can also be achieved by appropriate\r
-constructs in the pattern itself, which is the only way to do it in Perl.\r
-\r
- PCRE_CASELESS\r
-\r
-If this bit is set, letters in the pattern match both upper and lower case\r
-letters. It is equivalent to Perl's /i option.\r
-\r
- PCRE_DOLLAR_ENDONLY\r
-\r
-If this bit is set, a dollar metacharacter in the pattern matches only at the\r
-end of the subject string. Without this option, a dollar also matches\r
-immediately before the final character if it is a newline (but not before any\r
-other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is\r
-set. There is no equivalent to this option in Perl.\r
-\r
- PCRE_DOTALL\r
-\r
-If this bit is set, a dot metacharater in the pattern matches all characters,\r
-including newlines. Without it, newlines are excluded. This option is\r
-equivalent to Perl's /s option. A negative class such as [^a] always matches a\r
-newline character, independent of the setting of this option.\r
-\r
- PCRE_EXTENDED\r
-\r
-If this bit is set, whitespace data characters in the pattern are totally\r
-ignored except when escaped or inside a character class, and characters between\r
-an unescaped # outside a character class and the next newline character,\r
-inclusive, are also ignored. This is equivalent to Perl's /x option, and makes\r
-it possible to include comments inside complicated patterns. Note, however,\r
-that this applies only to data characters. Whitespace characters may never\r
-appear within special character sequences in a pattern, for example within the\r
-sequence (?( which introduces a conditional subpattern.\r
-\r
- PCRE_EXTRA\r
-\r
-This option was invented in order to turn on additional functionality of PCRE\r
-that is incompatible with Perl, but it is currently of very little use. When\r
-set, any backslash in a pattern that is followed by a letter that has no\r
-special meaning causes an error, thus reserving these combinations for future\r
-expansion. By default, as in Perl, a backslash followed by a letter with no\r
-special meaning is treated as a literal. There are at present no other features\r
-controlled by this option. It can also be set by a (?X) option setting within a\r
-pattern.\r
-\r
- PCRE_MULTILINE\r
-\r
-By default, PCRE treats the subject string as consisting of a single "line" of\r
-characters (even if it actually contains several newlines). The "start of line"\r
-metacharacter (^) matches only at the start of the string, while the "end of\r
-line" metacharacter ($) matches only at the end of the string, or before a\r
-terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as\r
-Perl.\r
-\r
-When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs\r
-match immediately following or immediately before any newline in the subject\r
-string, respectively, as well as at the very start and end. This is equivalent\r
-to Perl's /m option. If there are no "\\n" characters in a subject string, or\r
-no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no\r
-effect.\r
-\r
- PCRE_UNGREEDY\r
-\r
-This option inverts the "greediness" of the quantifiers so that they are not\r
-greedy by default, but become greedy if followed by "?". It is not compatible\r
-with Perl. It can also be set by a (?U) option setting within the pattern.\r
-\r
- PCRE_UTF8\r
-\r
-This option causes PCRE to regard both the pattern and the subject as strings\r
-of UTF-8 characters instead of just byte strings. However, it is available only\r
-if PCRE has been built to include UTF-8 support. If not, the use of this option\r
-provokes an error. Support for UTF-8 is new, experimental, and incomplete.\r
-Details of exactly what it entails are given below.\r
-\r
-\r
-.SH STUDYING A PATTERN\r
-When a pattern is going to be used several times, it is worth spending more\r
-time analyzing it in order to speed up the time taken for matching. The\r
-function \fBpcre_study()\fR takes a pointer to a compiled pattern as its first\r
-argument, and returns a pointer to a \fBpcre_extra\fR block (another \fBvoid\fR\r
-typedef) containing additional information about the pattern; this can be\r
-passed to \fBpcre_exec()\fR. If no additional information is available, NULL\r
-is returned.\r
-\r
-The second argument contains option bits. At present, no options are defined\r
-for \fBpcre_study()\fR, and this argument should always be zero.\r
-\r
-The third argument for \fBpcre_study()\fR is a pointer to an error message. If\r
-studying succeeds (even if no data is returned), the variable it points to is\r
-set to NULL. Otherwise it points to a textual error message.\r
-\r
-At present, studying a pattern is useful only for non-anchored patterns that do\r
-not have a single fixed starting character. A bitmap of possible starting\r
-characters is created.\r
-\r
-\r
-.SH LOCALE SUPPORT\r
-PCRE handles caseless matching, and determines whether characters are letters,\r
-digits, or whatever, by reference to a set of tables. The library contains a\r
-default set of tables which is created in the default C locale when PCRE is\r
-compiled. This is used when the final argument of \fBpcre_compile()\fR is NULL,\r
-and is sufficient for many applications.\r
-\r
-An alternative set of tables can, however, be supplied. Such tables are built\r
-by calling the \fBpcre_maketables()\fR function, which has no arguments, in the\r
-relevant locale. The result can then be passed to \fBpcre_compile()\fR as often\r
-as necessary. For example, to build and use tables that are appropriate for the\r
-French locale (where accented characters with codes greater than 128 are\r
-treated as letters), the following code could be used:\r
-\r
- setlocale(LC_CTYPE, "fr");\r
- tables = pcre_maketables();\r
- re = pcre_compile(..., tables);\r
-\r
-The tables are built in memory that is obtained via \fBpcre_malloc\fR. The\r
-pointer that is passed to \fBpcre_compile\fR is saved with the compiled\r
-pattern, and the same tables are used via this pointer by \fBpcre_study()\fR\r
-and \fBpcre_exec()\fR. Thus for any single pattern, compilation, studying and\r
-matching all happen in the same locale, but different patterns can be compiled\r
-in different locales. It is the caller's responsibility to ensure that the\r
-memory containing the tables remains available for as long as it is needed.\r
-\r
-\r
-.SH INFORMATION ABOUT A PATTERN\r
-The \fBpcre_fullinfo()\fR function returns information about a compiled\r
-pattern. It replaces the obsolete \fBpcre_info()\fR function, which is\r
-nevertheless retained for backwards compability (and is documented below).\r
-\r
-The first argument for \fBpcre_fullinfo()\fR is a pointer to the compiled\r
-pattern. The second argument is the result of \fBpcre_study()\fR, or NULL if\r
-the pattern was not studied. The third argument specifies which piece of\r
-information is required, while the fourth argument is a pointer to a variable\r
-to receive the data. The yield of the function is zero for success, or one of\r
-the following negative numbers:\r
-\r
- PCRE_ERROR_NULL the argument \fIcode\fR was NULL\r
- the argument \fIwhere\fR was NULL\r
- PCRE_ERROR_BADMAGIC the "magic number" was not found\r
- PCRE_ERROR_BADOPTION the value of \fIwhat\fR was invalid\r
-\r
-The possible values for the third argument are defined in \fBpcre.h\fR, and are\r
-as follows:\r
-\r
- PCRE_INFO_OPTIONS\r
-\r
-Return a copy of the options with which the pattern was compiled. The fourth\r
-argument should point to au \fBunsigned long int\fR variable. These option bits\r
-are those specified in the call to \fBpcre_compile()\fR, modified by any\r
-top-level option settings within the pattern itself, and with the PCRE_ANCHORED\r
-bit forcibly set if the form of the pattern implies that it can match only at\r
-the start of a subject string.\r
-\r
- PCRE_INFO_SIZE\r
-\r
-Return the size of the compiled pattern, that is, the value that was passed as\r
-the argument to \fBpcre_malloc()\fR when PCRE was getting memory in which to\r
-place the compiled data. The fourth argument should point to a \fBsize_t\fR\r
-variable.\r
-\r
- PCRE_INFO_CAPTURECOUNT\r
-\r
-Return the number of capturing subpatterns in the pattern. The fourth argument\r
-should point to an \fbint\fR variable.\r
-\r
- PCRE_INFO_BACKREFMAX\r
-\r
-Return the number of the highest back reference in the pattern. The fourth\r
-argument should point to an \fBint\fR variable. Zero is returned if there are\r
-no back references.\r
-\r
- PCRE_INFO_FIRSTCHAR\r
-\r
-Return information about the first character of any matched string, for a\r
-non-anchored pattern. If there is a fixed first character, e.g. from a pattern\r
-such as (cat|cow|coyote), it is returned in the integer pointed to by\r
-\fIwhere\fR. Otherwise, if either\r
-\r
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\r
-starts with "^", or\r
-\r
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set\r
-(if it were set, the pattern would be anchored),\r
-\r
--1 is returned, indicating that the pattern matches only at the start of a\r
-subject string or after any "\\n" within the string. Otherwise -2 is returned.\r
-For anchored patterns, -2 is returned.\r
-\r
- PCRE_INFO_FIRSTTABLE\r
-\r
-If the pattern was studied, and this resulted in the construction of a 256-bit\r
-table indicating a fixed set of characters for the first character in any\r
-matching string, a pointer to the table is returned. Otherwise NULL is\r
-returned. The fourth argument should point to an \fBunsigned char *\fR\r
-variable.\r
-\r
- PCRE_INFO_LASTLITERAL\r
-\r
-For a non-anchored pattern, return the value of the rightmost literal character\r
-which must exist in any matched string, other than at its start. The fourth\r
-argument should point to an \fBint\fR variable. If there is no such character,\r
-or if the pattern is anchored, -1 is returned. For example, for the pattern\r
-/a\\d+z\\d+/ the returned value is 'z'.\r
-\r
-The \fBpcre_info()\fR function is now obsolete because its interface is too\r
-restrictive to return all the available data about a compiled pattern. New\r
-programs should use \fBpcre_fullinfo()\fR instead. The yield of\r
-\fBpcre_info()\fR is the number of capturing subpatterns, or one of the\r
-following negative numbers:\r
-\r
- PCRE_ERROR_NULL the argument \fIcode\fR was NULL\r
- PCRE_ERROR_BADMAGIC the "magic number" was not found\r
-\r
-If the \fIoptptr\fR argument is not NULL, a copy of the options with which the\r
-pattern was compiled is placed in the integer it points to (see\r
-PCRE_INFO_OPTIONS above).\r
-\r
-If the pattern is not anchored and the \fIfirstcharptr\fR argument is not NULL,\r
-it is used to pass back information about the first character of any matched\r
-string (see PCRE_INFO_FIRSTCHAR above).\r
-\r
-\r
-.SH MATCHING A PATTERN\r
-The function \fBpcre_exec()\fR is called to match a subject string against a\r
-pre-compiled pattern, which is passed in the \fIcode\fR argument. If the\r
-pattern has been studied, the result of the study should be passed in the\r
-\fIextra\fR argument. Otherwise this must be NULL.\r
-\r
-The PCRE_ANCHORED option can be passed in the \fIoptions\fR argument, whose\r
-unused bits must be zero. However, if a pattern was compiled with\r
-PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it\r
-cannot be made unachored at matching time.\r
-\r
-There are also three further options that can be set only at matching time:\r
-\r
- PCRE_NOTBOL\r
-\r
-The first character of the string is not the beginning of a line, so the\r
-circumflex metacharacter should not match before it. Setting this without\r
-PCRE_MULTILINE (at compile time) causes circumflex never to match.\r
-\r
- PCRE_NOTEOL\r
-\r
-The end of the string is not the end of a line, so the dollar metacharacter\r
-should not match it nor (except in multiline mode) a newline immediately before\r
-it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never\r
-to match.\r
-\r
- PCRE_NOTEMPTY\r
-\r
-An empty string is not considered to be a valid match if this option is set. If\r
-there are alternatives in the pattern, they are tried. If all the alternatives\r
-match the empty string, the entire match fails. For example, if the pattern\r
-\r
- a?b?\r
-\r
-is applied to a string not beginning with "a" or "b", it matches the empty\r
-string at the start of the subject. With PCRE_NOTEMPTY set, this match is not\r
-valid, so PCRE searches further into the string for occurrences of "a" or "b".\r
-\r
-Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case\r
-of a pattern match of the empty string within its \fBsplit()\fR function, and\r
-when using the /g modifier. It is possible to emulate Perl's behaviour after\r
-matching a null string by first trying the match again at the same offset with\r
-PCRE_NOTEMPTY set, and then if that fails by advancing the starting offset (see\r
-below) and trying an ordinary match again.\r
-\r
-The subject string is passed as a pointer in \fIsubject\fR, a length in\r
-\fIlength\fR, and a starting offset in \fIstartoffset\fR. Unlike the pattern\r
-string, it may contain binary zero characters. When the starting offset is\r
-zero, the search for a match starts at the beginning of the subject, and this\r
-is by far the most common case.\r
-\r
-A non-zero starting offset is useful when searching for another match in the\r
-same subject by calling \fBpcre_exec()\fR again after a previous success.\r
-Setting \fIstartoffset\fR differs from just passing over a shortened string and\r
-setting PCRE_NOTBOL in the case of a pattern that begins with any kind of\r
-lookbehind. For example, consider the pattern\r
-\r
- \\Biss\\B\r
-\r
-which finds occurrences of "iss" in the middle of words. (\\B matches only if\r
-the current position in the subject is not a word boundary.) When applied to\r
-the string "Mississipi" the first call to \fBpcre_exec()\fR finds the first\r
-occurrence. If \fBpcre_exec()\fR is called again with just the remainder of the\r
-subject, namely "issipi", it does not match, because \\B is always false at the\r
-start of the subject, which is deemed to be a word boundary. However, if\r
-\fBpcre_exec()\fR is passed the entire string again, but with \fIstartoffset\fR\r
-set to 4, it finds the second occurrence of "iss" because it is able to look\r
-behind the starting point to discover that it is preceded by a letter.\r
-\r
-If a non-zero starting offset is passed when the pattern is anchored, one\r
-attempt to match at the given offset is tried. This can only succeed if the\r
-pattern does not require the match to be at the start of the subject.\r
-\r
-In general, a pattern matches a certain portion of the subject, and in\r
-addition, further substrings from the subject may be picked out by parts of the\r
-pattern. Following the usage in Jeffrey Friedl's book, this is called\r
-"capturing" in what follows, and the phrase "capturing subpattern" is used for\r
-a fragment of a pattern that picks out a substring. PCRE supports several other\r
-kinds of parenthesized subpattern that do not cause substrings to be captured.\r
-\r
-Captured substrings are returned to the caller via a vector of integer offsets\r
-whose address is passed in \fIovector\fR. The number of elements in the vector\r
-is passed in \fIovecsize\fR. The first two-thirds of the vector is used to pass\r
-back captured substrings, each substring using a pair of integers. The\r
-remaining third of the vector is used as workspace by \fBpcre_exec()\fR while\r
-matching capturing subpatterns, and is not available for passing back\r
-information. The length passed in \fIovecsize\fR should always be a multiple of\r
-three. If it is not, it is rounded down.\r
-\r
-When a match has been successful, information about captured substrings is\r
-returned in pairs of integers, starting at the beginning of \fIovector\fR, and\r
-continuing up to two-thirds of its length at the most. The first element of a\r
-pair is set to the offset of the first character in a substring, and the second\r
-is set to the offset of the first character after the end of a substring. The\r
-first pair, \fIovector[0]\fR and \fIovector[1]\fR, identify the portion of the\r
-subject string matched by the entire pattern. The next pair is used for the\r
-first capturing subpattern, and so on. The value returned by \fBpcre_exec()\fR\r
-is the number of pairs that have been set. If there are no capturing\r
-subpatterns, the return value from a successful match is 1, indicating that\r
-just the first pair of offsets has been set.\r
-\r
-Some convenience functions are provided for extracting the captured substrings\r
-as separate strings. These are described in the following section.\r
-\r
-It is possible for an capturing subpattern number \fIn+1\fR to match some\r
-part of the subject when subpattern \fIn\fR has not been used at all. For\r
-example, if the string "abc" is matched against the pattern (a|(z))(bc)\r
-subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset\r
-values corresponding to the unused subpattern are set to -1.\r
-\r
-If a capturing subpattern is matched repeatedly, it is the last portion of the\r
-string that it matched that gets returned.\r
-\r
-If the vector is too small to hold all the captured substrings, it is used as\r
-far as possible (up to two-thirds of its length), and the function returns a\r
-value of zero. In particular, if the substring offsets are not of interest,\r
-\fBpcre_exec()\fR may be called with \fIovector\fR passed as NULL and\r
-\fIovecsize\fR as zero. However, if the pattern contains back references and\r
-the \fIovector\fR isn't big enough to remember the related substrings, PCRE has\r
-to get additional memory for use during matching. Thus it is usually advisable\r
-to supply an \fIovector\fR.\r
-\r
-Note that \fBpcre_info()\fR can be used to find out how many capturing\r
-subpatterns there are in a compiled pattern. The smallest size for\r
-\fIovector\fR that will allow for \fIn\fR captured substrings in addition to\r
-the offsets of the substring matched by the whole pattern is (\fIn\fR+1)*3.\r
-\r
-If \fBpcre_exec()\fR fails, it returns a negative number. The following are\r
-defined in the header file:\r
-\r
- PCRE_ERROR_NOMATCH (-1)\r
-\r
-The subject string did not match the pattern.\r
-\r
- PCRE_ERROR_NULL (-2)\r
-\r
-Either \fIcode\fR or \fIsubject\fR was passed as NULL, or \fIovector\fR was\r
-NULL and \fIovecsize\fR was not zero.\r
-\r
- PCRE_ERROR_BADOPTION (-3)\r
-\r
-An unrecognized bit was set in the \fIoptions\fR argument.\r
-\r
- PCRE_ERROR_BADMAGIC (-4)\r
-\r
-PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch\r
-the case when it is passed a junk pointer. This is the error it gives when the\r
-magic number isn't present.\r
-\r
- PCRE_ERROR_UNKNOWN_NODE (-5)\r
-\r
-While running the pattern match, an unknown item was encountered in the\r
-compiled pattern. This error could be caused by a bug in PCRE or by overwriting\r
-of the compiled pattern.\r
-\r
- PCRE_ERROR_NOMEMORY (-6)\r
-\r
-If a pattern contains back references, but the \fIovector\fR that is passed to\r
-\fBpcre_exec()\fR is not big enough to remember the referenced substrings, PCRE\r
-gets a block of memory at the start of matching to use for this purpose. If the\r
-call via \fBpcre_malloc()\fR fails, this error is given. The memory is freed at\r
-the end of matching.\r
-\r
-\r
-.SH EXTRACTING CAPTURED SUBSTRINGS\r
-Captured substrings can be accessed directly by using the offsets returned by\r
-\fBpcre_exec()\fR in \fIovector\fR. For convenience, the functions\r
-\fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and\r
-\fBpcre_get_substring_list()\fR are provided for extracting captured substrings\r
-as new, separate, zero-terminated strings. A substring that contains a binary\r
-zero is correctly extracted and has a further zero added on the end, but the\r
-result does not, of course, function as a C string.\r
-\r
-The first three arguments are the same for all three functions: \fIsubject\fR\r
-is the subject string which has just been successfully matched, \fIovector\fR\r
-is a pointer to the vector of integer offsets that was passed to\r
-\fBpcre_exec()\fR, and \fIstringcount\fR is the number of substrings that\r
-were captured by the match, including the substring that matched the entire\r
-regular expression. This is the value returned by \fBpcre_exec\fR if it\r
-is greater than zero. If \fBpcre_exec()\fR returned zero, indicating that it\r
-ran out of space in \fIovector\fR, the value passed as \fIstringcount\fR should\r
-be the size of the vector divided by three.\r
-\r
-The functions \fBpcre_copy_substring()\fR and \fBpcre_get_substring()\fR\r
-extract a single substring, whose number is given as \fIstringnumber\fR. A\r
-value of zero extracts the substring that matched the entire pattern, while\r
-higher values extract the captured substrings. For \fBpcre_copy_substring()\fR,\r
-the string is placed in \fIbuffer\fR, whose length is given by\r
-\fIbuffersize\fR, while for \fBpcre_get_substring()\fR a new block of memory is\r
-obtained via \fBpcre_malloc\fR, and its address is returned via\r
-\fIstringptr\fR. The yield of the function is the length of the string, not\r
-including the terminating zero, or one of\r
-\r
- PCRE_ERROR_NOMEMORY (-6)\r
-\r
-The buffer was too small for \fBpcre_copy_substring()\fR, or the attempt to get\r
-memory failed for \fBpcre_get_substring()\fR.\r
-\r
- PCRE_ERROR_NOSUBSTRING (-7)\r
-\r
-There is no substring whose number is \fIstringnumber\fR.\r
-\r
-The \fBpcre_get_substring_list()\fR function extracts all available substrings\r
-and builds a list of pointers to them. All this is done in a single block of\r
-memory which is obtained via \fBpcre_malloc\fR. The address of the memory block\r
-is returned via \fIlistptr\fR, which is also the start of the list of string\r
-pointers. The end of the list is marked by a NULL pointer. The yield of the\r
-function is zero if all went well, or\r
-\r
- PCRE_ERROR_NOMEMORY (-6)\r
-\r
-if the attempt to get the memory block failed.\r
-\r
-When any of these functions encounter a substring that is unset, which can\r
-happen when capturing subpattern number \fIn+1\fR matches some part of the\r
-subject, but subpattern \fIn\fR has not been used at all, they return an empty\r
-string. This can be distinguished from a genuine zero-length substring by\r
-inspecting the appropriate offset in \fIovector\fR, which is negative for unset\r
-substrings.\r
-\r
-The two convenience functions \fBpcre_free_substring()\fR and\r
-\fBpcre_free_substring_list()\fR can be used to free the memory returned by\r
-a previous call of \fBpcre_get_substring()\fR or\r
-\fBpcre_get_substring_list()\fR, respectively. They do nothing more than call\r
-the function pointed to by \fBpcre_free\fR, which of course could be called\r
-directly from a C program. However, PCRE is used in some situations where it is\r
-linked via a special interface to another programming language which cannot use\r
-\fBpcre_free\fR directly; it is for these cases that the functions are\r
-provided.\r
-\r
-\r
-.SH LIMITATIONS\r
-There are some size limitations in PCRE but it is hoped that they will never in\r
-practice be relevant.\r
-The maximum length of a compiled pattern is 65539 (sic) bytes.\r
-All values in repeating quantifiers must be less than 65536.\r
-The maximum number of capturing subpatterns is 99.\r
-The maximum number of all parenthesized subpatterns, including capturing\r
-subpatterns, assertions, and other types of subpattern, is 200.\r
-\r
-The maximum length of a subject string is the largest positive number that an\r
-integer variable can hold. However, PCRE uses recursion to handle subpatterns\r
-and indefinite repetition. This means that the available stack space may limit\r
-the size of a subject string that can be processed by certain patterns.\r
-\r
-\r
-.SH DIFFERENCES FROM PERL\r
-The differences described here are with respect to Perl 5.005.\r
-\r
-1. By default, a whitespace character is any character that the C library\r
-function \fBisspace()\fR recognizes, though it is possible to compile PCRE with\r
-alternative character type tables. Normally \fBisspace()\fR matches space,\r
-formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5\r
-no longer includes vertical tab in its set of whitespace characters. The \\v\r
-escape that was in the Perl documentation for a long time was never in fact\r
-recognized. However, the character itself was treated as whitespace at least\r
-up to 5.002. In 5.004 and 5.005 it does not match \\s.\r
-\r
-2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits\r
-them, but they do not mean what you might think. For example, (?!a){3} does\r
-not assert that the next three characters are not "a". It just asserts that the\r
-next character is not "a" three times.\r
-\r
-3. Capturing subpatterns that occur inside negative lookahead assertions are\r
-counted, but their entries in the offsets vector are never set. Perl sets its\r
-numerical variables from any such patterns that are matched before the\r
-assertion fails to match something (thereby succeeding), but only if the\r
-negative lookahead assertion contains just one branch.\r
-\r
-4. Though binary zero characters are supported in the subject string, they are\r
-not allowed in a pattern string because it is passed as a normal C string,\r
-terminated by zero. The escape sequence "\\0" can be used in the pattern to\r
-represent a binary zero.\r
-\r
-5. The following Perl escape sequences are not supported: \\l, \\u, \\L, \\U,\r
-\\E, \\Q. In fact these are implemented by Perl's general string-handling and\r
-are not part of its pattern matching engine.\r
-\r
-6. The Perl \\G assertion is not supported as it is not relevant to single\r
-pattern matches.\r
-\r
-7. Fairly obviously, PCRE does not support the (?{code}) and (?p{code})\r
-constructions. However, there is some experimental support for recursive\r
-patterns using the non-Perl item (?R).\r
-\r
-8. There are at the time of writing some oddities in Perl 5.005_02 concerned\r
-with the settings of captured strings when part of a pattern is repeated. For\r
-example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value\r
-"b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if\r
-the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set.\r
-\r
-In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the\r
-future Perl changes to a consistent state that is different, PCRE may change to\r
-follow.\r
-\r
-9. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern\r
-/^(a)?(?(1)a|b)+$/ matches the string "a", whereas in PCRE it does not.\r
-However, in both Perl and PCRE /^(a)?a/ matched against "a" leaves $1 unset.\r
-\r
-10. PCRE provides some extensions to the Perl regular expression facilities:\r
-\r
-(a) Although lookbehind assertions must match fixed length strings, each\r
-alternative branch of a lookbehind assertion can match a different length of\r
-string. Perl 5.005 requires them all to have the same length.\r
-\r
-(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta-\r
-character matches only at the very end of the string.\r
-\r
-(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special\r
-meaning is faulted.\r
-\r
-(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is\r
-inverted, that is, by default they are not greedy, but if followed by a\r
-question mark they are.\r
-\r
-(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start\r
-of the subject.\r
-\r
-(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for\r
-\fBpcre_exec()\fR have no Perl equivalents.\r
-\r
-(g) The (?R) construct allows for recursive pattern matching (Perl 5.6 can do\r
-this using the (?p{code}) construct, which PCRE cannot of course support.)\r
-\r
-\r
-.SH REGULAR EXPRESSION DETAILS\r
-The syntax and semantics of the regular expressions supported by PCRE are\r
-described below. Regular expressions are also described in the Perl\r
-documentation and in a number of other books, some of which have copious\r
-examples. Jeffrey Friedl's "Mastering Regular Expressions", published by\r
-O'Reilly (ISBN 1-56592-257), covers them in great detail.\r
-\r
-The description here is intended as reference documentation. The basic\r
-operation of PCRE is on strings of bytes. However, there is the beginnings of\r
-some support for UTF-8 character strings. To use this support you must\r
-configure PCRE to include it, and then call \fBpcre_compile()\fR with the\r
-PCRE_UTF8 option. How this affects the pattern matching is described in the\r
-final section of this document.\r
-\r
-A regular expression is a pattern that is matched against a subject string from\r
-left to right. Most characters stand for themselves in a pattern, and match the\r
-corresponding characters in the subject. As a trivial example, the pattern\r
-\r
- The quick brown fox\r
-\r
-matches a portion of a subject string that is identical to itself. The power of\r
-regular expressions comes from the ability to include alternatives and\r
-repetitions in the pattern. These are encoded in the pattern by the use of\r
-\fImeta-characters\fR, which do not stand for themselves but instead are\r
-interpreted in some special way.\r
-\r
-There are two different sets of meta-characters: those that are recognized\r
-anywhere in the pattern except within square brackets, and those that are\r
-recognized in square brackets. Outside square brackets, the meta-characters are\r
-as follows:\r
-\r
- \\ general escape character with several uses\r
- ^ assert start of subject (or line, in multiline mode)\r
- $ assert end of subject (or line, in multiline mode)\r
- . match any character except newline (by default)\r
- [ start character class definition\r
- | start of alternative branch\r
- ( start subpattern\r
- ) end subpattern\r
- ? extends the meaning of (\r
- also 0 or 1 quantifier\r
- also quantifier minimizer\r
- * 0 or more quantifier\r
- + 1 or more quantifier\r
- { start min/max quantifier\r
-\r
-Part of a pattern that is in square brackets is called a "character class". In\r
-a character class the only meta-characters are:\r
-\r
- \\ general escape character\r
- ^ negate the class, but only if the first character\r
- - indicates character range\r
- ] terminates the character class\r
-\r
-The following sections describe the use of each of the meta-characters.\r
-\r
-\r
-.SH BACKSLASH\r
-The backslash character has several uses. Firstly, if it is followed by a\r
-non-alphameric character, it takes away any special meaning that character may\r
-have. This use of backslash as an escape character applies both inside and\r
-outside character classes.\r
-\r
-For example, if you want to match a "*" character, you write "\\*" in the\r
-pattern. This applies whether or not the following character would otherwise be\r
-interpreted as a meta-character, so it is always safe to precede a\r
-non-alphameric with "\\" to specify that it stands for itself. In particular,\r
-if you want to match a backslash, you write "\\\\".\r
-\r
-If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the\r
-pattern (other than in a character class) and characters between a "#" outside\r
-a character class and the next newline character are ignored. An escaping\r
-backslash can be used to include a whitespace or "#" character as part of the\r
-pattern.\r
-\r
-A second use of backslash provides a way of encoding non-printing characters\r
-in patterns in a visible manner. There is no restriction on the appearance of\r
-non-printing characters, apart from the binary zero that terminates a pattern,\r
-but when a pattern is being prepared by text editing, it is usually easier to\r
-use one of the following escape sequences than the binary character it\r
-represents:\r
-\r
- \\a alarm, that is, the BEL character (hex 07)\r
- \\cx "control-x", where x is any character\r
- \\e escape (hex 1B)\r
- \\f formfeed (hex 0C)\r
- \\n newline (hex 0A)\r
- \\r carriage return (hex 0D)\r
- \\t tab (hex 09)\r
- \\xhh character with hex code hh\r
- \\ddd character with octal code ddd, or backreference\r
-\r
-The precise effect of "\\cx" is as follows: if "x" is a lower case letter, it\r
-is converted to upper case. Then bit 6 of the character (hex 40) is inverted.\r
-Thus "\\cz" becomes hex 1A, but "\\c{" becomes hex 3B, while "\\c;" becomes hex\r
-7B.\r
-\r
-After "\\x", up to two hexadecimal digits are read (letters can be in upper or\r
-lower case).\r
-\r
-After "\\0" up to two further octal digits are read. In both cases, if there\r
-are fewer than two digits, just those that are present are used. Thus the\r
-sequence "\\0\\x\\07" specifies two binary zeros followed by a BEL character.\r
-Make sure you supply two digits after the initial zero if the character that\r
-follows is itself an octal digit.\r
-\r
-The handling of a backslash followed by a digit other than 0 is complicated.\r
-Outside a character class, PCRE reads it and any following digits as a decimal\r
-number. If the number is less than 10, or if there have been at least that many\r
-previous capturing left parentheses in the expression, the entire sequence is\r
-taken as a \fIback reference\fR. A description of how this works is given\r
-later, following the discussion of parenthesized subpatterns.\r
-\r
-Inside a character class, or if the decimal number is greater than 9 and there\r
-have not been that many capturing subpatterns, PCRE re-reads up to three octal\r
-digits following the backslash, and generates a single byte from the least\r
-significant 8 bits of the value. Any subsequent digits stand for themselves.\r
-For example:\r
-\r
- \\040 is another way of writing a space\r
- \\40 is the same, provided there are fewer than 40\r
- previous capturing subpatterns\r
- \\7 is always a back reference\r
- \\11 might be a back reference, or another way of\r
- writing a tab\r
- \\011 is always a tab\r
- \\0113 is a tab followed by the character "3"\r
- \\113 is the character with octal code 113 (since there\r
- can be no more than 99 back references)\r
- \\377 is a byte consisting entirely of 1 bits\r
- \\81 is either a back reference, or a binary zero\r
- followed by the two characters "8" and "1"\r
-\r
-Note that octal values of 100 or greater must not be introduced by a leading\r
-zero, because no more than three octal digits are ever read.\r
-\r
-All the sequences that define a single byte value can be used both inside and\r
-outside character classes. In addition, inside a character class, the sequence\r
-"\\b" is interpreted as the backspace character (hex 08). Outside a character\r
-class it has a different meaning (see below).\r
-\r
-The third use of backslash is for specifying generic character types:\r
-\r
- \\d any decimal digit\r
- \\D any character that is not a decimal digit\r
- \\s any whitespace character\r
- \\S any character that is not a whitespace character\r
- \\w any "word" character\r
- \\W any "non-word" character\r
-\r
-Each pair of escape sequences partitions the complete set of characters into\r
-two disjoint sets. Any given character matches one, and only one, of each pair.\r
-\r
-A "word" character is any letter or digit or the underscore character, that is,\r
-any character which can be part of a Perl "word". The definition of letters and\r
-digits is controlled by PCRE's character tables, and may vary if locale-\r
-specific matching is taking place (see "Locale support" above). For example, in\r
-the "fr" (French) locale, some character codes greater than 128 are used for\r
-accented letters, and these are matched by \\w.\r
-\r
-These character type sequences can appear both inside and outside character\r
-classes. They each match one character of the appropriate type. If the current\r
-matching point is at the end of the subject string, all of them fail, since\r
-there is no character to match.\r
-\r
-The fourth use of backslash is for certain simple assertions. An assertion\r
-specifies a condition that has to be met at a particular point in a match,\r
-without consuming any characters from the subject string. The use of\r
-subpatterns for more complicated assertions is described below. The backslashed\r
-assertions are\r
-\r
- \\b word boundary\r
- \\B not a word boundary\r
- \\A start of subject (independent of multiline mode)\r
- \\Z end of subject or newline at end (independent of multiline mode)\r
- \\z end of subject (independent of multiline mode)\r
-\r
-These assertions may not appear in character classes (but note that "\\b" has a\r
-different meaning, namely the backspace character, inside a character class).\r
-\r
-A word boundary is a position in the subject string where the current character\r
-and the previous character do not both match \\w or \\W (i.e. one matches\r
-\\w and the other matches \\W), or the start or end of the string if the\r
-first or last character matches \\w, respectively.\r
-\r
-The \\A, \\Z, and \\z assertions differ from the traditional circumflex and\r
-dollar (described below) in that they only ever match at the very start and end\r
-of the subject string, whatever options are set. They are not affected by the\r
-PCRE_NOTBOL or PCRE_NOTEOL options. If the \fIstartoffset\fR argument of\r
-\fBpcre_exec()\fR is non-zero, \\A can never match. The difference between \\Z\r
-and \\z is that \\Z matches before a newline that is the last character of the\r
-string as well as at the end of the string, whereas \\z matches only at the\r
-end.\r
-\r
-\r
-.SH CIRCUMFLEX AND DOLLAR\r
-Outside a character class, in the default matching mode, the circumflex\r
-character is an assertion which is true only if the current matching point is\r
-at the start of the subject string. If the \fIstartoffset\fR argument of\r
-\fBpcre_exec()\fR is non-zero, circumflex can never match. Inside a character\r
-class, circumflex has an entirely different meaning (see below).\r
-\r
-Circumflex need not be the first character of the pattern if a number of\r
-alternatives are involved, but it should be the first thing in each alternative\r
-in which it appears if the pattern is ever to match that branch. If all\r
-possible alternatives start with a circumflex, that is, if the pattern is\r
-constrained to match only at the start of the subject, it is said to be an\r
-"anchored" pattern. (There are also other constructs that can cause a pattern\r
-to be anchored.)\r
-\r
-A dollar character is an assertion which is true only if the current matching\r
-point is at the end of the subject string, or immediately before a newline\r
-character that is the last character in the string (by default). Dollar need\r
-not be the last character of the pattern if a number of alternatives are\r
-involved, but it should be the last item in any branch in which it appears.\r
-Dollar has no special meaning in a character class.\r
-\r
-The meaning of dollar can be changed so that it matches only at the very end of\r
-the string, by setting the PCRE_DOLLAR_ENDONLY option at compile or matching\r
-time. This does not affect the \\Z assertion.\r
-\r
-The meanings of the circumflex and dollar characters are changed if the\r
-PCRE_MULTILINE option is set. When this is the case, they match immediately\r
-after and immediately before an internal "\\n" character, respectively, in\r
-addition to matching at the start and end of the subject string. For example,\r
-the pattern /^abc$/ matches the subject string "def\\nabc" in multiline mode,\r
-but not otherwise. Consequently, patterns that are anchored in single line mode\r
-because all branches start with "^" are not anchored in multiline mode, and a\r
-match for circumflex is possible when the \fIstartoffset\fR argument of\r
-\fBpcre_exec()\fR is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if\r
-PCRE_MULTILINE is set.\r
-\r
-Note that the sequences \\A, \\Z, and \\z can be used to match the start and\r
-end of the subject in both modes, and if all branches of a pattern start with\r
-\\A is it always anchored, whether PCRE_MULTILINE is set or not.\r
-\r
-\r
-.SH FULL STOP (PERIOD, DOT)\r
-Outside a character class, a dot in the pattern matches any one character in\r
-the subject, including a non-printing character, but not (by default) newline.\r
-If the PCRE_DOTALL option is set, dots match newlines as well. The handling of\r
-dot is entirely independent of the handling of circumflex and dollar, the only\r
-relationship being that they both involve newline characters. Dot has no\r
-special meaning in a character class.\r
-\r
-\r
-.SH SQUARE BRACKETS\r
-An opening square bracket introduces a character class, terminated by a closing\r
-square bracket. A closing square bracket on its own is not special. If a\r
-closing square bracket is required as a member of the class, it should be the\r
-first data character in the class (after an initial circumflex, if present) or\r
-escaped with a backslash.\r
-\r
-A character class matches a single character in the subject; the character must\r
-be in the set of characters defined by the class, unless the first character in\r
-the class is a circumflex, in which case the subject character must not be in\r
-the set defined by the class. If a circumflex is actually required as a member\r
-of the class, ensure it is not the first character, or escape it with a\r
-backslash.\r
-\r
-For example, the character class [aeiou] matches any lower case vowel, while\r
-[^aeiou] matches any character that is not a lower case vowel. Note that a\r
-circumflex is just a convenient notation for specifying the characters which\r
-are in the class by enumerating those that are not. It is not an assertion: it\r
-still consumes a character from the subject string, and fails if the current\r
-pointer is at the end of the string.\r
-\r
-When caseless matching is set, any letters in a class represent both their\r
-upper case and lower case versions, so for example, a caseless [aeiou] matches\r
-"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a\r
-caseful version would.\r
-\r
-The newline character is never treated in any special way in character classes,\r
-whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class\r
-such as [^a] will always match a newline.\r
-\r
-The minus (hyphen) character can be used to specify a range of characters in a\r
-character class. For example, [d-m] matches any letter between d and m,\r
-inclusive. If a minus character is required in a class, it must be escaped with\r
-a backslash or appear in a position where it cannot be interpreted as\r
-indicating a range, typically as the first or last character in the class.\r
-\r
-It is not possible to have the literal character "]" as the end character of a\r
-range. A pattern such as [W-]46] is interpreted as a class of two characters\r
-("W" and "-") followed by a literal string "46]", so it would match "W46]" or\r
-"-46]". However, if the "]" is escaped with a backslash it is interpreted as\r
-the end of range, so [W-\\]46] is interpreted as a single class containing a\r
-range followed by two separate characters. The octal or hexadecimal\r
-representation of "]" can also be used to end a range.\r
-\r
-Ranges operate in ASCII collating sequence. They can also be used for\r
-characters specified numerically, for example [\\000-\\037]. If a range that\r
-includes letters is used when caseless matching is set, it matches the letters\r
-in either case. For example, [W-c] is equivalent to [][\\^_`wxyzabc], matched\r
-caselessly, and if character tables for the "fr" locale are in use,\r
-[\\xc8-\\xcb] matches accented E characters in both cases.\r
-\r
-The character types \\d, \\D, \\s, \\S, \\w, and \\W may also appear in a\r
-character class, and add the characters that they match to the class. For\r
-example, [\\dABCDEF] matches any hexadecimal digit. A circumflex can\r
-conveniently be used with the upper case character types to specify a more\r
-restricted set of characters than the matching lower case type. For example,\r
-the class [^\\W_] matches any letter or digit, but not underscore.\r
-\r
-All non-alphameric characters other than \\, -, ^ (at the start) and the\r
-terminating ] are non-special in character classes, but it does no harm if they\r
-are escaped.\r
-\r
-\r
-.SH POSIX CHARACTER CLASSES\r
-Perl 5.6 (not yet released at the time of writing) is going to support the\r
-POSIX notation for character classes, which uses names enclosed by [: and :]\r
-within the enclosing square brackets. PCRE supports this notation. For example,\r
-\r
- [01[:alpha:]%]\r
-\r
-matches "0", "1", any alphabetic character, or "%". The supported class names\r
-are\r
-\r
- alnum letters and digits\r
- alpha letters\r
- ascii character codes 0 - 127\r
- cntrl control characters\r
- digit decimal digits (same as \\d)\r
- graph printing characters, excluding space\r
- lower lower case letters\r
- print printing characters, including space\r
- punct printing characters, excluding letters and digits\r
- space white space (same as \\s)\r
- upper upper case letters\r
- word "word" characters (same as \\w)\r
- xdigit hexadecimal digits\r
-\r
-The names "ascii" and "word" are Perl extensions. Another Perl extension is\r
-negation, which is indicated by a ^ character after the colon. For example,\r
-\r
- [12[:^digit:]]\r
-\r
-matches "1", "2", or any non-digit. PCRE (and Perl) also recogize the POSIX\r
-syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not\r
-supported, and an error is given if they are encountered.\r
-\r
-\r
-.SH VERTICAL BAR\r
-Vertical bar characters are used to separate alternative patterns. For example,\r
-the pattern\r
-\r
- gilbert|sullivan\r
-\r
-matches either "gilbert" or "sullivan". Any number of alternatives may appear,\r
-and an empty alternative is permitted (matching the empty string).\r
-The matching process tries each alternative in turn, from left to right,\r
-and the first one that succeeds is used. If the alternatives are within a\r
-subpattern (defined below), "succeeds" means matching the rest of the main\r
-pattern as well as the alternative in the subpattern.\r
-\r
-\r
-.SH INTERNAL OPTION SETTING\r
-The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and PCRE_EXTENDED\r
-can be changed from within the pattern by a sequence of Perl option letters\r
-enclosed between "(?" and ")". The option letters are\r
-\r
- i for PCRE_CASELESS\r
- m for PCRE_MULTILINE\r
- s for PCRE_DOTALL\r
- x for PCRE_EXTENDED\r
-\r
-For example, (?im) sets caseless, multiline matching. It is also possible to\r
-unset these options by preceding the letter with a hyphen, and a combined\r
-setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and\r
-PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also\r
-permitted. If a letter appears both before and after the hyphen, the option is\r
-unset.\r
-\r
-The scope of these option changes depends on where in the pattern the setting\r
-occurs. For settings that are outside any subpattern (defined below), the\r
-effect is the same as if the options were set or unset at the start of\r
-matching. The following patterns all behave in exactly the same way:\r
-\r
- (?i)abc\r
- a(?i)bc\r
- ab(?i)c\r
- abc(?i)\r
-\r
-which in turn is the same as compiling the pattern abc with PCRE_CASELESS set.\r
-In other words, such "top level" settings apply to the whole pattern (unless\r
-there are other changes inside subpatterns). If there is more than one setting\r
-of the same option at top level, the rightmost setting is used.\r
-\r
-If an option change occurs inside a subpattern, the effect is different. This\r
-is a change of behaviour in Perl 5.005. An option change inside a subpattern\r
-affects only that part of the subpattern that follows it, so\r
-\r
- (a(?i)b)c\r
-\r
-matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).\r
-By this means, options can be made to have different settings in different\r
-parts of the pattern. Any changes made in one alternative do carry on\r
-into subsequent branches within the same subpattern. For example,\r
-\r
- (a(?i)b|c)\r
-\r
-matches "ab", "aB", "c", and "C", even though when matching "C" the first\r
-branch is abandoned before the option setting. This is because the effects of\r
-option settings happen at compile time. There would be some very weird\r
-behaviour otherwise.\r
-\r
-The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the\r
-same way as the Perl-compatible options by using the characters U and X\r
-respectively. The (?X) flag setting is special in that it must always occur\r
-earlier in the pattern than any of the additional features it turns on, even\r
-when it is at top level. It is best put at the start.\r
-\r
-\r
-.SH SUBPATTERNS\r
-Subpatterns are delimited by parentheses (round brackets), which can be nested.\r
-Marking part of a pattern as a subpattern does two things:\r
-\r
-1. It localizes a set of alternatives. For example, the pattern\r
-\r
- cat(aract|erpillar|)\r
-\r
-matches one of the words "cat", "cataract", or "caterpillar". Without the\r
-parentheses, it would match "cataract", "erpillar" or the empty string.\r
-\r
-2. It sets up the subpattern as a capturing subpattern (as defined above).\r
-When the whole pattern matches, that portion of the subject string that matched\r
-the subpattern is passed back to the caller via the \fIovector\fR argument of\r
-\fBpcre_exec()\fR. Opening parentheses are counted from left to right (starting\r
-from 1) to obtain the numbers of the capturing subpatterns.\r
-\r
-For example, if the string "the red king" is matched against the pattern\r
-\r
- the ((red|white) (king|queen))\r
-\r
-the captured substrings are "red king", "red", and "king", and are numbered 1,\r
-2, and 3.\r
-\r
-The fact that plain parentheses fulfil two functions is not always helpful.\r
-There are often times when a grouping subpattern is required without a\r
-capturing requirement. If an opening parenthesis is followed by "?:", the\r
-subpattern does not do any capturing, and is not counted when computing the\r
-number of any subsequent capturing subpatterns. For example, if the string "the\r
-white queen" is matched against the pattern\r
-\r
- the ((?:red|white) (king|queen))\r
-\r
-the captured substrings are "white queen" and "queen", and are numbered 1 and\r
-2. The maximum number of captured substrings is 99, and the maximum number of\r
-all subpatterns, both capturing and non-capturing, is 200.\r
-\r
-As a convenient shorthand, if any option settings are required at the start of\r
-a non-capturing subpattern, the option letters may appear between the "?" and\r
-the ":". Thus the two patterns\r
-\r
- (?i:saturday|sunday)\r
- (?:(?i)saturday|sunday)\r
-\r
-match exactly the same set of strings. Because alternative branches are tried\r
-from left to right, and options are not reset until the end of the subpattern\r
-is reached, an option setting in one branch does affect subsequent branches, so\r
-the above patterns match "SUNDAY" as well as "Saturday".\r
-\r
-\r
-.SH REPETITION\r
-Repetition is specified by quantifiers, which can follow any of the following\r
-items:\r
-\r
- a single character, possibly escaped\r
- the . metacharacter\r
- a character class\r
- a back reference (see next section)\r
- a parenthesized subpattern (unless it is an assertion - see below)\r
-\r
-The general repetition quantifier specifies a minimum and maximum number of\r
-permitted matches, by giving the two numbers in curly brackets (braces),\r
-separated by a comma. The numbers must be less than 65536, and the first must\r
-be less than or equal to the second. For example:\r
-\r
- z{2,4}\r
-\r
-matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special\r
-character. If the second number is omitted, but the comma is present, there is\r
-no upper limit; if the second number and the comma are both omitted, the\r
-quantifier specifies an exact number of required matches. Thus\r
-\r
- [aeiou]{3,}\r
-\r
-matches at least 3 successive vowels, but may match many more, while\r
-\r
- \\d{8}\r
-\r
-matches exactly 8 digits. An opening curly bracket that appears in a position\r
-where a quantifier is not allowed, or one that does not match the syntax of a\r
-quantifier, is taken as a literal character. For example, {,6} is not a\r
-quantifier, but a literal string of four characters.\r
-\r
-The quantifier {0} is permitted, causing the expression to behave as if the\r
-previous item and the quantifier were not present.\r
-\r
-For convenience (and historical compatibility) the three most common\r
-quantifiers have single-character abbreviations:\r
-\r
- * is equivalent to {0,}\r
- + is equivalent to {1,}\r
- ? is equivalent to {0,1}\r
-\r
-It is possible to construct infinite loops by following a subpattern that can\r
-match no characters with a quantifier that has no upper limit, for example:\r
-\r
- (a?)*\r
-\r
-Earlier versions of Perl and PCRE used to give an error at compile time for\r
-such patterns. However, because there are cases where this can be useful, such\r
-patterns are now accepted, but if any repetition of the subpattern does in fact\r
-match no characters, the loop is forcibly broken.\r
-\r
-By default, the quantifiers are "greedy", that is, they match as much as\r
-possible (up to the maximum number of permitted times), without causing the\r
-rest of the pattern to fail. The classic example of where this gives problems\r
-is in trying to match comments in C programs. These appear between the\r
-sequences /* and */ and within the sequence, individual * and / characters may\r
-appear. An attempt to match C comments by applying the pattern\r
-\r
- /\\*.*\\*/\r
-\r
-to the string\r
-\r
- /* first command */ not comment /* second comment */\r
-\r
-fails, because it matches the entire string owing to the greediness of the .*\r
-item.\r
-\r
-However, if a quantifier is followed by a question mark, it ceases to be\r
-greedy, and instead matches the minimum number of times possible, so the\r
-pattern\r
-\r
- /\\*.*?\\*/\r
-\r
-does the right thing with the C comments. The meaning of the various\r
-quantifiers is not otherwise changed, just the preferred number of matches.\r
-Do not confuse this use of question mark with its use as a quantifier in its\r
-own right. Because it has two uses, it can sometimes appear doubled, as in\r
-\r
- \\d??\\d\r
-\r
-which matches one digit by preference, but can match two if that is the only\r
-way the rest of the pattern matches.\r
-\r
-If the PCRE_UNGREEDY option is set (an option which is not available in Perl),\r
-the quantifiers are not greedy by default, but individual ones can be made\r
-greedy by following them with a question mark. In other words, it inverts the\r
-default behaviour.\r
-\r
-When a parenthesized subpattern is quantified with a minimum repeat count that\r
-is greater than 1 or with a limited maximum, more store is required for the\r
-compiled pattern, in proportion to the size of the minimum or maximum.\r
-\r
-If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent\r
-to Perl's /s) is set, thus allowing the . to match newlines, the pattern is\r
-implicitly anchored, because whatever follows will be tried against every\r
-character position in the subject string, so there is no point in retrying the\r
-overall match at any position after the first. PCRE treats such a pattern as\r
-though it were preceded by \\A. In cases where it is known that the subject\r
-string contains no newlines, it is worth setting PCRE_DOTALL when the pattern\r
-begins with .* in order to obtain this optimization, or alternatively using ^\r
-to indicate anchoring explicitly.\r
-\r
-When a capturing subpattern is repeated, the value captured is the substring\r
-that matched the final iteration. For example, after\r
-\r
- (tweedle[dume]{3}\\s*)+\r
-\r
-has matched "tweedledum tweedledee" the value of the captured substring is\r
-"tweedledee". However, if there are nested capturing subpatterns, the\r
-corresponding captured values may have been set in previous iterations. For\r
-example, after\r
-\r
- /(a|(b))+/\r
-\r
-matches "aba" the value of the second captured substring is "b".\r
-\r
-\r
-.SH BACK REFERENCES\r
-Outside a character class, a backslash followed by a digit greater than 0 (and\r
-possibly further digits) is a back reference to a capturing subpattern earlier\r
-(i.e. to its left) in the pattern, provided there have been that many previous\r
-capturing left parentheses.\r
-\r
-However, if the decimal number following the backslash is less than 10, it is\r
-always taken as a back reference, and causes an error only if there are not\r
-that many capturing left parentheses in the entire pattern. In other words, the\r
-parentheses that are referenced need not be to the left of the reference for\r
-numbers less than 10. See the section entitled "Backslash" above for further\r
-details of the handling of digits following a backslash.\r
-\r
-A back reference matches whatever actually matched the capturing subpattern in\r
-the current subject string, rather than anything matching the subpattern\r
-itself. So the pattern\r
-\r
- (sens|respons)e and \\1ibility\r
-\r
-matches "sense and sensibility" and "response and responsibility", but not\r
-"sense and responsibility". If caseful matching is in force at the time of the\r
-back reference, the case of letters is relevant. For example,\r
-\r
- ((?i)rah)\\s+\\1\r
-\r
-matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original\r
-capturing subpattern is matched caselessly.\r
-\r
-There may be more than one back reference to the same subpattern. If a\r
-subpattern has not actually been used in a particular match, any back\r
-references to it always fail. For example, the pattern\r
-\r
- (a|(bc))\\2\r
-\r
-always fails if it starts to match "a" rather than "bc". Because there may be\r
-up to 99 back references, all digits following the backslash are taken\r
-as part of a potential back reference number. If the pattern continues with a\r
-digit character, some delimiter must be used to terminate the back reference.\r
-If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty\r
-comment can be used.\r
-\r
-A back reference that occurs inside the parentheses to which it refers fails\r
-when the subpattern is first used, so, for example, (a\\1) never matches.\r
-However, such references can be useful inside repeated subpatterns. For\r
-example, the pattern\r
-\r
- (a|b\\1)+\r
-\r
-matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of\r
-the subpattern, the back reference matches the character string corresponding\r
-to the previous iteration. In order for this to work, the pattern must be such\r
-that the first iteration does not need to match the back reference. This can be\r
-done using alternation, as in the example above, or by a quantifier with a\r
-minimum of zero.\r
-\r
-\r
-.SH ASSERTIONS\r
-An assertion is a test on the characters following or preceding the current\r
-matching point that does not actually consume any characters. The simple\r
-assertions coded as \\b, \\B, \\A, \\Z, \\z, ^ and $ are described above. More\r
-complicated assertions are coded as subpatterns. There are two kinds: those\r
-that look ahead of the current position in the subject string, and those that\r
-look behind it.\r
-\r
-An assertion subpattern is matched in the normal way, except that it does not\r
-cause the current matching position to be changed. Lookahead assertions start\r
-with (?= for positive assertions and (?! for negative assertions. For example,\r
-\r
- \\w+(?=;)\r
-\r
-matches a word followed by a semicolon, but does not include the semicolon in\r
-the match, and\r
-\r
- foo(?!bar)\r
-\r
-matches any occurrence of "foo" that is not followed by "bar". Note that the\r
-apparently similar pattern\r
-\r
- (?!foo)bar\r
-\r
-does not find an occurrence of "bar" that is preceded by something other than\r
-"foo"; it finds any occurrence of "bar" whatsoever, because the assertion\r
-(?!foo) is always true when the next three characters are "bar". A\r
-lookbehind assertion is needed to achieve this effect.\r
-\r
-Lookbehind assertions start with (?<= for positive assertions and (?<! for\r
-negative assertions. For example,\r
-\r
- (?<!foo)bar\r
-\r
-does find an occurrence of "bar" that is not preceded by "foo". The contents of\r
-a lookbehind assertion are restricted such that all the strings it matches must\r
-have a fixed length. However, if there are several alternatives, they do not\r
-all have to have the same fixed length. Thus\r
-\r
- (?<=bullock|donkey)\r
-\r
-is permitted, but\r
-\r
- (?<!dogs?|cats?)\r
-\r
-causes an error at compile time. Branches that match different length strings\r
-are permitted only at the top level of a lookbehind assertion. This is an\r
-extension compared with Perl 5.005, which requires all branches to match the\r
-same length of string. An assertion such as\r
-\r
- (?<=ab(c|de))\r
-\r
-is not permitted, because its single top-level branch can match two different\r
-lengths, but it is acceptable if rewritten to use two top-level branches:\r
-\r
- (?<=abc|abde)\r
-\r
-The implementation of lookbehind assertions is, for each alternative, to\r
-temporarily move the current position back by the fixed width and then try to\r
-match. If there are insufficient characters before the current position, the\r
-match is deemed to fail. Lookbehinds in conjunction with once-only subpatterns\r
-can be particularly useful for matching at the ends of strings; an example is\r
-given at the end of the section on once-only subpatterns.\r
-\r
-Several assertions (of any sort) may occur in succession. For example,\r
-\r
- (?<=\\d{3})(?<!999)foo\r
-\r
-matches "foo" preceded by three digits that are not "999". Notice that each of\r
-the assertions is applied independently at the same point in the subject\r
-string. First there is a check that the previous three characters are all\r
-digits, and then there is a check that the same three characters are not "999".\r
-This pattern does \fInot\fR match "foo" preceded by six characters, the first\r
-of which are digits and the last three of which are not "999". For example, it\r
-doesn't match "123abcfoo". A pattern to do that is\r
-\r
- (?<=\\d{3}...)(?<!999)foo\r
-\r
-This time the first assertion looks at the preceding six characters, checking\r
-that the first three are digits, and then the second assertion checks that the\r
-preceding three characters are not "999".\r
-\r
-Assertions can be nested in any combination. For example,\r
-\r
- (?<=(?<!foo)bar)baz\r
-\r
-matches an occurrence of "baz" that is preceded by "bar" which in turn is not\r
-preceded by "foo", while\r
-\r
- (?<=\\d{3}(?!999)...)foo\r
-\r
-is another pattern which matches "foo" preceded by three digits and any three\r
-characters that are not "999".\r
-\r
-Assertion subpatterns are not capturing subpatterns, and may not be repeated,\r
-because it makes no sense to assert the same thing several times. If any kind\r
-of assertion contains capturing subpatterns within it, these are counted for\r
-the purposes of numbering the capturing subpatterns in the whole pattern.\r
-However, substring capturing is carried out only for positive assertions,\r
-because it does not make sense for negative assertions.\r
-\r
-Assertions count towards the maximum of 200 parenthesized subpatterns.\r
-\r
-\r
-.SH ONCE-ONLY SUBPATTERNS\r
-With both maximizing and minimizing repetition, failure of what follows\r
-normally causes the repeated item to be re-evaluated to see if a different\r
-number of repeats allows the rest of the pattern to match. Sometimes it is\r
-useful to prevent this, either to change the nature of the match, or to cause\r
-it fail earlier than it otherwise might, when the author of the pattern knows\r
-there is no point in carrying on.\r
-\r
-Consider, for example, the pattern \\d+foo when applied to the subject line\r
-\r
- 123456bar\r
-\r
-After matching all 6 digits and then failing to match "foo", the normal\r
-action of the matcher is to try again with only 5 digits matching the \\d+\r
-item, and then with 4, and so on, before ultimately failing. Once-only\r
-subpatterns provide the means for specifying that once a portion of the pattern\r
-has matched, it is not to be re-evaluated in this way, so the matcher would\r
-give up immediately on failing to match "foo" the first time. The notation is\r
-another kind of special parenthesis, starting with (?> as in this example:\r
-\r
- (?>\\d+)bar\r
-\r
-This kind of parenthesis "locks up" the part of the pattern it contains once\r
-it has matched, and a failure further into the pattern is prevented from\r
-backtracking into it. Backtracking past it to previous items, however, works as\r
-normal.\r
-\r
-An alternative description is that a subpattern of this type matches the string\r
-of characters that an identical standalone pattern would match, if anchored at\r
-the current point in the subject string.\r
-\r
-Once-only subpatterns are not capturing subpatterns. Simple cases such as the\r
-above example can be thought of as a maximizing repeat that must swallow\r
-everything it can. So, while both \\d+ and \\d+? are prepared to adjust the\r
-number of digits they match in order to make the rest of the pattern match,\r
-(?>\\d+) can only match an entire sequence of digits.\r
-\r
-This construction can of course contain arbitrarily complicated subpatterns,\r
-and it can be nested.\r
-\r
-Once-only subpatterns can be used in conjunction with lookbehind assertions to\r
-specify efficient matching at the end of the subject string. Consider a simple\r
-pattern such as\r
-\r
- abcd$\r
-\r
-when applied to a long string which does not match. Because matching proceeds\r
-from left to right, PCRE will look for each "a" in the subject and then see if\r
-what follows matches the rest of the pattern. If the pattern is specified as\r
-\r
- ^.*abcd$\r
-\r
-the initial .* matches the entire string at first, but when this fails (because\r
-there is no following "a"), it backtracks to match all but the last character,\r
-then all but the last two characters, and so on. Once again the search for "a"\r
-covers the entire string, from right to left, so we are no better off. However,\r
-if the pattern is written as\r
-\r
- ^(?>.*)(?<=abcd)\r
-\r
-there can be no backtracking for the .* item; it can match only the entire\r
-string. The subsequent lookbehind assertion does a single test on the last four\r
-characters. If it fails, the match fails immediately. For long strings, this\r
-approach makes a significant difference to the processing time.\r
-\r
-When a pattern contains an unlimited repeat inside a subpattern that can itself\r
-be repeated an unlimited number of times, the use of a once-only subpattern is\r
-the only way to avoid some failing matches taking a very long time indeed.\r
-The pattern\r
-\r
- (\\D+|<\\d+>)*[!?]\r
-\r
-matches an unlimited number of substrings that either consist of non-digits, or\r
-digits enclosed in <>, followed by either ! or ?. When it matches, it runs\r
-quickly. However, if it is applied to\r
-\r
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r
-\r
-it takes a long time before reporting failure. This is because the string can\r
-be divided between the two repeats in a large number of ways, and all have to\r
-be tried. (The example used [!?] rather than a single character at the end,\r
-because both PCRE and Perl have an optimization that allows for fast failure\r
-when a single character is used. They remember the last single character that\r
-is required for a match, and fail early if it is not present in the string.)\r
-If the pattern is changed to\r
-\r
- ((?>\\D+)|<\\d+>)*[!?]\r
-\r
-sequences of non-digits cannot be broken, and failure happens quickly.\r
-\r
-\r
-.SH CONDITIONAL SUBPATTERNS\r
-It is possible to cause the matching process to obey a subpattern\r
-conditionally or to choose between two alternative subpatterns, depending on\r
-the result of an assertion, or whether a previous capturing subpattern matched\r
-or not. The two possible forms of conditional subpattern are\r
-\r
- (?(condition)yes-pattern)\r
- (?(condition)yes-pattern|no-pattern)\r
-\r
-If the condition is satisfied, the yes-pattern is used; otherwise the\r
-no-pattern (if present) is used. If there are more than two alternatives in the\r
-subpattern, a compile-time error occurs.\r
-\r
-There are two kinds of condition. If the text between the parentheses consists\r
-of a sequence of digits, the condition is satisfied if the capturing subpattern\r
-of that number has previously matched. The number must be greater than zero.\r
-Consider the following pattern, which contains non-significant white space to\r
-make it more readable (assume the PCRE_EXTENDED option) and to divide it into\r
-three parts for ease of discussion:\r
-\r
- ( \\( )? [^()]+ (?(1) \\) )\r
-\r
-The first part matches an optional opening parenthesis, and if that\r
-character is present, sets it as the first captured substring. The second part\r
-matches one or more characters that are not parentheses. The third part is a\r
-conditional subpattern that tests whether the first set of parentheses matched\r
-or not. If they did, that is, if subject started with an opening parenthesis,\r
-the condition is true, and so the yes-pattern is executed and a closing\r
-parenthesis is required. Otherwise, since no-pattern is not present, the\r
-subpattern matches nothing. In other words, this pattern matches a sequence of\r
-non-parentheses, optionally enclosed in parentheses.\r
-\r
-If the condition is not a sequence of digits, it must be an assertion. This may\r
-be a positive or negative lookahead or lookbehind assertion. Consider this\r
-pattern, again containing non-significant white space, and with the two\r
-alternatives on the second line:\r
-\r
- (?(?=[^a-z]*[a-z])\r
- \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} )\r
-\r
-The condition is a positive lookahead assertion that matches an optional\r
-sequence of non-letters followed by a letter. In other words, it tests for the\r
-presence of at least one letter in the subject. If a letter is found, the\r
-subject is matched against the first alternative; otherwise it is matched\r
-against the second. This pattern matches strings in one of the two forms\r
-dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.\r
-\r
-\r
-.SH COMMENTS\r
-The sequence (?# marks the start of a comment which continues up to the next\r
-closing parenthesis. Nested parentheses are not permitted. The characters\r
-that make up a comment play no part in the pattern matching at all.\r
-\r
-If the PCRE_EXTENDED option is set, an unescaped # character outside a\r
-character class introduces a comment that continues up to the next newline\r
-character in the pattern.\r
-\r
-\r
-.SH RECURSIVE PATTERNS\r
-Consider the problem of matching a string in parentheses, allowing for\r
-unlimited nested parentheses. Without the use of recursion, the best that can\r
-be done is to use a pattern that matches up to some fixed depth of nesting. It\r
-is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an\r
-experimental facility that allows regular expressions to recurse (amongst other\r
-things). It does this by interpolating Perl code in the expression at run time,\r
-and the code can refer to the expression itself. A Perl pattern to solve the\r
-parentheses problem can be created like this:\r
-\r
- $re = qr{\\( (?: (?>[^()]+) | (?p{$re}) )* \\)}x;\r
-\r
-The (?p{...}) item interpolates Perl code at run time, and in this case refers\r
-recursively to the pattern in which it appears. Obviously, PCRE cannot support\r
-the interpolation of Perl code. Instead, the special item (?R) is provided for\r
-the specific case of recursion. This PCRE pattern solves the parentheses\r
-problem (assume the PCRE_EXTENDED option is set so that white space is\r
-ignored):\r
-\r
- \\( ( (?>[^()]+) | (?R) )* \\)\r
-\r
-First it matches an opening parenthesis. Then it matches any number of\r
-substrings which can either be a sequence of non-parentheses, or a recursive\r
-match of the pattern itself (i.e. a correctly parenthesized substring). Finally\r
-there is a closing parenthesis.\r
-\r
-This particular example pattern contains nested unlimited repeats, and so the\r
-use of a once-only subpattern for matching strings of non-parentheses is\r
-important when applying the pattern to strings that do not match. For example,\r
-when it is applied to\r
-\r
- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\r
-\r
-it yields "no match" quickly. However, if a once-only subpattern is not used,\r
-the match runs for a very long time indeed because there are so many different\r
-ways the + and * repeats can carve up the subject, and all have to be tested\r
-before failure can be reported.\r
-\r
-The values set for any capturing subpatterns are those from the outermost level\r
-of the recursion at which the subpattern value is set. If the pattern above is\r
-matched against\r
-\r
- (ab(cd)ef)\r
-\r
-the value for the capturing parentheses is "ef", which is the last value taken\r
-on at the top level. If additional parentheses are added, giving\r
-\r
- \\( ( ( (?>[^()]+) | (?R) )* ) \\)\r
- ^ ^\r
- ^ ^\r
-the string they capture is "ab(cd)ef", the contents of the top level\r
-parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE\r
-has to obtain extra memory to store data during a recursion, which it does by\r
-using \fBpcre_malloc\fR, freeing it via \fBpcre_free\fR afterwards. If no\r
-memory can be obtained, it saves data for the first 15 capturing parentheses\r
-only, as there is no way to give an out-of-memory error from within a\r
-recursion.\r
-\r
-\r
-.SH PERFORMANCE\r
-Certain items that may appear in patterns are more efficient than others. It is\r
-more efficient to use a character class like [aeiou] than a set of alternatives\r
-such as (a|e|i|o|u). In general, the simplest construction that provides the\r
-required behaviour is usually the most efficient. Jeffrey Friedl's book\r
-contains a lot of discussion about optimizing regular expressions for efficient\r
-performance.\r
-\r
-When a pattern begins with .* and the PCRE_DOTALL option is set, the pattern is\r
-implicitly anchored by PCRE, since it can match only at the start of a subject\r
-string. However, if PCRE_DOTALL is not set, PCRE cannot make this optimization,\r
-because the . metacharacter does not then match a newline, and if the subject\r
-string contains newlines, the pattern may match from the character immediately\r
-following one of them instead of from the very start. For example, the pattern\r
-\r
- (.*) second\r
-\r
-matches the subject "first\\nand second" (where \\n stands for a newline\r
-character) with the first captured substring being "and". In order to do this,\r
-PCRE has to retry the match starting after every newline in the subject.\r
-\r
-If you are using such a pattern with subject strings that do not contain\r
-newlines, the best performance is obtained by setting PCRE_DOTALL, or starting\r
-the pattern with ^.* to indicate explicit anchoring. That saves PCRE from\r
-having to scan along the subject looking for a newline to restart at.\r
-\r
-Beware of patterns that contain nested indefinite repeats. These can take a\r
-long time to run when applied to a string that does not match. Consider the\r
-pattern fragment\r
-\r
- (a+)*\r
-\r
-This can match "aaaa" in 33 different ways, and this number increases very\r
-rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4\r
-times, and for each of those cases other than 0, the + repeats can match\r
-different numbers of times.) When the remainder of the pattern is such that the\r
-entire match is going to fail, PCRE has in principle to try every possible\r
-variation, and this can take an extremely long time.\r
-\r
-An optimization catches some of the more simple cases such as\r
-\r
- (a+)*b\r
-\r
-where a literal character follows. Before embarking on the standard matching\r
-procedure, PCRE checks that there is a "b" later in the subject string, and if\r
-there is not, it fails the match immediately. However, when there is no\r
-following literal this optimization cannot be used. You can see the difference\r
-by comparing the behaviour of\r
-\r
- (a+)*\\d\r
-\r
-with the pattern above. The former gives a failure almost instantly when\r
-applied to a whole line of "a" characters, whereas the latter takes an\r
-appreciable time with strings longer than about 20 characters.\r
-\r
-\r
-.SH UTF-8 SUPPORT\r
-Starting at release 3.3, PCRE has some support for character strings encoded\r
-in the UTF-8 format. This is incomplete, and is regarded as experimental. In\r
-order to use it, you must configure PCRE to include UTF-8 support in the code,\r
-and, in addition, you must call \fBpcre_compile()\fR with the PCRE_UTF8 option\r
-flag. When you do this, both the pattern and any subject strings that are\r
-matched against it are treated as UTF-8 strings instead of just strings of\r
-bytes, but only in the cases that are mentioned below.\r
-\r
-If you compile PCRE with UTF-8 support, but do not use it at run time, the\r
-library will be a bit bigger, but the additional run time overhead is limited\r
-to testing the PCRE_UTF8 flag in several places, so should not be very large.\r
-\r
-PCRE assumes that the strings it is given contain valid UTF-8 codes. It does\r
-not diagnose invalid UTF-8 strings. If you pass invalid UTF-8 strings to PCRE,\r
-the results are undefined.\r
-\r
-Running with PCRE_UTF8 set causes these changes in the way PCRE works:\r
-\r
-1. In a pattern, the escape sequence \\x{...}, where the contents of the braces\r
-is a string of hexadecimal digits, is interpreted as a UTF-8 character whose\r
-code number is the given hexadecimal number, for example: \\x{1234}. This\r
-inserts from one to six literal bytes into the pattern, using the UTF-8\r
-encoding. If a non-hexadecimal digit appears between the braces, the item is\r
-not recognized.\r
-\r
-2. The original hexadecimal escape sequence, \\xhh, generates a two-byte UTF-8\r
-character if its value is greater than 127.\r
-\r
-3. Repeat quantifiers are NOT correctly handled if they follow a multibyte\r
-character. For example, \\x{100}* and \\xc3+ do not work. If you want to\r
-repeat such characters, you must enclose them in non-capturing parentheses,\r
-for example (?:\\x{100}), at present.\r
-\r
-4. The dot metacharacter matches one UTF-8 character instead of a single byte.\r
-\r
-5. Unlike literal UTF-8 characters, the dot metacharacter followed by a\r
-repeat quantifier does operate correctly on UTF-8 characters instead of\r
-single bytes.\r
-\r
-4. Although the \\x{...} escape is permitted in a character class, characters\r
-whose values are greater than 255 cannot be included in a class.\r
-\r
-5. A class is matched against a UTF-8 character instead of just a single byte,\r
-but it can match only characters whose values are less than 256. Characters\r
-with greater values always fail to match a class.\r
-\r
-6. Repeated classes work correctly on multiple characters.\r
-\r
-7. Classes containing just a single character whose value is greater than 127\r
-(but less than 256), for example, [\\x80] or [^\\x{93}], do not work because\r
-these are optimized into single byte matches. In the first case, of course,\r
-the class brackets are just redundant.\r
-\r
-8. Lookbehind assertions move backwards in the subject by a fixed number of\r
-characters instead of a fixed number of bytes. Simple cases have been tested\r
-to work correctly, but there may be hidden gotchas herein.\r
-\r
-9. The character types such as \\d and \\w do not work correctly with UTF-8\r
-characters. They continue to test a single byte.\r
-\r
-10. Anything not explicitly mentioned here continues to work in bytes rather\r
-than in characters.\r
-\r
-The following UTF-8 features of Perl 5.6 are not implemented:\r
-\r
-1. The escape sequence \\C to match a single byte.\r
-\r
-2. The use of Unicode tables and properties and escapes \\p, \\P, and \\X.\r
-\r
-.SH AUTHOR\r
-Philip Hazel <ph10@cam.ac.uk>\r
-.br\r
-University Computing Service,\r
-.br\r
-New Museums Site,\r
-.br\r
-Cambridge CB2 3QG, England.\r
-.br\r
-Phone: +44 1223 334714\r
-\r
-Last updated: 28 August 2000,\r
-.br\r
- the 250th anniversary of the death of J.S. Bach.\r
-.br\r
-Copyright (c) 1997-2000 University of Cambridge.\r
+++ /dev/null
-<HTML>\r
-<HEAD>\r
-<TITLE>pcre specification</TITLE>\r
-</HEAD>\r
-<body bgcolor="#FFFFFF" text="#00005A">\r
-<H1>pcre specification</H1>\r
-This HTML document has been generated automatically from the original man page.\r
-If there is any nonsense in it, please consult the man page in case the\r
-conversion went wrong.\r
-<UL>\r
-<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>\r
-<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>\r
-<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>\r
-<LI><A NAME="TOC4" HREF="#SEC4">MULTI-THREADING</A>\r
-<LI><A NAME="TOC5" HREF="#SEC5">COMPILING A PATTERN</A>\r
-<LI><A NAME="TOC6" HREF="#SEC6">STUDYING A PATTERN</A>\r
-<LI><A NAME="TOC7" HREF="#SEC7">LOCALE SUPPORT</A>\r
-<LI><A NAME="TOC8" HREF="#SEC8">INFORMATION ABOUT A PATTERN</A>\r
-<LI><A NAME="TOC9" HREF="#SEC9">MATCHING A PATTERN</A>\r
-<LI><A NAME="TOC10" HREF="#SEC10">EXTRACTING CAPTURED SUBSTRINGS</A>\r
-<LI><A NAME="TOC11" HREF="#SEC11">LIMITATIONS</A>\r
-<LI><A NAME="TOC12" HREF="#SEC12">DIFFERENCES FROM PERL</A>\r
-<LI><A NAME="TOC13" HREF="#SEC13">REGULAR EXPRESSION DETAILS</A>\r
-<LI><A NAME="TOC14" HREF="#SEC14">BACKSLASH</A>\r
-<LI><A NAME="TOC15" HREF="#SEC15">CIRCUMFLEX AND DOLLAR</A>\r
-<LI><A NAME="TOC16" HREF="#SEC16">FULL STOP (PERIOD, DOT)</A>\r
-<LI><A NAME="TOC17" HREF="#SEC17">SQUARE BRACKETS</A>\r
-<LI><A NAME="TOC18" HREF="#SEC18">POSIX CHARACTER CLASSES</A>\r
-<LI><A NAME="TOC19" HREF="#SEC19">VERTICAL BAR</A>\r
-<LI><A NAME="TOC20" HREF="#SEC20">INTERNAL OPTION SETTING</A>\r
-<LI><A NAME="TOC21" HREF="#SEC21">SUBPATTERNS</A>\r
-<LI><A NAME="TOC22" HREF="#SEC22">REPETITION</A>\r
-<LI><A NAME="TOC23" HREF="#SEC23">BACK REFERENCES</A>\r
-<LI><A NAME="TOC24" HREF="#SEC24">ASSERTIONS</A>\r
-<LI><A NAME="TOC25" HREF="#SEC25">ONCE-ONLY SUBPATTERNS</A>\r
-<LI><A NAME="TOC26" HREF="#SEC26">CONDITIONAL SUBPATTERNS</A>\r
-<LI><A NAME="TOC27" HREF="#SEC27">COMMENTS</A>\r
-<LI><A NAME="TOC28" HREF="#SEC28">RECURSIVE PATTERNS</A>\r
-<LI><A NAME="TOC29" HREF="#SEC29">PERFORMANCE</A>\r
-<LI><A NAME="TOC30" HREF="#SEC30">UTF-8 SUPPORT</A>\r
-<LI><A NAME="TOC31" HREF="#SEC31">AUTHOR</A>\r
-</UL>\r
-<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>\r
-<P>\r
-pcre - Perl-compatible regular expressions.\r
-</P>\r
-<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>\r
-<P>\r
-<B>#include <pcre.h></B>\r
-</P>\r
-<P>\r
-<B>pcre *pcre_compile(const char *<I>pattern</I>, int <I>options</I>,</B>\r
-<B>const char **<I>errptr</I>, int *<I>erroffset</I>,</B>\r
-<B>const unsigned char *<I>tableptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>pcre_extra *pcre_study(const pcre *<I>code</I>, int <I>options</I>,</B>\r
-<B>const char **<I>errptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_exec(const pcre *<I>code</I>, const pcre_extra *<I>extra</I>,</B>\r
-<B>const char *<I>subject</I>, int <I>length</I>, int <I>startoffset</I>,</B>\r
-<B>int <I>options</I>, int *<I>ovector</I>, int <I>ovecsize</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_copy_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B>\r
-<B>int <I>stringcount</I>, int <I>stringnumber</I>, char *<I>buffer</I>,</B>\r
-<B>int <I>buffersize</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_get_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B>\r
-<B>int <I>stringcount</I>, int <I>stringnumber</I>,</B>\r
-<B>const char **<I>stringptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_get_substring_list(const char *<I>subject</I>,</B>\r
-<B>int *<I>ovector</I>, int <I>stringcount</I>, const char ***<I>listptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>void pcre_free_substring(const char *<I>stringptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>void pcre_free_substring_list(const char **<I>stringptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>const unsigned char *pcre_maketables(void);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_fullinfo(const pcre *<I>code</I>, const pcre_extra *<I>extra</I>,</B>\r
-<B>int <I>what</I>, void *<I>where</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_info(const pcre *<I>code</I>, int *<I>optptr</I>, int</B>\r
-<B>*<I>firstcharptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>char *pcre_version(void);</B>\r
-</P>\r
-<P>\r
-<B>void *(*pcre_malloc)(size_t);</B>\r
-</P>\r
-<P>\r
-<B>void (*pcre_free)(void *);</B>\r
-</P>\r
-<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>\r
-<P>\r
-The PCRE library is a set of functions that implement regular expression\r
-pattern matching using the same syntax and semantics as Perl 5, with just a few\r
-differences (see below). The current implementation corresponds to Perl 5.005,\r
-with some additional features from later versions. This includes some\r
-experimental, incomplete support for UTF-8 encoded strings. Details of exactly\r
-what is and what is not supported are given below.\r
-</P>\r
-<P>\r
-PCRE has its own native API, which is described in this document. There is also\r
-a set of wrapper functions that correspond to the POSIX regular expression API.\r
-These are described in the <B>pcreposix</B> documentation.\r
-</P>\r
-<P>\r
-The native API function prototypes are defined in the header file <B>pcre.h</B>,\r
-and on Unix systems the library itself is called <B>libpcre.a</B>, so can be\r
-accessed by adding <B>-lpcre</B> to the command for linking an application which\r
-calls it. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to\r
-contain the major and minor release numbers for the library. Applications can\r
-use these to include support for different releases.\r
-</P>\r
-<P>\r
-The functions <B>pcre_compile()</B>, <B>pcre_study()</B>, and <B>pcre_exec()</B>\r
-are used for compiling and matching regular expressions.\r
-</P>\r
-<P>\r
-The functions <B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and\r
-<B>pcre_get_substring_list()</B> are convenience functions for extracting\r
-captured substrings from a matched subject string; <B>pcre_free_substring()</B>\r
-and <B>pcre_free_substring_list()</B> are also provided, to free the memory used\r
-for extracted strings.\r
-</P>\r
-<P>\r
-The function <B>pcre_maketables()</B> is used (optionally) to build a set of\r
-character tables in the current locale for passing to <B>pcre_compile()</B>.\r
-</P>\r
-<P>\r
-The function <B>pcre_fullinfo()</B> is used to find out information about a\r
-compiled pattern; <B>pcre_info()</B> is an obsolete version which returns only\r
-some of the available information, but is retained for backwards compatibility.\r
-The function <B>pcre_version()</B> returns a pointer to a string containing the\r
-version of PCRE and its date of release.\r
-</P>\r
-<P>\r
-The global variables <B>pcre_malloc</B> and <B>pcre_free</B> initially contain\r
-the entry points of the standard <B>malloc()</B> and <B>free()</B> functions\r
-respectively. PCRE calls the memory management functions via these variables,\r
-so a calling program can replace them if it wishes to intercept the calls. This\r
-should be done before calling any PCRE functions.\r
-</P>\r
-<LI><A NAME="SEC4" HREF="#TOC1">MULTI-THREADING</A>\r
-<P>\r
-The PCRE functions can be used in multi-threading applications, with the\r
-proviso that the memory management functions pointed to by <B>pcre_malloc</B>\r
-and <B>pcre_free</B> are shared by all threads.\r
-</P>\r
-<P>\r
-The compiled form of a regular expression is not altered during matching, so\r
-the same compiled pattern can safely be used by several threads at once.\r
-</P>\r
-<LI><A NAME="SEC5" HREF="#TOC1">COMPILING A PATTERN</A>\r
-<P>\r
-The function <B>pcre_compile()</B> is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument <I>pattern</I>. A pointer to a single block of memory\r
-that is obtained via <B>pcre_malloc</B> is returned. This contains the\r
-compiled code and related data. The <B>pcre</B> type is defined for this for\r
-convenience, but in fact <B>pcre</B> is just a typedef for <B>void</B>, since the\r
-contents of the block are not externally defined. It is up to the caller to\r
-free the memory when it is no longer required.\r
-</P>\r
-<P>\r
-The size of a compiled pattern is roughly proportional to the length of the\r
-pattern string, except that each character class (other than those containing\r
-just a single character, negated or not) requires 33 bytes, and repeat\r
-quantifiers with a minimum greater than one or a bounded maximum cause the\r
-relevant portions of the compiled pattern to be replicated.\r
-</P>\r
-<P>\r
-The <I>options</I> argument contains independent bits that affect the\r
-compilation. It should be zero if no options are required. Some of the options,\r
-in particular, those that are compatible with Perl, can also be set and unset\r
-from within the pattern (see the detailed description of regular expressions\r
-below). For these options, the contents of the <I>options</I> argument specifies\r
-their initial settings at the start of compilation and execution. The\r
-PCRE_ANCHORED option can be set at the time of matching as well as at compile\r
-time.\r
-</P>\r
-<P>\r
-If <I>errptr</I> is NULL, <B>pcre_compile()</B> returns NULL immediately.\r
-Otherwise, if compilation of a pattern fails, <B>pcre_compile()</B> returns\r
-NULL, and sets the variable pointed to by <I>errptr</I> to point to a textual\r
-error message. The offset from the start of the pattern to the character where\r
-the error was discovered is placed in the variable pointed to by\r
-<I>erroffset</I>, which must not be NULL. If it is, an immediate error is given.\r
-</P>\r
-<P>\r
-If the final argument, <I>tableptr</I>, is NULL, PCRE uses a default set of\r
-character tables which are built when it is compiled, using the default C\r
-locale. Otherwise, <I>tableptr</I> must be the result of a call to\r
-<B>pcre_maketables()</B>. See the section on locale support below.\r
-</P>\r
-<P>\r
-The following option bits are defined in the header file:\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ANCHORED\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, the pattern is forced to be "anchored", that is, it is\r
-constrained to match only at the start of the string which is being searched\r
-(the "subject string"). This effect can also be achieved by appropriate\r
-constructs in the pattern itself, which is the only way to do it in Perl.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_CASELESS\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, letters in the pattern match both upper and lower case\r
-letters. It is equivalent to Perl's /i option.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_DOLLAR_ENDONLY\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, a dollar metacharacter in the pattern matches only at the\r
-end of the subject string. Without this option, a dollar also matches\r
-immediately before the final character if it is a newline (but not before any\r
-other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is\r
-set. There is no equivalent to this option in Perl.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_DOTALL\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, a dot metacharater in the pattern matches all characters,\r
-including newlines. Without it, newlines are excluded. This option is\r
-equivalent to Perl's /s option. A negative class such as [^a] always matches a\r
-newline character, independent of the setting of this option.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_EXTENDED\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, whitespace data characters in the pattern are totally\r
-ignored except when escaped or inside a character class, and characters between\r
-an unescaped # outside a character class and the next newline character,\r
-inclusive, are also ignored. This is equivalent to Perl's /x option, and makes\r
-it possible to include comments inside complicated patterns. Note, however,\r
-that this applies only to data characters. Whitespace characters may never\r
-appear within special character sequences in a pattern, for example within the\r
-sequence (?( which introduces a conditional subpattern.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_EXTRA\r
-</PRE>\r
-</P>\r
-<P>\r
-This option was invented in order to turn on additional functionality of PCRE\r
-that is incompatible with Perl, but it is currently of very little use. When\r
-set, any backslash in a pattern that is followed by a letter that has no\r
-special meaning causes an error, thus reserving these combinations for future\r
-expansion. By default, as in Perl, a backslash followed by a letter with no\r
-special meaning is treated as a literal. There are at present no other features\r
-controlled by this option. It can also be set by a (?X) option setting within a\r
-pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_MULTILINE\r
-</PRE>\r
-</P>\r
-<P>\r
-By default, PCRE treats the subject string as consisting of a single "line" of\r
-characters (even if it actually contains several newlines). The "start of line"\r
-metacharacter (^) matches only at the start of the string, while the "end of\r
-line" metacharacter ($) matches only at the end of the string, or before a\r
-terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as\r
-Perl.\r
-</P>\r
-<P>\r
-When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs\r
-match immediately following or immediately before any newline in the subject\r
-string, respectively, as well as at the very start and end. This is equivalent\r
-to Perl's /m option. If there are no "\n" characters in a subject string, or\r
-no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no\r
-effect.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_UNGREEDY\r
-</PRE>\r
-</P>\r
-<P>\r
-This option inverts the "greediness" of the quantifiers so that they are not\r
-greedy by default, but become greedy if followed by "?". It is not compatible\r
-with Perl. It can also be set by a (?U) option setting within the pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_UTF8\r
-</PRE>\r
-</P>\r
-<P>\r
-This option causes PCRE to regard both the pattern and the subject as strings\r
-of UTF-8 characters instead of just byte strings. However, it is available only\r
-if PCRE has been built to include UTF-8 support. If not, the use of this option\r
-provokes an error. Support for UTF-8 is new, experimental, and incomplete.\r
-Details of exactly what it entails are given below.\r
-</P>\r
-<LI><A NAME="SEC6" HREF="#TOC1">STUDYING A PATTERN</A>\r
-<P>\r
-When a pattern is going to be used several times, it is worth spending more\r
-time analyzing it in order to speed up the time taken for matching. The\r
-function <B>pcre_study()</B> takes a pointer to a compiled pattern as its first\r
-argument, and returns a pointer to a <B>pcre_extra</B> block (another <B>void</B>\r
-typedef) containing additional information about the pattern; this can be\r
-passed to <B>pcre_exec()</B>. If no additional information is available, NULL\r
-is returned.\r
-</P>\r
-<P>\r
-The second argument contains option bits. At present, no options are defined\r
-for <B>pcre_study()</B>, and this argument should always be zero.\r
-</P>\r
-<P>\r
-The third argument for <B>pcre_study()</B> is a pointer to an error message. If\r
-studying succeeds (even if no data is returned), the variable it points to is\r
-set to NULL. Otherwise it points to a textual error message.\r
-</P>\r
-<P>\r
-At present, studying a pattern is useful only for non-anchored patterns that do\r
-not have a single fixed starting character. A bitmap of possible starting\r
-characters is created.\r
-</P>\r
-<LI><A NAME="SEC7" HREF="#TOC1">LOCALE SUPPORT</A>\r
-<P>\r
-PCRE handles caseless matching, and determines whether characters are letters,\r
-digits, or whatever, by reference to a set of tables. The library contains a\r
-default set of tables which is created in the default C locale when PCRE is\r
-compiled. This is used when the final argument of <B>pcre_compile()</B> is NULL,\r
-and is sufficient for many applications.\r
-</P>\r
-<P>\r
-An alternative set of tables can, however, be supplied. Such tables are built\r
-by calling the <B>pcre_maketables()</B> function, which has no arguments, in the\r
-relevant locale. The result can then be passed to <B>pcre_compile()</B> as often\r
-as necessary. For example, to build and use tables that are appropriate for the\r
-French locale (where accented characters with codes greater than 128 are\r
-treated as letters), the following code could be used:\r
-</P>\r
-<P>\r
-<PRE>\r
- setlocale(LC_CTYPE, "fr");\r
- tables = pcre_maketables();\r
- re = pcre_compile(..., tables);\r
-</PRE>\r
-</P>\r
-<P>\r
-The tables are built in memory that is obtained via <B>pcre_malloc</B>. The\r
-pointer that is passed to <B>pcre_compile</B> is saved with the compiled\r
-pattern, and the same tables are used via this pointer by <B>pcre_study()</B>\r
-and <B>pcre_exec()</B>. Thus for any single pattern, compilation, studying and\r
-matching all happen in the same locale, but different patterns can be compiled\r
-in different locales. It is the caller's responsibility to ensure that the\r
-memory containing the tables remains available for as long as it is needed.\r
-</P>\r
-<LI><A NAME="SEC8" HREF="#TOC1">INFORMATION ABOUT A PATTERN</A>\r
-<P>\r
-The <B>pcre_fullinfo()</B> function returns information about a compiled\r
-pattern. It replaces the obsolete <B>pcre_info()</B> function, which is\r
-nevertheless retained for backwards compability (and is documented below).\r
-</P>\r
-<P>\r
-The first argument for <B>pcre_fullinfo()</B> is a pointer to the compiled\r
-pattern. The second argument is the result of <B>pcre_study()</B>, or NULL if\r
-the pattern was not studied. The third argument specifies which piece of\r
-information is required, while the fourth argument is a pointer to a variable\r
-to receive the data. The yield of the function is zero for success, or one of\r
-the following negative numbers:\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NULL the argument <I>code</I> was NULL\r
- the argument <I>where</I> was NULL\r
- PCRE_ERROR_BADMAGIC the "magic number" was not found\r
- PCRE_ERROR_BADOPTION the value of <I>what</I> was invalid\r
-</PRE>\r
-</P>\r
-<P>\r
-The possible values for the third argument are defined in <B>pcre.h</B>, and are\r
-as follows:\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_INFO_OPTIONS\r
-</PRE>\r
-</P>\r
-<P>\r
-Return a copy of the options with which the pattern was compiled. The fourth\r
-argument should point to au <B>unsigned long int</B> variable. These option bits\r
-are those specified in the call to <B>pcre_compile()</B>, modified by any\r
-top-level option settings within the pattern itself, and with the PCRE_ANCHORED\r
-bit forcibly set if the form of the pattern implies that it can match only at\r
-the start of a subject string.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_INFO_SIZE\r
-</PRE>\r
-</P>\r
-<P>\r
-Return the size of the compiled pattern, that is, the value that was passed as\r
-the argument to <B>pcre_malloc()</B> when PCRE was getting memory in which to\r
-place the compiled data. The fourth argument should point to a <B>size_t</B>\r
-variable.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_INFO_CAPTURECOUNT\r
-</PRE>\r
-</P>\r
-<P>\r
-Return the number of capturing subpatterns in the pattern. The fourth argument\r
-should point to an \fbint\fR variable.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_INFO_BACKREFMAX\r
-</PRE>\r
-</P>\r
-<P>\r
-Return the number of the highest back reference in the pattern. The fourth\r
-argument should point to an <B>int</B> variable. Zero is returned if there are\r
-no back references.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_INFO_FIRSTCHAR\r
-</PRE>\r
-</P>\r
-<P>\r
-Return information about the first character of any matched string, for a\r
-non-anchored pattern. If there is a fixed first character, e.g. from a pattern\r
-such as (cat|cow|coyote), it is returned in the integer pointed to by\r
-<I>where</I>. Otherwise, if either\r
-</P>\r
-<P>\r
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\r
-starts with "^", or\r
-</P>\r
-<P>\r
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set\r
-(if it were set, the pattern would be anchored),\r
-</P>\r
-<P>\r
--1 is returned, indicating that the pattern matches only at the start of a\r
-subject string or after any "\n" within the string. Otherwise -2 is returned.\r
-For anchored patterns, -2 is returned.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_INFO_FIRSTTABLE\r
-</PRE>\r
-</P>\r
-<P>\r
-If the pattern was studied, and this resulted in the construction of a 256-bit\r
-table indicating a fixed set of characters for the first character in any\r
-matching string, a pointer to the table is returned. Otherwise NULL is\r
-returned. The fourth argument should point to an <B>unsigned char *</B>\r
-variable.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_INFO_LASTLITERAL\r
-</PRE>\r
-</P>\r
-<P>\r
-For a non-anchored pattern, return the value of the rightmost literal character\r
-which must exist in any matched string, other than at its start. The fourth\r
-argument should point to an <B>int</B> variable. If there is no such character,\r
-or if the pattern is anchored, -1 is returned. For example, for the pattern\r
-/a\d+z\d+/ the returned value is 'z'.\r
-</P>\r
-<P>\r
-The <B>pcre_info()</B> function is now obsolete because its interface is too\r
-restrictive to return all the available data about a compiled pattern. New\r
-programs should use <B>pcre_fullinfo()</B> instead. The yield of\r
-<B>pcre_info()</B> is the number of capturing subpatterns, or one of the\r
-following negative numbers:\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NULL the argument <I>code</I> was NULL\r
- PCRE_ERROR_BADMAGIC the "magic number" was not found\r
-</PRE>\r
-</P>\r
-<P>\r
-If the <I>optptr</I> argument is not NULL, a copy of the options with which the\r
-pattern was compiled is placed in the integer it points to (see\r
-PCRE_INFO_OPTIONS above).\r
-</P>\r
-<P>\r
-If the pattern is not anchored and the <I>firstcharptr</I> argument is not NULL,\r
-it is used to pass back information about the first character of any matched\r
-string (see PCRE_INFO_FIRSTCHAR above).\r
-</P>\r
-<LI><A NAME="SEC9" HREF="#TOC1">MATCHING A PATTERN</A>\r
-<P>\r
-The function <B>pcre_exec()</B> is called to match a subject string against a\r
-pre-compiled pattern, which is passed in the <I>code</I> argument. If the\r
-pattern has been studied, the result of the study should be passed in the\r
-<I>extra</I> argument. Otherwise this must be NULL.\r
-</P>\r
-<P>\r
-The PCRE_ANCHORED option can be passed in the <I>options</I> argument, whose\r
-unused bits must be zero. However, if a pattern was compiled with\r
-PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it\r
-cannot be made unachored at matching time.\r
-</P>\r
-<P>\r
-There are also three further options that can be set only at matching time:\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_NOTBOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The first character of the string is not the beginning of a line, so the\r
-circumflex metacharacter should not match before it. Setting this without\r
-PCRE_MULTILINE (at compile time) causes circumflex never to match.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_NOTEOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The end of the string is not the end of a line, so the dollar metacharacter\r
-should not match it nor (except in multiline mode) a newline immediately before\r
-it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never\r
-to match.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_NOTEMPTY\r
-</PRE>\r
-</P>\r
-<P>\r
-An empty string is not considered to be a valid match if this option is set. If\r
-there are alternatives in the pattern, they are tried. If all the alternatives\r
-match the empty string, the entire match fails. For example, if the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- a?b?\r
-</PRE>\r
-</P>\r
-<P>\r
-is applied to a string not beginning with "a" or "b", it matches the empty\r
-string at the start of the subject. With PCRE_NOTEMPTY set, this match is not\r
-valid, so PCRE searches further into the string for occurrences of "a" or "b".\r
-</P>\r
-<P>\r
-Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case\r
-of a pattern match of the empty string within its <B>split()</B> function, and\r
-when using the /g modifier. It is possible to emulate Perl's behaviour after\r
-matching a null string by first trying the match again at the same offset with\r
-PCRE_NOTEMPTY set, and then if that fails by advancing the starting offset (see\r
-below) and trying an ordinary match again.\r
-</P>\r
-<P>\r
-The subject string is passed as a pointer in <I>subject</I>, a length in\r
-<I>length</I>, and a starting offset in <I>startoffset</I>. Unlike the pattern\r
-string, it may contain binary zero characters. When the starting offset is\r
-zero, the search for a match starts at the beginning of the subject, and this\r
-is by far the most common case.\r
-</P>\r
-<P>\r
-A non-zero starting offset is useful when searching for another match in the\r
-same subject by calling <B>pcre_exec()</B> again after a previous success.\r
-Setting <I>startoffset</I> differs from just passing over a shortened string and\r
-setting PCRE_NOTBOL in the case of a pattern that begins with any kind of\r
-lookbehind. For example, consider the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- \Biss\B\r
-</PRE>\r
-</P>\r
-<P>\r
-which finds occurrences of "iss" in the middle of words. (\B matches only if\r
-the current position in the subject is not a word boundary.) When applied to\r
-the string "Mississipi" the first call to <B>pcre_exec()</B> finds the first\r
-occurrence. If <B>pcre_exec()</B> is called again with just the remainder of the\r
-subject, namely "issipi", it does not match, because \B is always false at the\r
-start of the subject, which is deemed to be a word boundary. However, if\r
-<B>pcre_exec()</B> is passed the entire string again, but with <I>startoffset</I>\r
-set to 4, it finds the second occurrence of "iss" because it is able to look\r
-behind the starting point to discover that it is preceded by a letter.\r
-</P>\r
-<P>\r
-If a non-zero starting offset is passed when the pattern is anchored, one\r
-attempt to match at the given offset is tried. This can only succeed if the\r
-pattern does not require the match to be at the start of the subject.\r
-</P>\r
-<P>\r
-In general, a pattern matches a certain portion of the subject, and in\r
-addition, further substrings from the subject may be picked out by parts of the\r
-pattern. Following the usage in Jeffrey Friedl's book, this is called\r
-"capturing" in what follows, and the phrase "capturing subpattern" is used for\r
-a fragment of a pattern that picks out a substring. PCRE supports several other\r
-kinds of parenthesized subpattern that do not cause substrings to be captured.\r
-</P>\r
-<P>\r
-Captured substrings are returned to the caller via a vector of integer offsets\r
-whose address is passed in <I>ovector</I>. The number of elements in the vector\r
-is passed in <I>ovecsize</I>. The first two-thirds of the vector is used to pass\r
-back captured substrings, each substring using a pair of integers. The\r
-remaining third of the vector is used as workspace by <B>pcre_exec()</B> while\r
-matching capturing subpatterns, and is not available for passing back\r
-information. The length passed in <I>ovecsize</I> should always be a multiple of\r
-three. If it is not, it is rounded down.\r
-</P>\r
-<P>\r
-When a match has been successful, information about captured substrings is\r
-returned in pairs of integers, starting at the beginning of <I>ovector</I>, and\r
-continuing up to two-thirds of its length at the most. The first element of a\r
-pair is set to the offset of the first character in a substring, and the second\r
-is set to the offset of the first character after the end of a substring. The\r
-first pair, <I>ovector[0]</I> and <I>ovector[1]</I>, identify the portion of the\r
-subject string matched by the entire pattern. The next pair is used for the\r
-first capturing subpattern, and so on. The value returned by <B>pcre_exec()</B>\r
-is the number of pairs that have been set. If there are no capturing\r
-subpatterns, the return value from a successful match is 1, indicating that\r
-just the first pair of offsets has been set.\r
-</P>\r
-<P>\r
-Some convenience functions are provided for extracting the captured substrings\r
-as separate strings. These are described in the following section.\r
-</P>\r
-<P>\r
-It is possible for an capturing subpattern number <I>n+1</I> to match some\r
-part of the subject when subpattern <I>n</I> has not been used at all. For\r
-example, if the string "abc" is matched against the pattern (a|(z))(bc)\r
-subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset\r
-values corresponding to the unused subpattern are set to -1.\r
-</P>\r
-<P>\r
-If a capturing subpattern is matched repeatedly, it is the last portion of the\r
-string that it matched that gets returned.\r
-</P>\r
-<P>\r
-If the vector is too small to hold all the captured substrings, it is used as\r
-far as possible (up to two-thirds of its length), and the function returns a\r
-value of zero. In particular, if the substring offsets are not of interest,\r
-<B>pcre_exec()</B> may be called with <I>ovector</I> passed as NULL and\r
-<I>ovecsize</I> as zero. However, if the pattern contains back references and\r
-the <I>ovector</I> isn't big enough to remember the related substrings, PCRE has\r
-to get additional memory for use during matching. Thus it is usually advisable\r
-to supply an <I>ovector</I>.\r
-</P>\r
-<P>\r
-Note that <B>pcre_info()</B> can be used to find out how many capturing\r
-subpatterns there are in a compiled pattern. The smallest size for\r
-<I>ovector</I> that will allow for <I>n</I> captured substrings in addition to\r
-the offsets of the substring matched by the whole pattern is (<I>n</I>+1)*3.\r
-</P>\r
-<P>\r
-If <B>pcre_exec()</B> fails, it returns a negative number. The following are\r
-defined in the header file:\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NOMATCH (-1)\r
-</PRE>\r
-</P>\r
-<P>\r
-The subject string did not match the pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NULL (-2)\r
-</PRE>\r
-</P>\r
-<P>\r
-Either <I>code</I> or <I>subject</I> was passed as NULL, or <I>ovector</I> was\r
-NULL and <I>ovecsize</I> was not zero.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_BADOPTION (-3)\r
-</PRE>\r
-</P>\r
-<P>\r
-An unrecognized bit was set in the <I>options</I> argument.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_BADMAGIC (-4)\r
-</PRE>\r
-</P>\r
-<P>\r
-PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch\r
-the case when it is passed a junk pointer. This is the error it gives when the\r
-magic number isn't present.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_UNKNOWN_NODE (-5)\r
-</PRE>\r
-</P>\r
-<P>\r
-While running the pattern match, an unknown item was encountered in the\r
-compiled pattern. This error could be caused by a bug in PCRE or by overwriting\r
-of the compiled pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NOMEMORY (-6)\r
-</PRE>\r
-</P>\r
-<P>\r
-If a pattern contains back references, but the <I>ovector</I> that is passed to\r
-<B>pcre_exec()</B> is not big enough to remember the referenced substrings, PCRE\r
-gets a block of memory at the start of matching to use for this purpose. If the\r
-call via <B>pcre_malloc()</B> fails, this error is given. The memory is freed at\r
-the end of matching.\r
-</P>\r
-<LI><A NAME="SEC10" HREF="#TOC1">EXTRACTING CAPTURED SUBSTRINGS</A>\r
-<P>\r
-Captured substrings can be accessed directly by using the offsets returned by\r
-<B>pcre_exec()</B> in <I>ovector</I>. For convenience, the functions\r
-<B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and\r
-<B>pcre_get_substring_list()</B> are provided for extracting captured substrings\r
-as new, separate, zero-terminated strings. A substring that contains a binary\r
-zero is correctly extracted and has a further zero added on the end, but the\r
-result does not, of course, function as a C string.\r
-</P>\r
-<P>\r
-The first three arguments are the same for all three functions: <I>subject</I>\r
-is the subject string which has just been successfully matched, <I>ovector</I>\r
-is a pointer to the vector of integer offsets that was passed to\r
-<B>pcre_exec()</B>, and <I>stringcount</I> is the number of substrings that\r
-were captured by the match, including the substring that matched the entire\r
-regular expression. This is the value returned by <B>pcre_exec</B> if it\r
-is greater than zero. If <B>pcre_exec()</B> returned zero, indicating that it\r
-ran out of space in <I>ovector</I>, the value passed as <I>stringcount</I> should\r
-be the size of the vector divided by three.\r
-</P>\r
-<P>\r
-The functions <B>pcre_copy_substring()</B> and <B>pcre_get_substring()</B>\r
-extract a single substring, whose number is given as <I>stringnumber</I>. A\r
-value of zero extracts the substring that matched the entire pattern, while\r
-higher values extract the captured substrings. For <B>pcre_copy_substring()</B>,\r
-the string is placed in <I>buffer</I>, whose length is given by\r
-<I>buffersize</I>, while for <B>pcre_get_substring()</B> a new block of memory is\r
-obtained via <B>pcre_malloc</B>, and its address is returned via\r
-<I>stringptr</I>. The yield of the function is the length of the string, not\r
-including the terminating zero, or one of\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NOMEMORY (-6)\r
-</PRE>\r
-</P>\r
-<P>\r
-The buffer was too small for <B>pcre_copy_substring()</B>, or the attempt to get\r
-memory failed for <B>pcre_get_substring()</B>.\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NOSUBSTRING (-7)\r
-</PRE>\r
-</P>\r
-<P>\r
-There is no substring whose number is <I>stringnumber</I>.\r
-</P>\r
-<P>\r
-The <B>pcre_get_substring_list()</B> function extracts all available substrings\r
-and builds a list of pointers to them. All this is done in a single block of\r
-memory which is obtained via <B>pcre_malloc</B>. The address of the memory block\r
-is returned via <I>listptr</I>, which is also the start of the list of string\r
-pointers. The end of the list is marked by a NULL pointer. The yield of the\r
-function is zero if all went well, or\r
-</P>\r
-<P>\r
-<PRE>\r
- PCRE_ERROR_NOMEMORY (-6)\r
-</PRE>\r
-</P>\r
-<P>\r
-if the attempt to get the memory block failed.\r
-</P>\r
-<P>\r
-When any of these functions encounter a substring that is unset, which can\r
-happen when capturing subpattern number <I>n+1</I> matches some part of the\r
-subject, but subpattern <I>n</I> has not been used at all, they return an empty\r
-string. This can be distinguished from a genuine zero-length substring by\r
-inspecting the appropriate offset in <I>ovector</I>, which is negative for unset\r
-substrings.\r
-</P>\r
-<P>\r
-The two convenience functions <B>pcre_free_substring()</B> and\r
-<B>pcre_free_substring_list()</B> can be used to free the memory returned by\r
-a previous call of <B>pcre_get_substring()</B> or\r
-<B>pcre_get_substring_list()</B>, respectively. They do nothing more than call\r
-the function pointed to by <B>pcre_free</B>, which of course could be called\r
-directly from a C program. However, PCRE is used in some situations where it is\r
-linked via a special interface to another programming language which cannot use\r
-<B>pcre_free</B> directly; it is for these cases that the functions are\r
-provided.\r
-</P>\r
-<LI><A NAME="SEC11" HREF="#TOC1">LIMITATIONS</A>\r
-<P>\r
-There are some size limitations in PCRE but it is hoped that they will never in\r
-practice be relevant.\r
-The maximum length of a compiled pattern is 65539 (sic) bytes.\r
-All values in repeating quantifiers must be less than 65536.\r
-The maximum number of capturing subpatterns is 99.\r
-The maximum number of all parenthesized subpatterns, including capturing\r
-subpatterns, assertions, and other types of subpattern, is 200.\r
-</P>\r
-<P>\r
-The maximum length of a subject string is the largest positive number that an\r
-integer variable can hold. However, PCRE uses recursion to handle subpatterns\r
-and indefinite repetition. This means that the available stack space may limit\r
-the size of a subject string that can be processed by certain patterns.\r
-</P>\r
-<LI><A NAME="SEC12" HREF="#TOC1">DIFFERENCES FROM PERL</A>\r
-<P>\r
-The differences described here are with respect to Perl 5.005.\r
-</P>\r
-<P>\r
-1. By default, a whitespace character is any character that the C library\r
-function <B>isspace()</B> recognizes, though it is possible to compile PCRE with\r
-alternative character type tables. Normally <B>isspace()</B> matches space,\r
-formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5\r
-no longer includes vertical tab in its set of whitespace characters. The \v\r
-escape that was in the Perl documentation for a long time was never in fact\r
-recognized. However, the character itself was treated as whitespace at least\r
-up to 5.002. In 5.004 and 5.005 it does not match \s.\r
-</P>\r
-<P>\r
-2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits\r
-them, but they do not mean what you might think. For example, (?!a){3} does\r
-not assert that the next three characters are not "a". It just asserts that the\r
-next character is not "a" three times.\r
-</P>\r
-<P>\r
-3. Capturing subpatterns that occur inside negative lookahead assertions are\r
-counted, but their entries in the offsets vector are never set. Perl sets its\r
-numerical variables from any such patterns that are matched before the\r
-assertion fails to match something (thereby succeeding), but only if the\r
-negative lookahead assertion contains just one branch.\r
-</P>\r
-<P>\r
-4. Though binary zero characters are supported in the subject string, they are\r
-not allowed in a pattern string because it is passed as a normal C string,\r
-terminated by zero. The escape sequence "\0" can be used in the pattern to\r
-represent a binary zero.\r
-</P>\r
-<P>\r
-5. The following Perl escape sequences are not supported: \l, \u, \L, \U,\r
-\E, \Q. In fact these are implemented by Perl's general string-handling and\r
-are not part of its pattern matching engine.\r
-</P>\r
-<P>\r
-6. The Perl \G assertion is not supported as it is not relevant to single\r
-pattern matches.\r
-</P>\r
-<P>\r
-7. Fairly obviously, PCRE does not support the (?{code}) and (?p{code})\r
-constructions. However, there is some experimental support for recursive\r
-patterns using the non-Perl item (?R).\r
-</P>\r
-<P>\r
-8. There are at the time of writing some oddities in Perl 5.005_02 concerned\r
-with the settings of captured strings when part of a pattern is repeated. For\r
-example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value\r
-"b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if\r
-the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set.\r
-</P>\r
-<P>\r
-In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the\r
-future Perl changes to a consistent state that is different, PCRE may change to\r
-follow.\r
-</P>\r
-<P>\r
-9. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern\r
-/^(a)?(?(1)a|b)+$/ matches the string "a", whereas in PCRE it does not.\r
-However, in both Perl and PCRE /^(a)?a/ matched against "a" leaves $1 unset.\r
-</P>\r
-<P>\r
-10. PCRE provides some extensions to the Perl regular expression facilities:\r
-</P>\r
-<P>\r
-(a) Although lookbehind assertions must match fixed length strings, each\r
-alternative branch of a lookbehind assertion can match a different length of\r
-string. Perl 5.005 requires them all to have the same length.\r
-</P>\r
-<P>\r
-(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta-\r
-character matches only at the very end of the string.\r
-</P>\r
-<P>\r
-(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special\r
-meaning is faulted.\r
-</P>\r
-<P>\r
-(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is\r
-inverted, that is, by default they are not greedy, but if followed by a\r
-question mark they are.\r
-</P>\r
-<P>\r
-(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start\r
-of the subject.\r
-</P>\r
-<P>\r
-(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for\r
-<B>pcre_exec()</B> have no Perl equivalents.\r
-</P>\r
-<P>\r
-(g) The (?R) construct allows for recursive pattern matching (Perl 5.6 can do\r
-this using the (?p{code}) construct, which PCRE cannot of course support.)\r
-</P>\r
-<LI><A NAME="SEC13" HREF="#TOC1">REGULAR EXPRESSION DETAILS</A>\r
-<P>\r
-The syntax and semantics of the regular expressions supported by PCRE are\r
-described below. Regular expressions are also described in the Perl\r
-documentation and in a number of other books, some of which have copious\r
-examples. Jeffrey Friedl's "Mastering Regular Expressions", published by\r
-O'Reilly (ISBN 1-56592-257), covers them in great detail.\r
-</P>\r
-<P>\r
-The description here is intended as reference documentation. The basic\r
-operation of PCRE is on strings of bytes. However, there is the beginnings of\r
-some support for UTF-8 character strings. To use this support you must\r
-configure PCRE to include it, and then call <B>pcre_compile()</B> with the\r
-PCRE_UTF8 option. How this affects the pattern matching is described in the\r
-final section of this document.\r
-</P>\r
-<P>\r
-A regular expression is a pattern that is matched against a subject string from\r
-left to right. Most characters stand for themselves in a pattern, and match the\r
-corresponding characters in the subject. As a trivial example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- The quick brown fox\r
-</PRE>\r
-</P>\r
-<P>\r
-matches a portion of a subject string that is identical to itself. The power of\r
-regular expressions comes from the ability to include alternatives and\r
-repetitions in the pattern. These are encoded in the pattern by the use of\r
-<I>meta-characters</I>, which do not stand for themselves but instead are\r
-interpreted in some special way.\r
-</P>\r
-<P>\r
-There are two different sets of meta-characters: those that are recognized\r
-anywhere in the pattern except within square brackets, and those that are\r
-recognized in square brackets. Outside square brackets, the meta-characters are\r
-as follows:\r
-</P>\r
-<P>\r
-<PRE>\r
- \ general escape character with several uses\r
- ^ assert start of subject (or line, in multiline mode)\r
- $ assert end of subject (or line, in multiline mode)\r
- . match any character except newline (by default)\r
- [ start character class definition\r
- | start of alternative branch\r
- ( start subpattern\r
- ) end subpattern\r
- ? extends the meaning of (\r
- also 0 or 1 quantifier\r
- also quantifier minimizer\r
- * 0 or more quantifier\r
- + 1 or more quantifier\r
- { start min/max quantifier\r
-</PRE>\r
-</P>\r
-<P>\r
-Part of a pattern that is in square brackets is called a "character class". In\r
-a character class the only meta-characters are:\r
-</P>\r
-<P>\r
-<PRE>\r
- \ general escape character\r
- ^ negate the class, but only if the first character\r
- - indicates character range\r
- ] terminates the character class\r
-</PRE>\r
-</P>\r
-<P>\r
-The following sections describe the use of each of the meta-characters.\r
-</P>\r
-<LI><A NAME="SEC14" HREF="#TOC1">BACKSLASH</A>\r
-<P>\r
-The backslash character has several uses. Firstly, if it is followed by a\r
-non-alphameric character, it takes away any special meaning that character may\r
-have. This use of backslash as an escape character applies both inside and\r
-outside character classes.\r
-</P>\r
-<P>\r
-For example, if you want to match a "*" character, you write "\*" in the\r
-pattern. This applies whether or not the following character would otherwise be\r
-interpreted as a meta-character, so it is always safe to precede a\r
-non-alphameric with "\" to specify that it stands for itself. In particular,\r
-if you want to match a backslash, you write "\\".\r
-</P>\r
-<P>\r
-If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the\r
-pattern (other than in a character class) and characters between a "#" outside\r
-a character class and the next newline character are ignored. An escaping\r
-backslash can be used to include a whitespace or "#" character as part of the\r
-pattern.\r
-</P>\r
-<P>\r
-A second use of backslash provides a way of encoding non-printing characters\r
-in patterns in a visible manner. There is no restriction on the appearance of\r
-non-printing characters, apart from the binary zero that terminates a pattern,\r
-but when a pattern is being prepared by text editing, it is usually easier to\r
-use one of the following escape sequences than the binary character it\r
-represents:\r
-</P>\r
-<P>\r
-<PRE>\r
- \a alarm, that is, the BEL character (hex 07)\r
- \cx "control-x", where x is any character\r
- \e escape (hex 1B)\r
- \f formfeed (hex 0C)\r
- \n newline (hex 0A)\r
- \r carriage return (hex 0D)\r
- \t tab (hex 09)\r
- \xhh character with hex code hh\r
- \ddd character with octal code ddd, or backreference\r
-</PRE>\r
-</P>\r
-<P>\r
-The precise effect of "\cx" is as follows: if "x" is a lower case letter, it\r
-is converted to upper case. Then bit 6 of the character (hex 40) is inverted.\r
-Thus "\cz" becomes hex 1A, but "\c{" becomes hex 3B, while "\c;" becomes hex\r
-7B.\r
-</P>\r
-<P>\r
-After "\x", up to two hexadecimal digits are read (letters can be in upper or\r
-lower case).\r
-</P>\r
-<P>\r
-After "\0" up to two further octal digits are read. In both cases, if there\r
-are fewer than two digits, just those that are present are used. Thus the\r
-sequence "\0\x\07" specifies two binary zeros followed by a BEL character.\r
-Make sure you supply two digits after the initial zero if the character that\r
-follows is itself an octal digit.\r
-</P>\r
-<P>\r
-The handling of a backslash followed by a digit other than 0 is complicated.\r
-Outside a character class, PCRE reads it and any following digits as a decimal\r
-number. If the number is less than 10, or if there have been at least that many\r
-previous capturing left parentheses in the expression, the entire sequence is\r
-taken as a <I>back reference</I>. A description of how this works is given\r
-later, following the discussion of parenthesized subpatterns.\r
-</P>\r
-<P>\r
-Inside a character class, or if the decimal number is greater than 9 and there\r
-have not been that many capturing subpatterns, PCRE re-reads up to three octal\r
-digits following the backslash, and generates a single byte from the least\r
-significant 8 bits of the value. Any subsequent digits stand for themselves.\r
-For example:\r
-</P>\r
-<P>\r
-<PRE>\r
- \040 is another way of writing a space\r
- \40 is the same, provided there are fewer than 40\r
- previous capturing subpatterns\r
- \7 is always a back reference\r
- \11 might be a back reference, or another way of\r
- writing a tab\r
- \011 is always a tab\r
- \0113 is a tab followed by the character "3"\r
- \113 is the character with octal code 113 (since there\r
- can be no more than 99 back references)\r
- \377 is a byte consisting entirely of 1 bits\r
- \81 is either a back reference, or a binary zero\r
- followed by the two characters "8" and "1"\r
-</PRE>\r
-</P>\r
-<P>\r
-Note that octal values of 100 or greater must not be introduced by a leading\r
-zero, because no more than three octal digits are ever read.\r
-</P>\r
-<P>\r
-All the sequences that define a single byte value can be used both inside and\r
-outside character classes. In addition, inside a character class, the sequence\r
-"\b" is interpreted as the backspace character (hex 08). Outside a character\r
-class it has a different meaning (see below).\r
-</P>\r
-<P>\r
-The third use of backslash is for specifying generic character types:\r
-</P>\r
-<P>\r
-<PRE>\r
- \d any decimal digit\r
- \D any character that is not a decimal digit\r
- \s any whitespace character\r
- \S any character that is not a whitespace character\r
- \w any "word" character\r
- \W any "non-word" character\r
-</PRE>\r
-</P>\r
-<P>\r
-Each pair of escape sequences partitions the complete set of characters into\r
-two disjoint sets. Any given character matches one, and only one, of each pair.\r
-</P>\r
-<P>\r
-A "word" character is any letter or digit or the underscore character, that is,\r
-any character which can be part of a Perl "word". The definition of letters and\r
-digits is controlled by PCRE's character tables, and may vary if locale-\r
-specific matching is taking place (see "Locale support" above). For example, in\r
-the "fr" (French) locale, some character codes greater than 128 are used for\r
-accented letters, and these are matched by \w.\r
-</P>\r
-<P>\r
-These character type sequences can appear both inside and outside character\r
-classes. They each match one character of the appropriate type. If the current\r
-matching point is at the end of the subject string, all of them fail, since\r
-there is no character to match.\r
-</P>\r
-<P>\r
-The fourth use of backslash is for certain simple assertions. An assertion\r
-specifies a condition that has to be met at a particular point in a match,\r
-without consuming any characters from the subject string. The use of\r
-subpatterns for more complicated assertions is described below. The backslashed\r
-assertions are\r
-</P>\r
-<P>\r
-<PRE>\r
- \b word boundary\r
- \B not a word boundary\r
- \A start of subject (independent of multiline mode)\r
- \Z end of subject or newline at end (independent of multiline mode)\r
- \z end of subject (independent of multiline mode)\r
-</PRE>\r
-</P>\r
-<P>\r
-These assertions may not appear in character classes (but note that "\b" has a\r
-different meaning, namely the backspace character, inside a character class).\r
-</P>\r
-<P>\r
-A word boundary is a position in the subject string where the current character\r
-and the previous character do not both match \w or \W (i.e. one matches\r
-\w and the other matches \W), or the start or end of the string if the\r
-first or last character matches \w, respectively.\r
-</P>\r
-<P>\r
-The \A, \Z, and \z assertions differ from the traditional circumflex and\r
-dollar (described below) in that they only ever match at the very start and end\r
-of the subject string, whatever options are set. They are not affected by the\r
-PCRE_NOTBOL or PCRE_NOTEOL options. If the <I>startoffset</I> argument of\r
-<B>pcre_exec()</B> is non-zero, \A can never match. The difference between \Z\r
-and \z is that \Z matches before a newline that is the last character of the\r
-string as well as at the end of the string, whereas \z matches only at the\r
-end.\r
-</P>\r
-<LI><A NAME="SEC15" HREF="#TOC1">CIRCUMFLEX AND DOLLAR</A>\r
-<P>\r
-Outside a character class, in the default matching mode, the circumflex\r
-character is an assertion which is true only if the current matching point is\r
-at the start of the subject string. If the <I>startoffset</I> argument of\r
-<B>pcre_exec()</B> is non-zero, circumflex can never match. Inside a character\r
-class, circumflex has an entirely different meaning (see below).\r
-</P>\r
-<P>\r
-Circumflex need not be the first character of the pattern if a number of\r
-alternatives are involved, but it should be the first thing in each alternative\r
-in which it appears if the pattern is ever to match that branch. If all\r
-possible alternatives start with a circumflex, that is, if the pattern is\r
-constrained to match only at the start of the subject, it is said to be an\r
-"anchored" pattern. (There are also other constructs that can cause a pattern\r
-to be anchored.)\r
-</P>\r
-<P>\r
-A dollar character is an assertion which is true only if the current matching\r
-point is at the end of the subject string, or immediately before a newline\r
-character that is the last character in the string (by default). Dollar need\r
-not be the last character of the pattern if a number of alternatives are\r
-involved, but it should be the last item in any branch in which it appears.\r
-Dollar has no special meaning in a character class.\r
-</P>\r
-<P>\r
-The meaning of dollar can be changed so that it matches only at the very end of\r
-the string, by setting the PCRE_DOLLAR_ENDONLY option at compile or matching\r
-time. This does not affect the \Z assertion.\r
-</P>\r
-<P>\r
-The meanings of the circumflex and dollar characters are changed if the\r
-PCRE_MULTILINE option is set. When this is the case, they match immediately\r
-after and immediately before an internal "\n" character, respectively, in\r
-addition to matching at the start and end of the subject string. For example,\r
-the pattern /^abc$/ matches the subject string "def\nabc" in multiline mode,\r
-but not otherwise. Consequently, patterns that are anchored in single line mode\r
-because all branches start with "^" are not anchored in multiline mode, and a\r
-match for circumflex is possible when the <I>startoffset</I> argument of\r
-<B>pcre_exec()</B> is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if\r
-PCRE_MULTILINE is set.\r
-</P>\r
-<P>\r
-Note that the sequences \A, \Z, and \z can be used to match the start and\r
-end of the subject in both modes, and if all branches of a pattern start with\r
-\A is it always anchored, whether PCRE_MULTILINE is set or not.\r
-</P>\r
-<LI><A NAME="SEC16" HREF="#TOC1">FULL STOP (PERIOD, DOT)</A>\r
-<P>\r
-Outside a character class, a dot in the pattern matches any one character in\r
-the subject, including a non-printing character, but not (by default) newline.\r
-If the PCRE_DOTALL option is set, dots match newlines as well. The handling of\r
-dot is entirely independent of the handling of circumflex and dollar, the only\r
-relationship being that they both involve newline characters. Dot has no\r
-special meaning in a character class.\r
-</P>\r
-<LI><A NAME="SEC17" HREF="#TOC1">SQUARE BRACKETS</A>\r
-<P>\r
-An opening square bracket introduces a character class, terminated by a closing\r
-square bracket. A closing square bracket on its own is not special. If a\r
-closing square bracket is required as a member of the class, it should be the\r
-first data character in the class (after an initial circumflex, if present) or\r
-escaped with a backslash.\r
-</P>\r
-<P>\r
-A character class matches a single character in the subject; the character must\r
-be in the set of characters defined by the class, unless the first character in\r
-the class is a circumflex, in which case the subject character must not be in\r
-the set defined by the class. If a circumflex is actually required as a member\r
-of the class, ensure it is not the first character, or escape it with a\r
-backslash.\r
-</P>\r
-<P>\r
-For example, the character class [aeiou] matches any lower case vowel, while\r
-[^aeiou] matches any character that is not a lower case vowel. Note that a\r
-circumflex is just a convenient notation for specifying the characters which\r
-are in the class by enumerating those that are not. It is not an assertion: it\r
-still consumes a character from the subject string, and fails if the current\r
-pointer is at the end of the string.\r
-</P>\r
-<P>\r
-When caseless matching is set, any letters in a class represent both their\r
-upper case and lower case versions, so for example, a caseless [aeiou] matches\r
-"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a\r
-caseful version would.\r
-</P>\r
-<P>\r
-The newline character is never treated in any special way in character classes,\r
-whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class\r
-such as [^a] will always match a newline.\r
-</P>\r
-<P>\r
-The minus (hyphen) character can be used to specify a range of characters in a\r
-character class. For example, [d-m] matches any letter between d and m,\r
-inclusive. If a minus character is required in a class, it must be escaped with\r
-a backslash or appear in a position where it cannot be interpreted as\r
-indicating a range, typically as the first or last character in the class.\r
-</P>\r
-<P>\r
-It is not possible to have the literal character "]" as the end character of a\r
-range. A pattern such as [W-]46] is interpreted as a class of two characters\r
-("W" and "-") followed by a literal string "46]", so it would match "W46]" or\r
-"-46]". However, if the "]" is escaped with a backslash it is interpreted as\r
-the end of range, so [W-\]46] is interpreted as a single class containing a\r
-range followed by two separate characters. The octal or hexadecimal\r
-representation of "]" can also be used to end a range.\r
-</P>\r
-<P>\r
-Ranges operate in ASCII collating sequence. They can also be used for\r
-characters specified numerically, for example [\000-\037]. If a range that\r
-includes letters is used when caseless matching is set, it matches the letters\r
-in either case. For example, [W-c] is equivalent to [][\^_`wxyzabc], matched\r
-caselessly, and if character tables for the "fr" locale are in use,\r
-[\xc8-\xcb] matches accented E characters in both cases.\r
-</P>\r
-<P>\r
-The character types \d, \D, \s, \S, \w, and \W may also appear in a\r
-character class, and add the characters that they match to the class. For\r
-example, [\dABCDEF] matches any hexadecimal digit. A circumflex can\r
-conveniently be used with the upper case character types to specify a more\r
-restricted set of characters than the matching lower case type. For example,\r
-the class [^\W_] matches any letter or digit, but not underscore.\r
-</P>\r
-<P>\r
-All non-alphameric characters other than \, -, ^ (at the start) and the\r
-terminating ] are non-special in character classes, but it does no harm if they\r
-are escaped.\r
-</P>\r
-<LI><A NAME="SEC18" HREF="#TOC1">POSIX CHARACTER CLASSES</A>\r
-<P>\r
-Perl 5.6 (not yet released at the time of writing) is going to support the\r
-POSIX notation for character classes, which uses names enclosed by [: and :]\r
-within the enclosing square brackets. PCRE supports this notation. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- [01[:alpha:]%]\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "0", "1", any alphabetic character, or "%". The supported class names\r
-are\r
-</P>\r
-<P>\r
-<PRE>\r
- alnum letters and digits\r
- alpha letters\r
- ascii character codes 0 - 127\r
- cntrl control characters\r
- digit decimal digits (same as \d)\r
- graph printing characters, excluding space\r
- lower lower case letters\r
- print printing characters, including space\r
- punct printing characters, excluding letters and digits\r
- space white space (same as \s)\r
- upper upper case letters\r
- word "word" characters (same as \w)\r
- xdigit hexadecimal digits\r
-</PRE>\r
-</P>\r
-<P>\r
-The names "ascii" and "word" are Perl extensions. Another Perl extension is\r
-negation, which is indicated by a ^ character after the colon. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- [12[:^digit:]]\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "1", "2", or any non-digit. PCRE (and Perl) also recogize the POSIX\r
-syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not\r
-supported, and an error is given if they are encountered.\r
-</P>\r
-<LI><A NAME="SEC19" HREF="#TOC1">VERTICAL BAR</A>\r
-<P>\r
-Vertical bar characters are used to separate alternative patterns. For example,\r
-the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- gilbert|sullivan\r
-</PRE>\r
-</P>\r
-<P>\r
-matches either "gilbert" or "sullivan". Any number of alternatives may appear,\r
-and an empty alternative is permitted (matching the empty string).\r
-The matching process tries each alternative in turn, from left to right,\r
-and the first one that succeeds is used. If the alternatives are within a\r
-subpattern (defined below), "succeeds" means matching the rest of the main\r
-pattern as well as the alternative in the subpattern.\r
-</P>\r
-<LI><A NAME="SEC20" HREF="#TOC1">INTERNAL OPTION SETTING</A>\r
-<P>\r
-The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and PCRE_EXTENDED\r
-can be changed from within the pattern by a sequence of Perl option letters\r
-enclosed between "(?" and ")". The option letters are\r
-</P>\r
-<P>\r
-<PRE>\r
- i for PCRE_CASELESS\r
- m for PCRE_MULTILINE\r
- s for PCRE_DOTALL\r
- x for PCRE_EXTENDED\r
-</PRE>\r
-</P>\r
-<P>\r
-For example, (?im) sets caseless, multiline matching. It is also possible to\r
-unset these options by preceding the letter with a hyphen, and a combined\r
-setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and\r
-PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also\r
-permitted. If a letter appears both before and after the hyphen, the option is\r
-unset.\r
-</P>\r
-<P>\r
-The scope of these option changes depends on where in the pattern the setting\r
-occurs. For settings that are outside any subpattern (defined below), the\r
-effect is the same as if the options were set or unset at the start of\r
-matching. The following patterns all behave in exactly the same way:\r
-</P>\r
-<P>\r
-<PRE>\r
- (?i)abc\r
- a(?i)bc\r
- ab(?i)c\r
- abc(?i)\r
-</PRE>\r
-</P>\r
-<P>\r
-which in turn is the same as compiling the pattern abc with PCRE_CASELESS set.\r
-In other words, such "top level" settings apply to the whole pattern (unless\r
-there are other changes inside subpatterns). If there is more than one setting\r
-of the same option at top level, the rightmost setting is used.\r
-</P>\r
-<P>\r
-If an option change occurs inside a subpattern, the effect is different. This\r
-is a change of behaviour in Perl 5.005. An option change inside a subpattern\r
-affects only that part of the subpattern that follows it, so\r
-</P>\r
-<P>\r
-<PRE>\r
- (a(?i)b)c\r
-</PRE>\r
-</P>\r
-<P>\r
-matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).\r
-By this means, options can be made to have different settings in different\r
-parts of the pattern. Any changes made in one alternative do carry on\r
-into subsequent branches within the same subpattern. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- (a(?i)b|c)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "ab", "aB", "c", and "C", even though when matching "C" the first\r
-branch is abandoned before the option setting. This is because the effects of\r
-option settings happen at compile time. There would be some very weird\r
-behaviour otherwise.\r
-</P>\r
-<P>\r
-The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the\r
-same way as the Perl-compatible options by using the characters U and X\r
-respectively. The (?X) flag setting is special in that it must always occur\r
-earlier in the pattern than any of the additional features it turns on, even\r
-when it is at top level. It is best put at the start.\r
-</P>\r
-<LI><A NAME="SEC21" HREF="#TOC1">SUBPATTERNS</A>\r
-<P>\r
-Subpatterns are delimited by parentheses (round brackets), which can be nested.\r
-Marking part of a pattern as a subpattern does two things:\r
-</P>\r
-<P>\r
-1. It localizes a set of alternatives. For example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- cat(aract|erpillar|)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches one of the words "cat", "cataract", or "caterpillar". Without the\r
-parentheses, it would match "cataract", "erpillar" or the empty string.\r
-</P>\r
-<P>\r
-2. It sets up the subpattern as a capturing subpattern (as defined above).\r
-When the whole pattern matches, that portion of the subject string that matched\r
-the subpattern is passed back to the caller via the <I>ovector</I> argument of\r
-<B>pcre_exec()</B>. Opening parentheses are counted from left to right (starting\r
-from 1) to obtain the numbers of the capturing subpatterns.\r
-</P>\r
-<P>\r
-For example, if the string "the red king" is matched against the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- the ((red|white) (king|queen))\r
-</PRE>\r
-</P>\r
-<P>\r
-the captured substrings are "red king", "red", and "king", and are numbered 1,\r
-2, and 3.\r
-</P>\r
-<P>\r
-The fact that plain parentheses fulfil two functions is not always helpful.\r
-There are often times when a grouping subpattern is required without a\r
-capturing requirement. If an opening parenthesis is followed by "?:", the\r
-subpattern does not do any capturing, and is not counted when computing the\r
-number of any subsequent capturing subpatterns. For example, if the string "the\r
-white queen" is matched against the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- the ((?:red|white) (king|queen))\r
-</PRE>\r
-</P>\r
-<P>\r
-the captured substrings are "white queen" and "queen", and are numbered 1 and\r
-2. The maximum number of captured substrings is 99, and the maximum number of\r
-all subpatterns, both capturing and non-capturing, is 200.\r
-</P>\r
-<P>\r
-As a convenient shorthand, if any option settings are required at the start of\r
-a non-capturing subpattern, the option letters may appear between the "?" and\r
-the ":". Thus the two patterns\r
-</P>\r
-<P>\r
-<PRE>\r
- (?i:saturday|sunday)\r
- (?:(?i)saturday|sunday)\r
-</PRE>\r
-</P>\r
-<P>\r
-match exactly the same set of strings. Because alternative branches are tried\r
-from left to right, and options are not reset until the end of the subpattern\r
-is reached, an option setting in one branch does affect subsequent branches, so\r
-the above patterns match "SUNDAY" as well as "Saturday".\r
-</P>\r
-<LI><A NAME="SEC22" HREF="#TOC1">REPETITION</A>\r
-<P>\r
-Repetition is specified by quantifiers, which can follow any of the following\r
-items:\r
-</P>\r
-<P>\r
-<PRE>\r
- a single character, possibly escaped\r
- the . metacharacter\r
- a character class\r
- a back reference (see next section)\r
- a parenthesized subpattern (unless it is an assertion - see below)\r
-</PRE>\r
-</P>\r
-<P>\r
-The general repetition quantifier specifies a minimum and maximum number of\r
-permitted matches, by giving the two numbers in curly brackets (braces),\r
-separated by a comma. The numbers must be less than 65536, and the first must\r
-be less than or equal to the second. For example:\r
-</P>\r
-<P>\r
-<PRE>\r
- z{2,4}\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special\r
-character. If the second number is omitted, but the comma is present, there is\r
-no upper limit; if the second number and the comma are both omitted, the\r
-quantifier specifies an exact number of required matches. Thus\r
-</P>\r
-<P>\r
-<PRE>\r
- [aeiou]{3,}\r
-</PRE>\r
-</P>\r
-<P>\r
-matches at least 3 successive vowels, but may match many more, while\r
-</P>\r
-<P>\r
-<PRE>\r
- \d{8}\r
-</PRE>\r
-</P>\r
-<P>\r
-matches exactly 8 digits. An opening curly bracket that appears in a position\r
-where a quantifier is not allowed, or one that does not match the syntax of a\r
-quantifier, is taken as a literal character. For example, {,6} is not a\r
-quantifier, but a literal string of four characters.\r
-</P>\r
-<P>\r
-The quantifier {0} is permitted, causing the expression to behave as if the\r
-previous item and the quantifier were not present.\r
-</P>\r
-<P>\r
-For convenience (and historical compatibility) the three most common\r
-quantifiers have single-character abbreviations:\r
-</P>\r
-<P>\r
-<PRE>\r
- * is equivalent to {0,}\r
- + is equivalent to {1,}\r
- ? is equivalent to {0,1}\r
-</PRE>\r
-</P>\r
-<P>\r
-It is possible to construct infinite loops by following a subpattern that can\r
-match no characters with a quantifier that has no upper limit, for example:\r
-</P>\r
-<P>\r
-<PRE>\r
- (a?)*\r
-</PRE>\r
-</P>\r
-<P>\r
-Earlier versions of Perl and PCRE used to give an error at compile time for\r
-such patterns. However, because there are cases where this can be useful, such\r
-patterns are now accepted, but if any repetition of the subpattern does in fact\r
-match no characters, the loop is forcibly broken.\r
-</P>\r
-<P>\r
-By default, the quantifiers are "greedy", that is, they match as much as\r
-possible (up to the maximum number of permitted times), without causing the\r
-rest of the pattern to fail. The classic example of where this gives problems\r
-is in trying to match comments in C programs. These appear between the\r
-sequences /* and */ and within the sequence, individual * and / characters may\r
-appear. An attempt to match C comments by applying the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- /\*.*\*/\r
-</PRE>\r
-</P>\r
-<P>\r
-to the string\r
-</P>\r
-<P>\r
-<PRE>\r
- /* first command */ not comment /* second comment */\r
-</PRE>\r
-</P>\r
-<P>\r
-fails, because it matches the entire string owing to the greediness of the .*\r
-item.\r
-</P>\r
-<P>\r
-However, if a quantifier is followed by a question mark, it ceases to be\r
-greedy, and instead matches the minimum number of times possible, so the\r
-pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- /\*.*?\*/\r
-</PRE>\r
-</P>\r
-<P>\r
-does the right thing with the C comments. The meaning of the various\r
-quantifiers is not otherwise changed, just the preferred number of matches.\r
-Do not confuse this use of question mark with its use as a quantifier in its\r
-own right. Because it has two uses, it can sometimes appear doubled, as in\r
-</P>\r
-<P>\r
-<PRE>\r
- \d??\d\r
-</PRE>\r
-</P>\r
-<P>\r
-which matches one digit by preference, but can match two if that is the only\r
-way the rest of the pattern matches.\r
-</P>\r
-<P>\r
-If the PCRE_UNGREEDY option is set (an option which is not available in Perl),\r
-the quantifiers are not greedy by default, but individual ones can be made\r
-greedy by following them with a question mark. In other words, it inverts the\r
-default behaviour.\r
-</P>\r
-<P>\r
-When a parenthesized subpattern is quantified with a minimum repeat count that\r
-is greater than 1 or with a limited maximum, more store is required for the\r
-compiled pattern, in proportion to the size of the minimum or maximum.\r
-</P>\r
-<P>\r
-If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent\r
-to Perl's /s) is set, thus allowing the . to match newlines, the pattern is\r
-implicitly anchored, because whatever follows will be tried against every\r
-character position in the subject string, so there is no point in retrying the\r
-overall match at any position after the first. PCRE treats such a pattern as\r
-though it were preceded by \A. In cases where it is known that the subject\r
-string contains no newlines, it is worth setting PCRE_DOTALL when the pattern\r
-begins with .* in order to obtain this optimization, or alternatively using ^\r
-to indicate anchoring explicitly.\r
-</P>\r
-<P>\r
-When a capturing subpattern is repeated, the value captured is the substring\r
-that matched the final iteration. For example, after\r
-</P>\r
-<P>\r
-<PRE>\r
- (tweedle[dume]{3}\s*)+\r
-</PRE>\r
-</P>\r
-<P>\r
-has matched "tweedledum tweedledee" the value of the captured substring is\r
-"tweedledee". However, if there are nested capturing subpatterns, the\r
-corresponding captured values may have been set in previous iterations. For\r
-example, after\r
-</P>\r
-<P>\r
-<PRE>\r
- /(a|(b))+/\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "aba" the value of the second captured substring is "b".\r
-</P>\r
-<LI><A NAME="SEC23" HREF="#TOC1">BACK REFERENCES</A>\r
-<P>\r
-Outside a character class, a backslash followed by a digit greater than 0 (and\r
-possibly further digits) is a back reference to a capturing subpattern earlier\r
-(i.e. to its left) in the pattern, provided there have been that many previous\r
-capturing left parentheses.\r
-</P>\r
-<P>\r
-However, if the decimal number following the backslash is less than 10, it is\r
-always taken as a back reference, and causes an error only if there are not\r
-that many capturing left parentheses in the entire pattern. In other words, the\r
-parentheses that are referenced need not be to the left of the reference for\r
-numbers less than 10. See the section entitled "Backslash" above for further\r
-details of the handling of digits following a backslash.\r
-</P>\r
-<P>\r
-A back reference matches whatever actually matched the capturing subpattern in\r
-the current subject string, rather than anything matching the subpattern\r
-itself. So the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- (sens|respons)e and \1ibility\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "sense and sensibility" and "response and responsibility", but not\r
-"sense and responsibility". If caseful matching is in force at the time of the\r
-back reference, the case of letters is relevant. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- ((?i)rah)\s+\1\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original\r
-capturing subpattern is matched caselessly.\r
-</P>\r
-<P>\r
-There may be more than one back reference to the same subpattern. If a\r
-subpattern has not actually been used in a particular match, any back\r
-references to it always fail. For example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- (a|(bc))\2\r
-</PRE>\r
-</P>\r
-<P>\r
-always fails if it starts to match "a" rather than "bc". Because there may be\r
-up to 99 back references, all digits following the backslash are taken\r
-as part of a potential back reference number. If the pattern continues with a\r
-digit character, some delimiter must be used to terminate the back reference.\r
-If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty\r
-comment can be used.\r
-</P>\r
-<P>\r
-A back reference that occurs inside the parentheses to which it refers fails\r
-when the subpattern is first used, so, for example, (a\1) never matches.\r
-However, such references can be useful inside repeated subpatterns. For\r
-example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- (a|b\1)+\r
-</PRE>\r
-</P>\r
-<P>\r
-matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of\r
-the subpattern, the back reference matches the character string corresponding\r
-to the previous iteration. In order for this to work, the pattern must be such\r
-that the first iteration does not need to match the back reference. This can be\r
-done using alternation, as in the example above, or by a quantifier with a\r
-minimum of zero.\r
-</P>\r
-<LI><A NAME="SEC24" HREF="#TOC1">ASSERTIONS</A>\r
-<P>\r
-An assertion is a test on the characters following or preceding the current\r
-matching point that does not actually consume any characters. The simple\r
-assertions coded as \b, \B, \A, \Z, \z, ^ and $ are described above. More\r
-complicated assertions are coded as subpatterns. There are two kinds: those\r
-that look ahead of the current position in the subject string, and those that\r
-look behind it.\r
-</P>\r
-<P>\r
-An assertion subpattern is matched in the normal way, except that it does not\r
-cause the current matching position to be changed. Lookahead assertions start\r
-with (?= for positive assertions and (?! for negative assertions. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- \w+(?=;)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches a word followed by a semicolon, but does not include the semicolon in\r
-the match, and\r
-</P>\r
-<P>\r
-<PRE>\r
- foo(?!bar)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches any occurrence of "foo" that is not followed by "bar". Note that the\r
-apparently similar pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- (?!foo)bar\r
-</PRE>\r
-</P>\r
-<P>\r
-does not find an occurrence of "bar" that is preceded by something other than\r
-"foo"; it finds any occurrence of "bar" whatsoever, because the assertion\r
-(?!foo) is always true when the next three characters are "bar". A\r
-lookbehind assertion is needed to achieve this effect.\r
-</P>\r
-<P>\r
-Lookbehind assertions start with (?<= for positive assertions and (?<! for\r
-negative assertions. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<!foo)bar\r
-</PRE>\r
-</P>\r
-<P>\r
-does find an occurrence of "bar" that is not preceded by "foo". The contents of\r
-a lookbehind assertion are restricted such that all the strings it matches must\r
-have a fixed length. However, if there are several alternatives, they do not\r
-all have to have the same fixed length. Thus\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<=bullock|donkey)\r
-</PRE>\r
-</P>\r
-<P>\r
-is permitted, but\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<!dogs?|cats?)\r
-</PRE>\r
-</P>\r
-<P>\r
-causes an error at compile time. Branches that match different length strings\r
-are permitted only at the top level of a lookbehind assertion. This is an\r
-extension compared with Perl 5.005, which requires all branches to match the\r
-same length of string. An assertion such as\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<=ab(c|de))\r
-</PRE>\r
-</P>\r
-<P>\r
-is not permitted, because its single top-level branch can match two different\r
-lengths, but it is acceptable if rewritten to use two top-level branches:\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<=abc|abde)\r
-</PRE>\r
-</P>\r
-<P>\r
-The implementation of lookbehind assertions is, for each alternative, to\r
-temporarily move the current position back by the fixed width and then try to\r
-match. If there are insufficient characters before the current position, the\r
-match is deemed to fail. Lookbehinds in conjunction with once-only subpatterns\r
-can be particularly useful for matching at the ends of strings; an example is\r
-given at the end of the section on once-only subpatterns.\r
-</P>\r
-<P>\r
-Several assertions (of any sort) may occur in succession. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<=\d{3})(?<!999)foo\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "foo" preceded by three digits that are not "999". Notice that each of\r
-the assertions is applied independently at the same point in the subject\r
-string. First there is a check that the previous three characters are all\r
-digits, and then there is a check that the same three characters are not "999".\r
-This pattern does <I>not</I> match "foo" preceded by six characters, the first\r
-of which are digits and the last three of which are not "999". For example, it\r
-doesn't match "123abcfoo". A pattern to do that is\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<=\d{3}...)(?<!999)foo\r
-</PRE>\r
-</P>\r
-<P>\r
-This time the first assertion looks at the preceding six characters, checking\r
-that the first three are digits, and then the second assertion checks that the\r
-preceding three characters are not "999".\r
-</P>\r
-<P>\r
-Assertions can be nested in any combination. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<=(?<!foo)bar)baz\r
-</PRE>\r
-</P>\r
-<P>\r
-matches an occurrence of "baz" that is preceded by "bar" which in turn is not\r
-preceded by "foo", while\r
-</P>\r
-<P>\r
-<PRE>\r
- (?<=\d{3}(?!999)...)foo\r
-</PRE>\r
-</P>\r
-<P>\r
-is another pattern which matches "foo" preceded by three digits and any three\r
-characters that are not "999".\r
-</P>\r
-<P>\r
-Assertion subpatterns are not capturing subpatterns, and may not be repeated,\r
-because it makes no sense to assert the same thing several times. If any kind\r
-of assertion contains capturing subpatterns within it, these are counted for\r
-the purposes of numbering the capturing subpatterns in the whole pattern.\r
-However, substring capturing is carried out only for positive assertions,\r
-because it does not make sense for negative assertions.\r
-</P>\r
-<P>\r
-Assertions count towards the maximum of 200 parenthesized subpatterns.\r
-</P>\r
-<LI><A NAME="SEC25" HREF="#TOC1">ONCE-ONLY SUBPATTERNS</A>\r
-<P>\r
-With both maximizing and minimizing repetition, failure of what follows\r
-normally causes the repeated item to be re-evaluated to see if a different\r
-number of repeats allows the rest of the pattern to match. Sometimes it is\r
-useful to prevent this, either to change the nature of the match, or to cause\r
-it fail earlier than it otherwise might, when the author of the pattern knows\r
-there is no point in carrying on.\r
-</P>\r
-<P>\r
-Consider, for example, the pattern \d+foo when applied to the subject line\r
-</P>\r
-<P>\r
-<PRE>\r
- 123456bar\r
-</PRE>\r
-</P>\r
-<P>\r
-After matching all 6 digits and then failing to match "foo", the normal\r
-action of the matcher is to try again with only 5 digits matching the \d+\r
-item, and then with 4, and so on, before ultimately failing. Once-only\r
-subpatterns provide the means for specifying that once a portion of the pattern\r
-has matched, it is not to be re-evaluated in this way, so the matcher would\r
-give up immediately on failing to match "foo" the first time. The notation is\r
-another kind of special parenthesis, starting with (?> as in this example:\r
-</P>\r
-<P>\r
-<PRE>\r
- (?>\d+)bar\r
-</PRE>\r
-</P>\r
-<P>\r
-This kind of parenthesis "locks up" the part of the pattern it contains once\r
-it has matched, and a failure further into the pattern is prevented from\r
-backtracking into it. Backtracking past it to previous items, however, works as\r
-normal.\r
-</P>\r
-<P>\r
-An alternative description is that a subpattern of this type matches the string\r
-of characters that an identical standalone pattern would match, if anchored at\r
-the current point in the subject string.\r
-</P>\r
-<P>\r
-Once-only subpatterns are not capturing subpatterns. Simple cases such as the\r
-above example can be thought of as a maximizing repeat that must swallow\r
-everything it can. So, while both \d+ and \d+? are prepared to adjust the\r
-number of digits they match in order to make the rest of the pattern match,\r
-(?>\d+) can only match an entire sequence of digits.\r
-</P>\r
-<P>\r
-This construction can of course contain arbitrarily complicated subpatterns,\r
-and it can be nested.\r
-</P>\r
-<P>\r
-Once-only subpatterns can be used in conjunction with lookbehind assertions to\r
-specify efficient matching at the end of the subject string. Consider a simple\r
-pattern such as\r
-</P>\r
-<P>\r
-<PRE>\r
- abcd$\r
-</PRE>\r
-</P>\r
-<P>\r
-when applied to a long string which does not match. Because matching proceeds\r
-from left to right, PCRE will look for each "a" in the subject and then see if\r
-what follows matches the rest of the pattern. If the pattern is specified as\r
-</P>\r
-<P>\r
-<PRE>\r
- ^.*abcd$\r
-</PRE>\r
-</P>\r
-<P>\r
-the initial .* matches the entire string at first, but when this fails (because\r
-there is no following "a"), it backtracks to match all but the last character,\r
-then all but the last two characters, and so on. Once again the search for "a"\r
-covers the entire string, from right to left, so we are no better off. However,\r
-if the pattern is written as\r
-</P>\r
-<P>\r
-<PRE>\r
- ^(?>.*)(?<=abcd)\r
-</PRE>\r
-</P>\r
-<P>\r
-there can be no backtracking for the .* item; it can match only the entire\r
-string. The subsequent lookbehind assertion does a single test on the last four\r
-characters. If it fails, the match fails immediately. For long strings, this\r
-approach makes a significant difference to the processing time.\r
-</P>\r
-<P>\r
-When a pattern contains an unlimited repeat inside a subpattern that can itself\r
-be repeated an unlimited number of times, the use of a once-only subpattern is\r
-the only way to avoid some failing matches taking a very long time indeed.\r
-The pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- (\D+|<\d+>)*[!?]\r
-</PRE>\r
-</P>\r
-<P>\r
-matches an unlimited number of substrings that either consist of non-digits, or\r
-digits enclosed in <>, followed by either ! or ?. When it matches, it runs\r
-quickly. However, if it is applied to\r
-</P>\r
-<P>\r
-<PRE>\r
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r
-</PRE>\r
-</P>\r
-<P>\r
-it takes a long time before reporting failure. This is because the string can\r
-be divided between the two repeats in a large number of ways, and all have to\r
-be tried. (The example used [!?] rather than a single character at the end,\r
-because both PCRE and Perl have an optimization that allows for fast failure\r
-when a single character is used. They remember the last single character that\r
-is required for a match, and fail early if it is not present in the string.)\r
-If the pattern is changed to\r
-</P>\r
-<P>\r
-<PRE>\r
- ((?>\D+)|<\d+>)*[!?]\r
-</PRE>\r
-</P>\r
-<P>\r
-sequences of non-digits cannot be broken, and failure happens quickly.\r
-</P>\r
-<LI><A NAME="SEC26" HREF="#TOC1">CONDITIONAL SUBPATTERNS</A>\r
-<P>\r
-It is possible to cause the matching process to obey a subpattern\r
-conditionally or to choose between two alternative subpatterns, depending on\r
-the result of an assertion, or whether a previous capturing subpattern matched\r
-or not. The two possible forms of conditional subpattern are\r
-</P>\r
-<P>\r
-<PRE>\r
- (?(condition)yes-pattern)\r
- (?(condition)yes-pattern|no-pattern)\r
-</PRE>\r
-</P>\r
-<P>\r
-If the condition is satisfied, the yes-pattern is used; otherwise the\r
-no-pattern (if present) is used. If there are more than two alternatives in the\r
-subpattern, a compile-time error occurs.\r
-</P>\r
-<P>\r
-There are two kinds of condition. If the text between the parentheses consists\r
-of a sequence of digits, the condition is satisfied if the capturing subpattern\r
-of that number has previously matched. The number must be greater than zero.\r
-Consider the following pattern, which contains non-significant white space to\r
-make it more readable (assume the PCRE_EXTENDED option) and to divide it into\r
-three parts for ease of discussion:\r
-</P>\r
-<P>\r
-<PRE>\r
- ( \( )? [^()]+ (?(1) \) )\r
-</PRE>\r
-</P>\r
-<P>\r
-The first part matches an optional opening parenthesis, and if that\r
-character is present, sets it as the first captured substring. The second part\r
-matches one or more characters that are not parentheses. The third part is a\r
-conditional subpattern that tests whether the first set of parentheses matched\r
-or not. If they did, that is, if subject started with an opening parenthesis,\r
-the condition is true, and so the yes-pattern is executed and a closing\r
-parenthesis is required. Otherwise, since no-pattern is not present, the\r
-subpattern matches nothing. In other words, this pattern matches a sequence of\r
-non-parentheses, optionally enclosed in parentheses.\r
-</P>\r
-<P>\r
-If the condition is not a sequence of digits, it must be an assertion. This may\r
-be a positive or negative lookahead or lookbehind assertion. Consider this\r
-pattern, again containing non-significant white space, and with the two\r
-alternatives on the second line:\r
-</P>\r
-<P>\r
-<PRE>\r
- (?(?=[^a-z]*[a-z])\r
- \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )\r
-</PRE>\r
-</P>\r
-<P>\r
-The condition is a positive lookahead assertion that matches an optional\r
-sequence of non-letters followed by a letter. In other words, it tests for the\r
-presence of at least one letter in the subject. If a letter is found, the\r
-subject is matched against the first alternative; otherwise it is matched\r
-against the second. This pattern matches strings in one of the two forms\r
-dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.\r
-</P>\r
-<LI><A NAME="SEC27" HREF="#TOC1">COMMENTS</A>\r
-<P>\r
-The sequence (?# marks the start of a comment which continues up to the next\r
-closing parenthesis. Nested parentheses are not permitted. The characters\r
-that make up a comment play no part in the pattern matching at all.\r
-</P>\r
-<P>\r
-If the PCRE_EXTENDED option is set, an unescaped # character outside a\r
-character class introduces a comment that continues up to the next newline\r
-character in the pattern.\r
-</P>\r
-<LI><A NAME="SEC28" HREF="#TOC1">RECURSIVE PATTERNS</A>\r
-<P>\r
-Consider the problem of matching a string in parentheses, allowing for\r
-unlimited nested parentheses. Without the use of recursion, the best that can\r
-be done is to use a pattern that matches up to some fixed depth of nesting. It\r
-is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an\r
-experimental facility that allows regular expressions to recurse (amongst other\r
-things). It does this by interpolating Perl code in the expression at run time,\r
-and the code can refer to the expression itself. A Perl pattern to solve the\r
-parentheses problem can be created like this:\r
-</P>\r
-<P>\r
-<PRE>\r
- $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;\r
-</PRE>\r
-</P>\r
-<P>\r
-The (?p{...}) item interpolates Perl code at run time, and in this case refers\r
-recursively to the pattern in which it appears. Obviously, PCRE cannot support\r
-the interpolation of Perl code. Instead, the special item (?R) is provided for\r
-the specific case of recursion. This PCRE pattern solves the parentheses\r
-problem (assume the PCRE_EXTENDED option is set so that white space is\r
-ignored):\r
-</P>\r
-<P>\r
-<PRE>\r
- \( ( (?>[^()]+) | (?R) )* \)\r
-</PRE>\r
-</P>\r
-<P>\r
-First it matches an opening parenthesis. Then it matches any number of\r
-substrings which can either be a sequence of non-parentheses, or a recursive\r
-match of the pattern itself (i.e. a correctly parenthesized substring). Finally\r
-there is a closing parenthesis.\r
-</P>\r
-<P>\r
-This particular example pattern contains nested unlimited repeats, and so the\r
-use of a once-only subpattern for matching strings of non-parentheses is\r
-important when applying the pattern to strings that do not match. For example,\r
-when it is applied to\r
-</P>\r
-<P>\r
-<PRE>\r
- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\r
-</PRE>\r
-</P>\r
-<P>\r
-it yields "no match" quickly. However, if a once-only subpattern is not used,\r
-the match runs for a very long time indeed because there are so many different\r
-ways the + and * repeats can carve up the subject, and all have to be tested\r
-before failure can be reported.\r
-</P>\r
-<P>\r
-The values set for any capturing subpatterns are those from the outermost level\r
-of the recursion at which the subpattern value is set. If the pattern above is\r
-matched against\r
-</P>\r
-<P>\r
-<PRE>\r
- (ab(cd)ef)\r
-</PRE>\r
-</P>\r
-<P>\r
-the value for the capturing parentheses is "ef", which is the last value taken\r
-on at the top level. If additional parentheses are added, giving\r
-</P>\r
-<P>\r
-<PRE>\r
- \( ( ( (?>[^()]+) | (?R) )* ) \)\r
- ^ ^\r
- ^ ^\r
-</PRE>\r
-the string they capture is "ab(cd)ef", the contents of the top level\r
-parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE\r
-has to obtain extra memory to store data during a recursion, which it does by\r
-using <B>pcre_malloc</B>, freeing it via <B>pcre_free</B> afterwards. If no\r
-memory can be obtained, it saves data for the first 15 capturing parentheses\r
-only, as there is no way to give an out-of-memory error from within a\r
-recursion.\r
-</P>\r
-<LI><A NAME="SEC29" HREF="#TOC1">PERFORMANCE</A>\r
-<P>\r
-Certain items that may appear in patterns are more efficient than others. It is\r
-more efficient to use a character class like [aeiou] than a set of alternatives\r
-such as (a|e|i|o|u). In general, the simplest construction that provides the\r
-required behaviour is usually the most efficient. Jeffrey Friedl's book\r
-contains a lot of discussion about optimizing regular expressions for efficient\r
-performance.\r
-</P>\r
-<P>\r
-When a pattern begins with .* and the PCRE_DOTALL option is set, the pattern is\r
-implicitly anchored by PCRE, since it can match only at the start of a subject\r
-string. However, if PCRE_DOTALL is not set, PCRE cannot make this optimization,\r
-because the . metacharacter does not then match a newline, and if the subject\r
-string contains newlines, the pattern may match from the character immediately\r
-following one of them instead of from the very start. For example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
- (.*) second\r
-</PRE>\r
-</P>\r
-<P>\r
-matches the subject "first\nand second" (where \n stands for a newline\r
-character) with the first captured substring being "and". In order to do this,\r
-PCRE has to retry the match starting after every newline in the subject.\r
-</P>\r
-<P>\r
-If you are using such a pattern with subject strings that do not contain\r
-newlines, the best performance is obtained by setting PCRE_DOTALL, or starting\r
-the pattern with ^.* to indicate explicit anchoring. That saves PCRE from\r
-having to scan along the subject looking for a newline to restart at.\r
-</P>\r
-<P>\r
-Beware of patterns that contain nested indefinite repeats. These can take a\r
-long time to run when applied to a string that does not match. Consider the\r
-pattern fragment\r
-</P>\r
-<P>\r
-<PRE>\r
- (a+)*\r
-</PRE>\r
-</P>\r
-<P>\r
-This can match "aaaa" in 33 different ways, and this number increases very\r
-rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4\r
-times, and for each of those cases other than 0, the + repeats can match\r
-different numbers of times.) When the remainder of the pattern is such that the\r
-entire match is going to fail, PCRE has in principle to try every possible\r
-variation, and this can take an extremely long time.\r
-</P>\r
-<P>\r
-An optimization catches some of the more simple cases such as\r
-</P>\r
-<P>\r
-<PRE>\r
- (a+)*b\r
-</PRE>\r
-</P>\r
-<P>\r
-where a literal character follows. Before embarking on the standard matching\r
-procedure, PCRE checks that there is a "b" later in the subject string, and if\r
-there is not, it fails the match immediately. However, when there is no\r
-following literal this optimization cannot be used. You can see the difference\r
-by comparing the behaviour of\r
-</P>\r
-<P>\r
-<PRE>\r
- (a+)*\d\r
-</PRE>\r
-</P>\r
-<P>\r
-with the pattern above. The former gives a failure almost instantly when\r
-applied to a whole line of "a" characters, whereas the latter takes an\r
-appreciable time with strings longer than about 20 characters.\r
-</P>\r
-<LI><A NAME="SEC30" HREF="#TOC1">UTF-8 SUPPORT</A>\r
-<P>\r
-Starting at release 3.3, PCRE has some support for character strings encoded\r
-in the UTF-8 format. This is incomplete, and is regarded as experimental. In\r
-order to use it, you must configure PCRE to include UTF-8 support in the code,\r
-and, in addition, you must call <B>pcre_compile()</B> with the PCRE_UTF8 option\r
-flag. When you do this, both the pattern and any subject strings that are\r
-matched against it are treated as UTF-8 strings instead of just strings of\r
-bytes, but only in the cases that are mentioned below.\r
-</P>\r
-<P>\r
-If you compile PCRE with UTF-8 support, but do not use it at run time, the\r
-library will be a bit bigger, but the additional run time overhead is limited\r
-to testing the PCRE_UTF8 flag in several places, so should not be very large.\r
-</P>\r
-<P>\r
-PCRE assumes that the strings it is given contain valid UTF-8 codes. It does\r
-not diagnose invalid UTF-8 strings. If you pass invalid UTF-8 strings to PCRE,\r
-the results are undefined.\r
-</P>\r
-<P>\r
-Running with PCRE_UTF8 set causes these changes in the way PCRE works:\r
-</P>\r
-<P>\r
-1. In a pattern, the escape sequence \x{...}, where the contents of the braces\r
-is a string of hexadecimal digits, is interpreted as a UTF-8 character whose\r
-code number is the given hexadecimal number, for example: \x{1234}. This\r
-inserts from one to six literal bytes into the pattern, using the UTF-8\r
-encoding. If a non-hexadecimal digit appears between the braces, the item is\r
-not recognized.\r
-</P>\r
-<P>\r
-2. The original hexadecimal escape sequence, \xhh, generates a two-byte UTF-8\r
-character if its value is greater than 127.\r
-</P>\r
-<P>\r
-3. Repeat quantifiers are NOT correctly handled if they follow a multibyte\r
-character. For example, \x{100}* and \xc3+ do not work. If you want to\r
-repeat such characters, you must enclose them in non-capturing parentheses,\r
-for example (?:\x{100}), at present.\r
-</P>\r
-<P>\r
-4. The dot metacharacter matches one UTF-8 character instead of a single byte.\r
-</P>\r
-<P>\r
-5. Unlike literal UTF-8 characters, the dot metacharacter followed by a\r
-repeat quantifier does operate correctly on UTF-8 characters instead of\r
-single bytes.\r
-</P>\r
-<P>\r
-4. Although the \x{...} escape is permitted in a character class, characters\r
-whose values are greater than 255 cannot be included in a class.\r
-</P>\r
-<P>\r
-5. A class is matched against a UTF-8 character instead of just a single byte,\r
-but it can match only characters whose values are less than 256. Characters\r
-with greater values always fail to match a class.\r
-</P>\r
-<P>\r
-6. Repeated classes work correctly on multiple characters.\r
-</P>\r
-<P>\r
-7. Classes containing just a single character whose value is greater than 127\r
-(but less than 256), for example, [\x80] or [^\x{93}], do not work because\r
-these are optimized into single byte matches. In the first case, of course,\r
-the class brackets are just redundant.\r
-</P>\r
-<P>\r
-8. Lookbehind assertions move backwards in the subject by a fixed number of\r
-characters instead of a fixed number of bytes. Simple cases have been tested\r
-to work correctly, but there may be hidden gotchas herein.\r
-</P>\r
-<P>\r
-9. The character types such as \d and \w do not work correctly with UTF-8\r
-characters. They continue to test a single byte.\r
-</P>\r
-<P>\r
-10. Anything not explicitly mentioned here continues to work in bytes rather\r
-than in characters.\r
-</P>\r
-<P>\r
-The following UTF-8 features of Perl 5.6 are not implemented:\r
-</P>\r
-<P>\r
-1. The escape sequence \C to match a single byte.\r
-</P>\r
-<P>\r
-2. The use of Unicode tables and properties and escapes \p, \P, and \X.\r
-</P>\r
-<LI><A NAME="SEC31" HREF="#TOC1">AUTHOR</A>\r
-<P>\r
-Philip Hazel <ph10@cam.ac.uk>\r
-<BR>\r
-University Computing Service,\r
-<BR>\r
-New Museums Site,\r
-<BR>\r
-Cambridge CB2 3QG, England.\r
-<BR>\r
-Phone: +44 1223 334714\r
-</P>\r
-<P>\r
-Last updated: 28 August 2000,\r
-<BR>\r
-<PRE>\r
- the 250th anniversary of the death of J.S. Bach.\r
-<BR>\r
-</PRE>\r
-Copyright (c) 1997-2000 University of Cambridge.\r
+++ /dev/null
-NAME
- pcre - Perl-compatible regular expressions.
-
-
-
-SYNOPSIS
- #include <pcre.h>
-
- pcre *pcre_compile(const char *pattern, int options,
- const char **errptr, int *erroffset,
- const unsigned char *tableptr);
-
- pcre_extra *pcre_study(const pcre *code, int options,
- const char **errptr);
-
- int pcre_exec(const pcre *code, const pcre_extra *extra,
- const char *subject, int length, int startoffset,
- int options, int *ovector, int ovecsize);
-
- int pcre_copy_substring(const char *subject, int *ovector,
- int stringcount, int stringnumber, char *buffer,
- int buffersize);
-
- int pcre_get_substring(const char *subject, int *ovector,
- int stringcount, int stringnumber,
- const char **stringptr);
-
- int pcre_get_substring_list(const char *subject,
- int *ovector, int stringcount, const char ***listptr);
-
- void pcre_free_substring(const char *stringptr);
-
- void pcre_free_substring_list(const char **stringptr);
-
- const unsigned char *pcre_maketables(void);
-
- int pcre_fullinfo(const pcre *code, const pcre_extra *extra,
- int what, void *where);
-
- int pcre_info(const pcre *code, int *optptr, *firstcharptr);
-
- char *pcre_version(void);
-
- void *(*pcre_malloc)(size_t);
-
- void (*pcre_free)(void *);
-
-
-
-
-DESCRIPTION
- The PCRE library is a set of functions that implement regu-
- lar expression pattern matching using the same syntax and
- semantics as Perl 5, with just a few differences (see
-
- below). The current implementation corresponds to Perl
- 5.005, with some additional features from later versions.
- This includes some experimental, incomplete support for
- UTF-8 encoded strings. Details of exactly what is and what
- is not supported are given below.
-
- PCRE has its own native API, which is described in this
- document. There is also a set of wrapper functions that
- correspond to the POSIX regular expression API. These are
- described in the pcreposix documentation.
-
- The native API function prototypes are defined in the header
- file pcre.h, and on Unix systems the library itself is
- called libpcre.a, so can be accessed by adding -lpcre to the
- command for linking an application which calls it. The
- header file defines the macros PCRE_MAJOR and PCRE_MINOR to
- contain the major and minor release numbers for the library.
- Applications can use these to include support for different
- releases.
-
- The functions pcre_compile(), pcre_study(), and pcre_exec()
- are used for compiling and matching regular expressions.
-
- The functions pcre_copy_substring(), pcre_get_substring(),
- and pcre_get_substring_list() are convenience functions for
- extracting captured substrings from a matched subject
- string; pcre_free_substring() and pcre_free_substring_list()
- are also provided, to free the memory used for extracted
- strings.
-
- The function pcre_maketables() is used (optionally) to build
- a set of character tables in the current locale for passing
- to pcre_compile().
-
- The function pcre_fullinfo() is used to find out information
- about a compiled pattern; pcre_info() is an obsolete version
- which returns only some of the available information, but is
- retained for backwards compatibility. The function
- pcre_version() returns a pointer to a string containing the
- version of PCRE and its date of release.
-
- The global variables pcre_malloc and pcre_free initially
- contain the entry points of the standard malloc() and free()
- functions respectively. PCRE calls the memory management
- functions via these variables, so a calling program can
- replace them if it wishes to intercept the calls. This
- should be done before calling any PCRE functions.
-
-
-
-MULTI-THREADING
- The PCRE functions can be used in multi-threading
-
-
-
-
-
-SunOS 5.8 Last change: 2
-
-
-
- applications, with the proviso that the memory management
- functions pointed to by pcre_malloc and pcre_free are shared
- by all threads.
-
- The compiled form of a regular expression is not altered
- during matching, so the same compiled pattern can safely be
- used by several threads at once.
-
-
-
-COMPILING A PATTERN
- The function pcre_compile() is called to compile a pattern
- into an internal form. The pattern is a C string terminated
- by a binary zero, and is passed in the argument pattern. A
- pointer to a single block of memory that is obtained via
- pcre_malloc is returned. This contains the compiled code and
- related data. The pcre type is defined for this for conveni-
- ence, but in fact pcre is just a typedef for void, since the
- contents of the block are not externally defined. It is up
- to the caller to free the memory when it is no longer
- required.
-
- The size of a compiled pattern is roughly proportional to
- the length of the pattern string, except that each character
- class (other than those containing just a single character,
- negated or not) requires 33 bytes, and repeat quantifiers
- with a minimum greater than one or a bounded maximum cause
- the relevant portions of the compiled pattern to be repli-
- cated.
-
- The options argument contains independent bits that affect
- the compilation. It should be zero if no options are
- required. Some of the options, in particular, those that are
- compatible with Perl, can also be set and unset from within
- the pattern (see the detailed description of regular expres-
- sions below). For these options, the contents of the options
- argument specifies their initial settings at the start of
- compilation and execution. The PCRE_ANCHORED option can be
- set at the time of matching as well as at compile time.
-
- If errptr is NULL, pcre_compile() returns NULL immediately.
- Otherwise, if compilation of a pattern fails, pcre_compile()
- returns NULL, and sets the variable pointed to by errptr to
- point to a textual error message. The offset from the start
- of the pattern to the character where the error was
- discovered is placed in the variable pointed to by
- erroffset, which must not be NULL. If it is, an immediate
- error is given.
-
- If the final argument, tableptr, is NULL, PCRE uses a
- default set of character tables which are built when it is
- compiled, using the default C locale. Otherwise, tableptr
- must be the result of a call to pcre_maketables(). See the
- section on locale support below.
-
- The following option bits are defined in the header file:
-
- PCRE_ANCHORED
-
- If this bit is set, the pattern is forced to be "anchored",
- that is, it is constrained to match only at the start of the
- string which is being searched (the "subject string"). This
- effect can also be achieved by appropriate constructs in the
- pattern itself, which is the only way to do it in Perl.
-
- PCRE_CASELESS
-
- If this bit is set, letters in the pattern match both upper
- and lower case letters. It is equivalent to Perl's /i
- option.
-
- PCRE_DOLLAR_ENDONLY
-
- If this bit is set, a dollar metacharacter in the pattern
- matches only at the end of the subject string. Without this
- option, a dollar also matches immediately before the final
- character if it is a newline (but not before any other new-
- lines). The PCRE_DOLLAR_ENDONLY option is ignored if
- PCRE_MULTILINE is set. There is no equivalent to this option
- in Perl.
-
- PCRE_DOTALL
-
- If this bit is set, a dot metacharater in the pattern
- matches all characters, including newlines. Without it, new-
- lines are excluded. This option is equivalent to Perl's /s
- option. A negative class such as [^a] always matches a new-
- line character, independent of the setting of this option.
-
- PCRE_EXTENDED
-
- If this bit is set, whitespace data characters in the pat-
- tern are totally ignored except when escaped or inside a
- character class, and characters between an unescaped # out-
- side a character class and the next newline character,
- inclusive, are also ignored. This is equivalent to Perl's /x
- option, and makes it possible to include comments inside
- complicated patterns. Note, however, that this applies only
- to data characters. Whitespace characters may never appear
- within special character sequences in a pattern, for example
- within the sequence (?( which introduces a conditional sub-
- pattern.
-
- PCRE_EXTRA
-
- This option was invented in order to turn on additional
- functionality of PCRE that is incompatible with Perl, but it
- is currently of very little use. When set, any backslash in
- a pattern that is followed by a letter that has no special
- meaning causes an error, thus reserving these combinations
- for future expansion. By default, as in Perl, a backslash
- followed by a letter with no special meaning is treated as a
- literal. There are at present no other features controlled
- by this option. It can also be set by a (?X) option setting
- within a pattern.
-
- PCRE_MULTILINE
-
- By default, PCRE treats the subject string as consisting of
- a single "line" of characters (even if it actually contains
- several newlines). The "start of line" metacharacter (^)
- matches only at the start of the string, while the "end of
- line" metacharacter ($) matches only at the end of the
- string, or before a terminating newline (unless
- PCRE_DOLLAR_ENDONLY is set). This is the same as Perl.
-
- When PCRE_MULTILINE it is set, the "start of line" and "end
- of line" constructs match immediately following or immedi-
- ately before any newline in the subject string, respec-
- tively, as well as at the very start and end. This is
- equivalent to Perl's /m option. If there are no "\n" charac-
- ters in a subject string, or no occurrences of ^ or $ in a
- pattern, setting PCRE_MULTILINE has no effect.
-
- PCRE_UNGREEDY
-
- This option inverts the "greediness" of the quantifiers so
- that they are not greedy by default, but become greedy if
- followed by "?". It is not compatible with Perl. It can also
- be set by a (?U) option setting within the pattern.
-
- PCRE_UTF8
-
- This option causes PCRE to regard both the pattern and the
- subject as strings of UTF-8 characters instead of just byte
- strings. However, it is available only if PCRE has been
- built to include UTF-8 support. If not, the use of this
- option provokes an error. Support for UTF-8 is new, experi-
- mental, and incomplete. Details of exactly what it entails
- are given below.
-
-
-
-STUDYING A PATTERN
- When a pattern is going to be used several times, it is
- worth spending more time analyzing it in order to speed up
- the time taken for matching. The function pcre_study() takes
-
- a pointer to a compiled pattern as its first argument, and
- returns a pointer to a pcre_extra block (another void
- typedef) containing additional information about the pat-
- tern; this can be passed to pcre_exec(). If no additional
- information is available, NULL is returned.
-
- The second argument contains option bits. At present, no
- options are defined for pcre_study(), and this argument
- should always be zero.
-
- The third argument for pcre_study() is a pointer to an error
- message. If studying succeeds (even if no data is returned),
- the variable it points to is set to NULL. Otherwise it
- points to a textual error message.
-
- At present, studying a pattern is useful only for non-
- anchored patterns that do not have a single fixed starting
- character. A bitmap of possible starting characters is
- created.
-
-
-
-LOCALE SUPPORT
- PCRE handles caseless matching, and determines whether char-
- acters are letters, digits, or whatever, by reference to a
- set of tables. The library contains a default set of tables
- which is created in the default C locale when PCRE is com-
- piled. This is used when the final argument of
- pcre_compile() is NULL, and is sufficient for many applica-
- tions.
-
- An alternative set of tables can, however, be supplied. Such
- tables are built by calling the pcre_maketables() function,
- which has no arguments, in the relevant locale. The result
- can then be passed to pcre_compile() as often as necessary.
- For example, to build and use tables that are appropriate
- for the French locale (where accented characters with codes
- greater than 128 are treated as letters), the following code
- could be used:
-
- setlocale(LC_CTYPE, "fr");
- tables = pcre_maketables();
- re = pcre_compile(..., tables);
-
- The tables are built in memory that is obtained via
- pcre_malloc. The pointer that is passed to pcre_compile is
- saved with the compiled pattern, and the same tables are
- used via this pointer by pcre_study() and pcre_exec(). Thus
- for any single pattern, compilation, studying and matching
- all happen in the same locale, but different patterns can be
- compiled in different locales. It is the caller's responsi-
- bility to ensure that the memory containing the tables
- remains available for as long as it is needed.
-
-
-
-INFORMATION ABOUT A PATTERN
- The pcre_fullinfo() function returns information about a
- compiled pattern. It replaces the obsolete pcre_info() func-
- tion, which is nevertheless retained for backwards compabil-
- ity (and is documented below).
-
- The first argument for pcre_fullinfo() is a pointer to the
- compiled pattern. The second argument is the result of
- pcre_study(), or NULL if the pattern was not studied. The
- third argument specifies which piece of information is
- required, while the fourth argument is a pointer to a vari-
- able to receive the data. The yield of the function is zero
- for success, or one of the following negative numbers:
-
- PCRE_ERROR_NULL the argument code was NULL
- the argument where was NULL
- PCRE_ERROR_BADMAGIC the "magic number" was not found
- PCRE_ERROR_BADOPTION the value of what was invalid
-
- The possible values for the third argument are defined in
- pcre.h, and are as follows:
-
- PCRE_INFO_OPTIONS
-
- Return a copy of the options with which the pattern was com-
- piled. The fourth argument should point to au unsigned long
- int variable. These option bits are those specified in the
- call to pcre_compile(), modified by any top-level option
- settings within the pattern itself, and with the
- PCRE_ANCHORED bit forcibly set if the form of the pattern
- implies that it can match only at the start of a subject
- string.
-
- PCRE_INFO_SIZE
-
- Return the size of the compiled pattern, that is, the value
- that was passed as the argument to pcre_malloc() when PCRE
- was getting memory in which to place the compiled data. The
- fourth argument should point to a size_t variable.
-
- PCRE_INFO_CAPTURECOUNT
-
- Return the number of capturing subpatterns in the pattern.
- The fourth argument should point to an int variable.
-
- PCRE_INFO_BACKREFMAX
-
- Return the number of the highest back reference in the
- pattern. The fourth argument should point to an int vari-
- able. Zero is returned if there are no back references.
-
- PCRE_INFO_FIRSTCHAR
-
- Return information about the first character of any matched
- string, for a non-anchored pattern. If there is a fixed
- first character, e.g. from a pattern such as
- (cat|cow|coyote), it is returned in the integer pointed to
- by where. Otherwise, if either
-
- (a) the pattern was compiled with the PCRE_MULTILINE option,
- and every branch starts with "^", or
-
- (b) every branch of the pattern starts with ".*" and
- PCRE_DOTALL is not set (if it were set, the pattern would be
- anchored),
-
- -1 is returned, indicating that the pattern matches only at
- the start of a subject string or after any "\n" within the
- string. Otherwise -2 is returned. For anchored patterns, -2
- is returned.
-
- PCRE_INFO_FIRSTTABLE
-
- If the pattern was studied, and this resulted in the con-
- struction of a 256-bit table indicating a fixed set of char-
- acters for the first character in any matching string, a
- pointer to the table is returned. Otherwise NULL is
- returned. The fourth argument should point to an unsigned
- char * variable.
-
- PCRE_INFO_LASTLITERAL
-
- For a non-anchored pattern, return the value of the right-
- most literal character which must exist in any matched
- string, other than at its start. The fourth argument should
- point to an int variable. If there is no such character, or
- if the pattern is anchored, -1 is returned. For example, for
- the pattern /a\d+z\d+/ the returned value is 'z'.
-
- The pcre_info() function is now obsolete because its inter-
- face is too restrictive to return all the available data
- about a compiled pattern. New programs should use
- pcre_fullinfo() instead. The yield of pcre_info() is the
- number of capturing subpatterns, or one of the following
- negative numbers:
-
- PCRE_ERROR_NULL the argument code was NULL
- PCRE_ERROR_BADMAGIC the "magic number" was not found
-
- If the optptr argument is not NULL, a copy of the options
- with which the pattern was compiled is placed in the integer
- it points to (see PCRE_INFO_OPTIONS above).
-
- If the pattern is not anchored and the firstcharptr argument
- is not NULL, it is used to pass back information about the
- first character of any matched string (see
- PCRE_INFO_FIRSTCHAR above).
-
-
-
-MATCHING A PATTERN
- The function pcre_exec() is called to match a subject string
- against a pre-compiled pattern, which is passed in the code
- argument. If the pattern has been studied, the result of the
- study should be passed in the extra argument. Otherwise this
- must be NULL.
-
- The PCRE_ANCHORED option can be passed in the options argu-
- ment, whose unused bits must be zero. However, if a pattern
- was compiled with PCRE_ANCHORED, or turned out to be
- anchored by virtue of its contents, it cannot be made
- unachored at matching time.
-
- There are also three further options that can be set only at
- matching time:
-
- PCRE_NOTBOL
-
- The first character of the string is not the beginning of a
- line, so the circumflex metacharacter should not match
- before it. Setting this without PCRE_MULTILINE (at compile
- time) causes circumflex never to match.
-
- PCRE_NOTEOL
-
- The end of the string is not the end of a line, so the dol-
- lar metacharacter should not match it nor (except in multi-
- line mode) a newline immediately before it. Setting this
- without PCRE_MULTILINE (at compile time) causes dollar never
- to match.
-
- PCRE_NOTEMPTY
-
- An empty string is not considered to be a valid match if
- this option is set. If there are alternatives in the pat-
- tern, they are tried. If all the alternatives match the
- empty string, the entire match fails. For example, if the
- pattern
-
- a?b?
-
- is applied to a string not beginning with "a" or "b", it
- matches the empty string at the start of the subject. With
- PCRE_NOTEMPTY set, this match is not valid, so PCRE searches
- further into the string for occurrences of "a" or "b".
-
- Perl has no direct equivalent of PCRE_NOTEMPTY, but it does
- make a special case of a pattern match of the empty string
- within its split() function, and when using the /g modifier.
- It is possible to emulate Perl's behaviour after matching a
- null string by first trying the match again at the same
- offset with PCRE_NOTEMPTY set, and then if that fails by
- advancing the starting offset (see below) and trying an
- ordinary match again.
-
- The subject string is passed as a pointer in subject, a
- length in length, and a starting offset in startoffset.
- Unlike the pattern string, it may contain binary zero char-
- acters. When the starting offset is zero, the search for a
- match starts at the beginning of the subject, and this is by
- far the most common case.
-
- A non-zero starting offset is useful when searching for
- another match in the same subject by calling pcre_exec()
- again after a previous success. Setting startoffset differs
- from just passing over a shortened string and setting
- PCRE_NOTBOL in the case of a pattern that begins with any
- kind of lookbehind. For example, consider the pattern
-
- \Biss\B
-
- which finds occurrences of "iss" in the middle of words. (\B
- matches only if the current position in the subject is not a
- word boundary.) When applied to the string "Mississipi" the
- first call to pcre_exec() finds the first occurrence. If
- pcre_exec() is called again with just the remainder of the
- subject, namely "issipi", it does not match, because \B is
- always false at the start of the subject, which is deemed to
- be a word boundary. However, if pcre_exec() is passed the
- entire string again, but with startoffset set to 4, it finds
- the second occurrence of "iss" because it is able to look
- behind the starting point to discover that it is preceded by
- a letter.
-
- If a non-zero starting offset is passed when the pattern is
- anchored, one attempt to match at the given offset is tried.
- This can only succeed if the pattern does not require the
- match to be at the start of the subject.
-
- In general, a pattern matches a certain portion of the sub-
- ject, and in addition, further substrings from the subject
- may be picked out by parts of the pattern. Following the
- usage in Jeffrey Friedl's book, this is called "capturing"
- in what follows, and the phrase "capturing subpattern" is
- used for a fragment of a pattern that picks out a substring.
- PCRE supports several other kinds of parenthesized subpat-
- tern that do not cause substrings to be captured.
-
- Captured substrings are returned to the caller via a vector
- of integer offsets whose address is passed in ovector. The
- number of elements in the vector is passed in ovecsize. The
- first two-thirds of the vector is used to pass back captured
- substrings, each substring using a pair of integers. The
- remaining third of the vector is used as workspace by
- pcre_exec() while matching capturing subpatterns, and is not
- available for passing back information. The length passed in
- ovecsize should always be a multiple of three. If it is not,
- it is rounded down.
-
- When a match has been successful, information about captured
- substrings is returned in pairs of integers, starting at the
- beginning of ovector, and continuing up to two-thirds of its
- length at the most. The first element of a pair is set to
- the offset of the first character in a substring, and the
- second is set to the offset of the first character after the
- end of a substring. The first pair, ovector[0] and ovec-
- tor[1], identify the portion of the subject string matched
- by the entire pattern. The next pair is used for the first
- capturing subpattern, and so on. The value returned by
- pcre_exec() is the number of pairs that have been set. If
- there are no capturing subpatterns, the return value from a
- successful match is 1, indicating that just the first pair
- of offsets has been set.
-
- Some convenience functions are provided for extracting the
- captured substrings as separate strings. These are described
- in the following section.
-
- It is possible for an capturing subpattern number n+1 to
- match some part of the subject when subpattern n has not
- been used at all. For example, if the string "abc" is
- matched against the pattern (a|(z))(bc) subpatterns 1 and 3
- are matched, but 2 is not. When this happens, both offset
- values corresponding to the unused subpattern are set to -1.
-
- If a capturing subpattern is matched repeatedly, it is the
- last portion of the string that it matched that gets
- returned.
-
- If the vector is too small to hold all the captured sub-
- strings, it is used as far as possible (up to two-thirds of
- its length), and the function returns a value of zero. In
- particular, if the substring offsets are not of interest,
- pcre_exec() may be called with ovector passed as NULL and
- ovecsize as zero. However, if the pattern contains back
- references and the ovector isn't big enough to remember the
- related substrings, PCRE has to get additional memory for
- use during matching. Thus it is usually advisable to supply
- an ovector.
-
- Note that pcre_info() can be used to find out how many cap-
- turing subpatterns there are in a compiled pattern. The
- smallest size for ovector that will allow for n captured
- substrings in addition to the offsets of the substring
- matched by the whole pattern is (n+1)*3.
-
- If pcre_exec() fails, it returns a negative number. The fol-
- lowing are defined in the header file:
-
- PCRE_ERROR_NOMATCH (-1)
-
- The subject string did not match the pattern.
-
- PCRE_ERROR_NULL (-2)
-
- Either code or subject was passed as NULL, or ovector was
- NULL and ovecsize was not zero.
-
- PCRE_ERROR_BADOPTION (-3)
-
- An unrecognized bit was set in the options argument.
-
- PCRE_ERROR_BADMAGIC (-4)
-
- PCRE stores a 4-byte "magic number" at the start of the com-
- piled code, to catch the case when it is passed a junk
- pointer. This is the error it gives when the magic number
- isn't present.
-
- PCRE_ERROR_UNKNOWN_NODE (-5)
-
- While running the pattern match, an unknown item was encoun-
- tered in the compiled pattern. This error could be caused by
- a bug in PCRE or by overwriting of the compiled pattern.
-
- PCRE_ERROR_NOMEMORY (-6)
-
- If a pattern contains back references, but the ovector that
- is passed to pcre_exec() is not big enough to remember the
- referenced substrings, PCRE gets a block of memory at the
- start of matching to use for this purpose. If the call via
- pcre_malloc() fails, this error is given. The memory is
- freed at the end of matching.
-
-
-
-EXTRACTING CAPTURED SUBSTRINGS
- Captured substrings can be accessed directly by using the
-
-
-
-
-
-SunOS 5.8 Last change: 12
-
-
-
- offsets returned by pcre_exec() in ovector. For convenience,
- the functions pcre_copy_substring(), pcre_get_substring(),
- and pcre_get_substring_list() are provided for extracting
- captured substrings as new, separate, zero-terminated
- strings. A substring that contains a binary zero is
- correctly extracted and has a further zero added on the end,
- but the result does not, of course, function as a C string.
-
- The first three arguments are the same for all three func-
- tions: subject is the subject string which has just been
- successfully matched, ovector is a pointer to the vector of
- integer offsets that was passed to pcre_exec(), and
- stringcount is the number of substrings that were captured
- by the match, including the substring that matched the
- entire regular expression. This is the value returned by
- pcre_exec if it is greater than zero. If pcre_exec()
- returned zero, indicating that it ran out of space in ovec-
- tor, the value passed as stringcount should be the size of
- the vector divided by three.
-
- The functions pcre_copy_substring() and pcre_get_substring()
- extract a single substring, whose number is given as string-
- number. A value of zero extracts the substring that matched
- the entire pattern, while higher values extract the captured
- substrings. For pcre_copy_substring(), the string is placed
- in buffer, whose length is given by buffersize, while for
- pcre_get_substring() a new block of memory is obtained via
- pcre_malloc, and its address is returned via stringptr. The
- yield of the function is the length of the string, not
- including the terminating zero, or one of
-
- PCRE_ERROR_NOMEMORY (-6)
-
- The buffer was too small for pcre_copy_substring(), or the
- attempt to get memory failed for pcre_get_substring().
-
- PCRE_ERROR_NOSUBSTRING (-7)
-
- There is no substring whose number is stringnumber.
-
- The pcre_get_substring_list() function extracts all avail-
- able substrings and builds a list of pointers to them. All
- this is done in a single block of memory which is obtained
- via pcre_malloc. The address of the memory block is returned
- via listptr, which is also the start of the list of string
- pointers. The end of the list is marked by a NULL pointer.
- The yield of the function is zero if all went well, or
-
- PCRE_ERROR_NOMEMORY (-6)
-
- if the attempt to get the memory block failed.
-
- When any of these functions encounter a substring that is
- unset, which can happen when capturing subpattern number n+1
- matches some part of the subject, but subpattern n has not
- been used at all, they return an empty string. This can be
- distinguished from a genuine zero-length substring by
- inspecting the appropriate offset in ovector, which is nega-
- tive for unset substrings.
-
- The two convenience functions pcre_free_substring() and
- pcre_free_substring_list() can be used to free the memory
- returned by a previous call of pcre_get_substring() or
- pcre_get_substring_list(), respectively. They do nothing
- more than call the function pointed to by pcre_free, which
- of course could be called directly from a C program. How-
- ever, PCRE is used in some situations where it is linked via
- a special interface to another programming language which
- cannot use pcre_free directly; it is for these cases that
- the functions are provided.
-
-
-
-LIMITATIONS
- There are some size limitations in PCRE but it is hoped that
- they will never in practice be relevant. The maximum length
- of a compiled pattern is 65539 (sic) bytes. All values in
- repeating quantifiers must be less than 65536. The maximum
- number of capturing subpatterns is 99. The maximum number
- of all parenthesized subpatterns, including capturing sub-
- patterns, assertions, and other types of subpattern, is 200.
-
- The maximum length of a subject string is the largest posi-
- tive number that an integer variable can hold. However, PCRE
- uses recursion to handle subpatterns and indefinite repeti-
- tion. This means that the available stack space may limit
- the size of a subject string that can be processed by cer-
- tain patterns.
-
-
-
-DIFFERENCES FROM PERL
- The differences described here are with respect to Perl
- 5.005.
-
- 1. By default, a whitespace character is any character that
- the C library function isspace() recognizes, though it is
- possible to compile PCRE with alternative character type
- tables. Normally isspace() matches space, formfeed, newline,
- carriage return, horizontal tab, and vertical tab. Perl 5 no
- longer includes vertical tab in its set of whitespace char-
- acters. The \v escape that was in the Perl documentation for
- a long time was never in fact recognized. However, the char-
- acter itself was treated as whitespace at least up to 5.002.
- In 5.004 and 5.005 it does not match \s.
-
- 2. PCRE does not allow repeat quantifiers on lookahead
- assertions. Perl permits them, but they do not mean what you
- might think. For example, (?!a){3} does not assert that the
- next three characters are not "a". It just asserts that the
- next character is not "a" three times.
-
- 3. Capturing subpatterns that occur inside negative looka-
- head assertions are counted, but their entries in the
- offsets vector are never set. Perl sets its numerical vari-
- ables from any such patterns that are matched before the
- assertion fails to match something (thereby succeeding), but
- only if the negative lookahead assertion contains just one
- branch.
-
- 4. Though binary zero characters are supported in the sub-
- ject string, they are not allowed in a pattern string
- because it is passed as a normal C string, terminated by
- zero. The escape sequence "\0" can be used in the pattern to
- represent a binary zero.
-
- 5. The following Perl escape sequences are not supported:
- \l, \u, \L, \U, \E, \Q. In fact these are implemented by
- Perl's general string-handling and are not part of its pat-
- tern matching engine.
-
- 6. The Perl \G assertion is not supported as it is not
- relevant to single pattern matches.
-
- 7. Fairly obviously, PCRE does not support the (?{code}) and
- (?p{code}) constructions. However, there is some experimen-
- tal support for recursive patterns using the non-Perl item
- (?R).
-
- 8. There are at the time of writing some oddities in Perl
- 5.005_02 concerned with the settings of captured strings
- when part of a pattern is repeated. For example, matching
- "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value
- "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2
- unset. However, if the pattern is changed to
- /^(aa(b(b))?)+$/ then $2 (and $3) are set.
-
- In Perl 5.004 $2 is set in both cases, and that is also true
- of PCRE. If in the future Perl changes to a consistent state
- that is different, PCRE may change to follow.
-
- 9. Another as yet unresolved discrepancy is that in Perl
- 5.005_02 the pattern /^(a)?(?(1)a|b)+$/ matches the string
- "a", whereas in PCRE it does not. However, in both Perl and
- PCRE /^(a)?a/ matched against "a" leaves $1 unset.
-
- 10. PCRE provides some extensions to the Perl regular
- expression facilities:
-
- (a) Although lookbehind assertions must match fixed length
- strings, each alternative branch of a lookbehind assertion
- can match a different length of string. Perl 5.005 requires
- them all to have the same length.
-
- (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not
- set, the $ meta- character matches only at the very end of
- the string.
-
- (c) If PCRE_EXTRA is set, a backslash followed by a letter
- with no special meaning is faulted.
-
- (d) If PCRE_UNGREEDY is set, the greediness of the repeti-
- tion quantifiers is inverted, that is, by default they are
- not greedy, but if followed by a question mark they are.
-
- (e) PCRE_ANCHORED can be used to force a pattern to be tried
- only at the start of the subject.
-
- (f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options
- for pcre_exec() have no Perl equivalents.
-
- (g) The (?R) construct allows for recursive pattern matching
- (Perl 5.6 can do this using the (?p{code}) construct, which
- PCRE cannot of course support.)
-
-
-
-REGULAR EXPRESSION DETAILS
- The syntax and semantics of the regular expressions sup-
- ported by PCRE are described below. Regular expressions are
- also described in the Perl documentation and in a number of
- other books, some of which have copious examples. Jeffrey
- Friedl's "Mastering Regular Expressions", published by
- O'Reilly (ISBN 1-56592-257), covers them in great detail.
-
- The description here is intended as reference documentation.
- The basic operation of PCRE is on strings of bytes. However,
- there is the beginnings of some support for UTF-8 character
- strings. To use this support you must configure PCRE to
- include it, and then call pcre_compile() with the PCRE_UTF8
- option. How this affects the pattern matching is described
- in the final section of this document.
-
- A regular expression is a pattern that is matched against a
- subject string from left to right. Most characters stand for
- themselves in a pattern, and match the corresponding charac-
- ters in the subject. As a trivial example, the pattern
-
- The quick brown fox
-
- matches a portion of a subject string that is identical to
- itself. The power of regular expressions comes from the
- ability to include alternatives and repetitions in the pat-
- tern. These are encoded in the pattern by the use of meta-
- characters, which do not stand for themselves but instead
- are interpreted in some special way.
-
- There are two different sets of meta-characters: those that
- are recognized anywhere in the pattern except within square
- brackets, and those that are recognized in square brackets.
- Outside square brackets, the meta-characters are as follows:
-
- \ general escape character with several uses
- ^ assert start of subject (or line, in multiline
- mode)
- $ assert end of subject (or line, in multiline mode)
- . match any character except newline (by default)
- [ start character class definition
- | start of alternative branch
- ( start subpattern
- ) end subpattern
- ? extends the meaning of (
- also 0 or 1 quantifier
- also quantifier minimizer
- * 0 or more quantifier
- + 1 or more quantifier
- { start min/max quantifier
-
- Part of a pattern that is in square brackets is called a
- "character class". In a character class the only meta-
- characters are:
-
- \ general escape character
- ^ negate the class, but only if the first character
- - indicates character range
- ] terminates the character class
-
- The following sections describe the use of each of the
- meta-characters.
-
-
-
-BACKSLASH
- The backslash character has several uses. Firstly, if it is
- followed by a non-alphameric character, it takes away any
- special meaning that character may have. This use of
- backslash as an escape character applies both inside and
- outside character classes.
-
- For example, if you want to match a "*" character, you write
- "\*" in the pattern. This applies whether or not the follow-
- ing character would otherwise be interpreted as a meta-
- character, so it is always safe to precede a non-alphameric
- with "\" to specify that it stands for itself. In particu-
- lar, if you want to match a backslash, you write "\\".
-
- If a pattern is compiled with the PCRE_EXTENDED option, whi-
- tespace in the pattern (other than in a character class) and
- characters between a "#" outside a character class and the
- next newline character are ignored. An escaping backslash
- can be used to include a whitespace or "#" character as part
- of the pattern.
-
- A second use of backslash provides a way of encoding non-
- printing characters in patterns in a visible manner. There
- is no restriction on the appearance of non-printing charac-
- ters, apart from the binary zero that terminates a pattern,
- but when a pattern is being prepared by text editing, it is
- usually easier to use one of the following escape sequences
- than the binary character it represents:
-
- \a alarm, that is, the BEL character (hex 07)
- \cx "control-x", where x is any character
- \e escape (hex 1B)
- \f formfeed (hex 0C)
- \n newline (hex 0A)
- \r carriage return (hex 0D)
- \t tab (hex 09)
- \xhh character with hex code hh
- \ddd character with octal code ddd, or backreference
-
- The precise effect of "\cx" is as follows: if "x" is a lower
- case letter, it is converted to upper case. Then bit 6 of
- the character (hex 40) is inverted. Thus "\cz" becomes hex
- 1A, but "\c{" becomes hex 3B, while "\c;" becomes hex 7B.
-
- After "\x", up to two hexadecimal digits are read (letters
- can be in upper or lower case).
-
- After "\0" up to two further octal digits are read. In both
- cases, if there are fewer than two digits, just those that
- are present are used. Thus the sequence "\0\x\07" specifies
- two binary zeros followed by a BEL character. Make sure you
- supply two digits after the initial zero if the character
- that follows is itself an octal digit.
-
- The handling of a backslash followed by a digit other than 0
- is complicated. Outside a character class, PCRE reads it
- and any following digits as a decimal number. If the number
- is less than 10, or if there have been at least that many
- previous capturing left parentheses in the expression, the
- entire sequence is taken as a back reference. A description
- of how this works is given later, following the discussion
- of parenthesized subpatterns.
-
- Inside a character class, or if the decimal number is
- greater than 9 and there have not been that many capturing
- subpatterns, PCRE re-reads up to three octal digits follow-
- ing the backslash, and generates a single byte from the
- least significant 8 bits of the value. Any subsequent digits
- stand for themselves. For example:
-
- \040 is another way of writing a space
- \40 is the same, provided there are fewer than 40
- previous capturing subpatterns
- \7 is always a back reference
- \11 might be a back reference, or another way of
- writing a tab
- \011 is always a tab
- \0113 is a tab followed by the character "3"
- \113 is the character with octal code 113 (since there
- can be no more than 99 back references)
- \377 is a byte consisting entirely of 1 bits
- \81 is either a back reference, or a binary zero
- followed by the two characters "8" and "1"
-
- Note that octal values of 100 or greater must not be intro-
- duced by a leading zero, because no more than three octal
- digits are ever read.
-
- All the sequences that define a single byte value can be
- used both inside and outside character classes. In addition,
- inside a character class, the sequence "\b" is interpreted
- as the backspace character (hex 08). Outside a character
- class it has a different meaning (see below).
-
- The third use of backslash is for specifying generic charac-
- ter types:
-
- \d any decimal digit
- \D any character that is not a decimal digit
- \s any whitespace character
- \S any character that is not a whitespace character
- \w any "word" character
- \W any "non-word" character
-
- Each pair of escape sequences partitions the complete set of
- characters into two disjoint sets. Any given character
- matches one, and only one, of each pair.
-
- A "word" character is any letter or digit or the underscore
- character, that is, any character which can be part of a
- Perl "word". The definition of letters and digits is con-
- trolled by PCRE's character tables, and may vary if locale-
- specific matching is taking place (see "Locale support"
- above). For example, in the "fr" (French) locale, some char-
- acter codes greater than 128 are used for accented letters,
- and these are matched by \w.
-
- These character type sequences can appear both inside and
- outside character classes. They each match one character of
- the appropriate type. If the current matching point is at
- the end of the subject string, all of them fail, since there
- is no character to match.
-
- The fourth use of backslash is for certain simple asser-
- tions. An assertion specifies a condition that has to be met
- at a particular point in a match, without consuming any
- characters from the subject string. The use of subpatterns
- for more complicated assertions is described below. The
- backslashed assertions are
-
- \b word boundary
- \B not a word boundary
- \A start of subject (independent of multiline mode)
- \Z end of subject or newline at end (independent of
- multiline mode)
- \z end of subject (independent of multiline mode)
-
- These assertions may not appear in character classes (but
- note that "\b" has a different meaning, namely the backspace
- character, inside a character class).
-
- A word boundary is a position in the subject string where
- the current character and the previous character do not both
- match \w or \W (i.e. one matches \w and the other matches
- \W), or the start or end of the string if the first or last
- character matches \w, respectively.
-
- The \A, \Z, and \z assertions differ from the traditional
- circumflex and dollar (described below) in that they only
- ever match at the very start and end of the subject string,
- whatever options are set. They are not affected by the
- PCRE_NOTBOL or PCRE_NOTEOL options. If the startoffset argu-
- ment of pcre_exec() is non-zero, \A can never match. The
- difference between \Z and \z is that \Z matches before a
- newline that is the last character of the string as well as
- at the end of the string, whereas \z matches only at the
- end.
-
-
-
-CIRCUMFLEX AND DOLLAR
- Outside a character class, in the default matching mode, the
- circumflex character is an assertion which is true only if
- the current matching point is at the start of the subject
-
- string. If the startoffset argument of pcre_exec() is non-
- zero, circumflex can never match. Inside a character class,
- circumflex has an entirely different meaning (see below).
-
- Circumflex need not be the first character of the pattern if
- a number of alternatives are involved, but it should be the
- first thing in each alternative in which it appears if the
- pattern is ever to match that branch. If all possible alter-
- natives start with a circumflex, that is, if the pattern is
- constrained to match only at the start of the subject, it is
- said to be an "anchored" pattern. (There are also other con-
- structs that can cause a pattern to be anchored.)
-
- A dollar character is an assertion which is true only if the
- current matching point is at the end of the subject string,
- or immediately before a newline character that is the last
- character in the string (by default). Dollar need not be the
- last character of the pattern if a number of alternatives
- are involved, but it should be the last item in any branch
- in which it appears. Dollar has no special meaning in a
- character class.
-
- The meaning of dollar can be changed so that it matches only
- at the very end of the string, by setting the
- PCRE_DOLLAR_ENDONLY option at compile or matching time. This
- does not affect the \Z assertion.
-
- The meanings of the circumflex and dollar characters are
- changed if the PCRE_MULTILINE option is set. When this is
- the case, they match immediately after and immediately
- before an internal "\n" character, respectively, in addition
- to matching at the start and end of the subject string. For
- example, the pattern /^abc$/ matches the subject string
- "def\nabc" in multiline mode, but not otherwise. Conse-
- quently, patterns that are anchored in single line mode
- because all branches start with "^" are not anchored in mul-
- tiline mode, and a match for circumflex is possible when the
- startoffset argument of pcre_exec() is non-zero. The
- PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is
- set.
-
- Note that the sequences \A, \Z, and \z can be used to match
- the start and end of the subject in both modes, and if all
- branches of a pattern start with \A is it always anchored,
- whether PCRE_MULTILINE is set or not.
-
-
-
-FULL STOP (PERIOD, DOT)
- Outside a character class, a dot in the pattern matches any
- one character in the subject, including a non-printing char-
- acter, but not (by default) newline. If the PCRE_DOTALL
-
- option is set, dots match newlines as well. The handling of
- dot is entirely independent of the handling of circumflex
- and dollar, the only relationship being that they both
- involve newline characters. Dot has no special meaning in a
- character class.
-
-
-
-SQUARE BRACKETS
- An opening square bracket introduces a character class, ter-
- minated by a closing square bracket. A closing square
- bracket on its own is not special. If a closing square
- bracket is required as a member of the class, it should be
- the first data character in the class (after an initial cir-
- cumflex, if present) or escaped with a backslash.
-
- A character class matches a single character in the subject;
- the character must be in the set of characters defined by
- the class, unless the first character in the class is a cir-
- cumflex, in which case the subject character must not be in
- the set defined by the class. If a circumflex is actually
- required as a member of the class, ensure it is not the
- first character, or escape it with a backslash.
-
- For example, the character class [aeiou] matches any lower
- case vowel, while [^aeiou] matches any character that is not
- a lower case vowel. Note that a circumflex is just a con-
- venient notation for specifying the characters which are in
- the class by enumerating those that are not. It is not an
- assertion: it still consumes a character from the subject
- string, and fails if the current pointer is at the end of
- the string.
-
- When caseless matching is set, any letters in a class
- represent both their upper case and lower case versions, so
- for example, a caseless [aeiou] matches "A" as well as "a",
- and a caseless [^aeiou] does not match "A", whereas a case-
- ful version would.
-
- The newline character is never treated in any special way in
- character classes, whatever the setting of the PCRE_DOTALL
- or PCRE_MULTILINE options is. A class such as [^a] will
- always match a newline.
-
- The minus (hyphen) character can be used to specify a range
- of characters in a character class. For example, [d-m]
- matches any letter between d and m, inclusive. If a minus
- character is required in a class, it must be escaped with a
- backslash or appear in a position where it cannot be inter-
- preted as indicating a range, typically as the first or last
- character in the class.
-
- It is not possible to have the literal character "]" as the
- end character of a range. A pattern such as [W-]46] is
- interpreted as a class of two characters ("W" and "-") fol-
- lowed by a literal string "46]", so it would match "W46]" or
- "-46]". However, if the "]" is escaped with a backslash it
- is interpreted as the end of range, so [W-\]46] is inter-
- preted as a single class containing a range followed by two
- separate characters. The octal or hexadecimal representation
- of "]" can also be used to end a range.
-
- Ranges operate in ASCII collating sequence. They can also be
- used for characters specified numerically, for example
- [\000-\037]. If a range that includes letters is used when
- caseless matching is set, it matches the letters in either
- case. For example, [W-c] is equivalent to [][\^_`wxyzabc],
- matched caselessly, and if character tables for the "fr"
- locale are in use, [\xc8-\xcb] matches accented E characters
- in both cases.
-
- The character types \d, \D, \s, \S, \w, and \W may also
- appear in a character class, and add the characters that
- they match to the class. For example, [\dABCDEF] matches any
- hexadecimal digit. A circumflex can conveniently be used
- with the upper case character types to specify a more res-
- tricted set of characters than the matching lower case type.
- For example, the class [^\W_] matches any letter or digit,
- but not underscore.
-
- All non-alphameric characters other than \, -, ^ (at the
- start) and the terminating ] are non-special in character
- classes, but it does no harm if they are escaped.
-
-
-
-POSIX CHARACTER CLASSES
- Perl 5.6 (not yet released at the time of writing) is going
- to support the POSIX notation for character classes, which
- uses names enclosed by [: and :] within the enclosing
- square brackets. PCRE supports this notation. For example,
-
- [01[:alpha:]%]
-
- matches "0", "1", any alphabetic character, or "%". The sup-
- ported class names are
-
- alnum letters and digits
- alpha letters
- ascii character codes 0 - 127
- cntrl control characters
- digit decimal digits (same as \d)
- graph printing characters, excluding space
- lower lower case letters
- print printing characters, including space
- punct printing characters, excluding letters and digits
- space white space (same as \s)
- upper upper case letters
- word "word" characters (same as \w)
- xdigit hexadecimal digits
-
- The names "ascii" and "word" are Perl extensions. Another
- Perl extension is negation, which is indicated by a ^ char-
- acter after the colon. For example,
-
- [12[:^digit:]]
-
- matches "1", "2", or any non-digit. PCRE (and Perl) also
- recogize the POSIX syntax [.ch.] and [=ch=] where "ch" is a
- "collating element", but these are not supported, and an
- error is given if they are encountered.
-
-
-
-VERTICAL BAR
- Vertical bar characters are used to separate alternative
- patterns. For example, the pattern
-
- gilbert|sullivan
-
- matches either "gilbert" or "sullivan". Any number of alter-
- natives may appear, and an empty alternative is permitted
- (matching the empty string). The matching process tries
- each alternative in turn, from left to right, and the first
- one that succeeds is used. If the alternatives are within a
- subpattern (defined below), "succeeds" means matching the
- rest of the main pattern as well as the alternative in the
- subpattern.
-
-
-
-INTERNAL OPTION SETTING
- The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL,
- and PCRE_EXTENDED can be changed from within the pattern by
- a sequence of Perl option letters enclosed between "(?" and
- ")". The option letters are
-
- i for PCRE_CASELESS
- m for PCRE_MULTILINE
- s for PCRE_DOTALL
- x for PCRE_EXTENDED
-
- For example, (?im) sets caseless, multiline matching. It is
- also possible to unset these options by preceding the letter
- with a hyphen, and a combined setting and unsetting such as
- (?im-sx), which sets PCRE_CASELESS and PCRE_MULTILINE while
- unsetting PCRE_DOTALL and PCRE_EXTENDED, is also permitted.
- If a letter appears both before and after the hyphen, the
- option is unset.
-
- The scope of these option changes depends on where in the
- pattern the setting occurs. For settings that are outside
- any subpattern (defined below), the effect is the same as if
- the options were set or unset at the start of matching. The
- following patterns all behave in exactly the same way:
-
- (?i)abc
- a(?i)bc
- ab(?i)c
- abc(?i)
-
- which in turn is the same as compiling the pattern abc with
- PCRE_CASELESS set. In other words, such "top level" set-
- tings apply to the whole pattern (unless there are other
- changes inside subpatterns). If there is more than one set-
- ting of the same option at top level, the rightmost setting
- is used.
-
- If an option change occurs inside a subpattern, the effect
- is different. This is a change of behaviour in Perl 5.005.
- An option change inside a subpattern affects only that part
- of the subpattern that follows it, so
-
- (a(?i)b)c
-
- matches abc and aBc and no other strings (assuming
- PCRE_CASELESS is not used). By this means, options can be
- made to have different settings in different parts of the
- pattern. Any changes made in one alternative do carry on
- into subsequent branches within the same subpattern. For
- example,
-
- (a(?i)b|c)
-
- matches "ab", "aB", "c", and "C", even though when matching
- "C" the first branch is abandoned before the option setting.
- This is because the effects of option settings happen at
- compile time. There would be some very weird behaviour oth-
- erwise.
-
- The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can
- be changed in the same way as the Perl-compatible options by
- using the characters U and X respectively. The (?X) flag
- setting is special in that it must always occur earlier in
- the pattern than any of the additional features it turns on,
- even when it is at top level. It is best put at the start.
-
-
-
-SUBPATTERNS
- Subpatterns are delimited by parentheses (round brackets),
- which can be nested. Marking part of a pattern as a subpat-
- tern does two things:
-
- 1. It localizes a set of alternatives. For example, the pat-
- tern
-
- cat(aract|erpillar|)
-
- matches one of the words "cat", "cataract", or "caterpil-
- lar". Without the parentheses, it would match "cataract",
- "erpillar" or the empty string.
-
- 2. It sets up the subpattern as a capturing subpattern (as
- defined above). When the whole pattern matches, that por-
- tion of the subject string that matched the subpattern is
- passed back to the caller via the ovector argument of
- pcre_exec(). Opening parentheses are counted from left to
- right (starting from 1) to obtain the numbers of the captur-
- ing subpatterns.
-
- For example, if the string "the red king" is matched against
- the pattern
-
- the ((red|white) (king|queen))
-
- the captured substrings are "red king", "red", and "king",
- and are numbered 1, 2, and 3.
-
- The fact that plain parentheses fulfil two functions is not
- always helpful. There are often times when a grouping sub-
- pattern is required without a capturing requirement. If an
- opening parenthesis is followed by "?:", the subpattern does
- not do any capturing, and is not counted when computing the
- number of any subsequent capturing subpatterns. For example,
- if the string "the white queen" is matched against the pat-
- tern
-
- the ((?:red|white) (king|queen))
-
- the captured substrings are "white queen" and "queen", and
- are numbered 1 and 2. The maximum number of captured sub-
- strings is 99, and the maximum number of all subpatterns,
- both capturing and non-capturing, is 200.
-
- As a convenient shorthand, if any option settings are
- required at the start of a non-capturing subpattern, the
- option letters may appear between the "?" and the ":". Thus
- the two patterns
-
- (?i:saturday|sunday)
- (?:(?i)saturday|sunday)
-
- match exactly the same set of strings. Because alternative
- branches are tried from left to right, and options are not
- reset until the end of the subpattern is reached, an option
- setting in one branch does affect subsequent branches, so
- the above patterns match "SUNDAY" as well as "Saturday".
-
-
-
-REPETITION
- Repetition is specified by quantifiers, which can follow any
- of the following items:
-
- a single character, possibly escaped
- the . metacharacter
- a character class
- a back reference (see next section)
- a parenthesized subpattern (unless it is an assertion -
- see below)
-
- The general repetition quantifier specifies a minimum and
- maximum number of permitted matches, by giving the two
- numbers in curly brackets (braces), separated by a comma.
- The numbers must be less than 65536, and the first must be
- less than or equal to the second. For example:
-
- z{2,4}
-
- matches "zz", "zzz", or "zzzz". A closing brace on its own
- is not a special character. If the second number is omitted,
- but the comma is present, there is no upper limit; if the
- second number and the comma are both omitted, the quantifier
- specifies an exact number of required matches. Thus
-
- [aeiou]{3,}
-
- matches at least 3 successive vowels, but may match many
- more, while
-
- \d{8}
-
- matches exactly 8 digits. An opening curly bracket that
- appears in a position where a quantifier is not allowed, or
- one that does not match the syntax of a quantifier, is taken
- as a literal character. For example, {,6} is not a quantif-
- ier, but a literal string of four characters.
-
- The quantifier {0} is permitted, causing the expression to
- behave as if the previous item and the quantifier were not
- present.
-
- For convenience (and historical compatibility) the three
- most common quantifiers have single-character abbreviations:
-
- * is equivalent to {0,}
- + is equivalent to {1,}
- ? is equivalent to {0,1}
-
- It is possible to construct infinite loops by following a
- subpattern that can match no characters with a quantifier
- that has no upper limit, for example:
-
- (a?)*
-
- Earlier versions of Perl and PCRE used to give an error at
- compile time for such patterns. However, because there are
- cases where this can be useful, such patterns are now
- accepted, but if any repetition of the subpattern does in
- fact match no characters, the loop is forcibly broken.
-
- By default, the quantifiers are "greedy", that is, they
- match as much as possible (up to the maximum number of per-
- mitted times), without causing the rest of the pattern to
- fail. The classic example of where this gives problems is in
- trying to match comments in C programs. These appear between
- the sequences /* and */ and within the sequence, individual
- * and / characters may appear. An attempt to match C com-
- ments by applying the pattern
-
- /\*.*\*/
-
- to the string
-
- /* first command */ not comment /* second comment */
-
- fails, because it matches the entire string owing to the
- greediness of the .* item.
-
- However, if a quantifier is followed by a question mark, it
- ceases to be greedy, and instead matches the minimum number
- of times possible, so the pattern
-
- /\*.*?\*/
-
- does the right thing with the C comments. The meaning of the
- various quantifiers is not otherwise changed, just the pre-
- ferred number of matches. Do not confuse this use of ques-
- tion mark with its use as a quantifier in its own right.
- Because it has two uses, it can sometimes appear doubled, as
- in
-
- \d??\d
-
- which matches one digit by preference, but can match two if
- that is the only way the rest of the pattern matches.
-
- If the PCRE_UNGREEDY option is set (an option which is not
- available in Perl), the quantifiers are not greedy by
- default, but individual ones can be made greedy by following
- them with a question mark. In other words, it inverts the
- default behaviour.
-
- When a parenthesized subpattern is quantified with a minimum
- repeat count that is greater than 1 or with a limited max-
- imum, more store is required for the compiled pattern, in
- proportion to the size of the minimum or maximum.
-
- If a pattern starts with .* or .{0,} and the PCRE_DOTALL
- option (equivalent to Perl's /s) is set, thus allowing the .
- to match newlines, the pattern is implicitly anchored,
- because whatever follows will be tried against every charac-
- ter position in the subject string, so there is no point in
- retrying the overall match at any position after the first.
- PCRE treats such a pattern as though it were preceded by \A.
- In cases where it is known that the subject string contains
- no newlines, it is worth setting PCRE_DOTALL when the pat-
- tern begins with .* in order to obtain this optimization, or
- alternatively using ^ to indicate anchoring explicitly.
-
- When a capturing subpattern is repeated, the value captured
- is the substring that matched the final iteration. For exam-
- ple, after
-
- (tweedle[dume]{3}\s*)+
-
- has matched "tweedledum tweedledee" the value of the cap-
- tured substring is "tweedledee". However, if there are
- nested capturing subpatterns, the corresponding captured
- values may have been set in previous iterations. For exam-
- ple, after
-
- /(a|(b))+/
-
- matches "aba" the value of the second captured substring is
- "b".
-
-
-
-BACK REFERENCES
- Outside a character class, a backslash followed by a digit
- greater than 0 (and possibly further digits) is a back
- reference to a capturing subpattern earlier (i.e. to its
- left) in the pattern, provided there have been that many
- previous capturing left parentheses.
-
- However, if the decimal number following the backslash is
- less than 10, it is always taken as a back reference, and
- causes an error only if there are not that many capturing
- left parentheses in the entire pattern. In other words, the
- parentheses that are referenced need not be to the left of
- the reference for numbers less than 10. See the section
- entitled "Backslash" above for further details of the han-
- dling of digits following a backslash.
-
- A back reference matches whatever actually matched the cap-
- turing subpattern in the current subject string, rather than
- anything matching the subpattern itself. So the pattern
-
- (sens|respons)e and \1ibility
-
- matches "sense and sensibility" and "response and responsi-
- bility", but not "sense and responsibility". If caseful
- matching is in force at the time of the back reference, the
- case of letters is relevant. For example,
-
- ((?i)rah)\s+\1
-
- matches "rah rah" and "RAH RAH", but not "RAH rah", even
- though the original capturing subpattern is matched case-
- lessly.
-
- There may be more than one back reference to the same sub-
- pattern. If a subpattern has not actually been used in a
- particular match, any back references to it always fail. For
- example, the pattern
-
- (a|(bc))\2
-
- always fails if it starts to match "a" rather than "bc".
- Because there may be up to 99 back references, all digits
- following the backslash are taken as part of a potential
- back reference number. If the pattern continues with a digit
- character, some delimiter must be used to terminate the back
- reference. If the PCRE_EXTENDED option is set, this can be
- whitespace. Otherwise an empty comment can be used.
-
- A back reference that occurs inside the parentheses to which
- it refers fails when the subpattern is first used, so, for
- example, (a\1) never matches. However, such references can
- be useful inside repeated subpatterns. For example, the pat-
- tern
-
- (a|b\1)+
-
- matches any number of "a"s and also "aba", "ababbaa" etc. At
- each iteration of the subpattern, the back reference matches
- the character string corresponding to the previous
- iteration. In order for this to work, the pattern must be
- such that the first iteration does not need to match the
- back reference. This can be done using alternation, as in
- the example above, or by a quantifier with a minimum of
- zero.
-
-
-
-ASSERTIONS
- An assertion is a test on the characters following or
- preceding the current matching point that does not actually
- consume any characters. The simple assertions coded as \b,
- \B, \A, \Z, \z, ^ and $ are described above. More compli-
- cated assertions are coded as subpatterns. There are two
- kinds: those that look ahead of the current position in the
- subject string, and those that look behind it.
-
- An assertion subpattern is matched in the normal way, except
- that it does not cause the current matching position to be
- changed. Lookahead assertions start with (?= for positive
- assertions and (?! for negative assertions. For example,
-
- \w+(?=;)
-
- matches a word followed by a semicolon, but does not include
- the semicolon in the match, and
-
- foo(?!bar)
-
- matches any occurrence of "foo" that is not followed by
- "bar". Note that the apparently similar pattern
-
- (?!foo)bar
-
- does not find an occurrence of "bar" that is preceded by
- something other than "foo"; it finds any occurrence of "bar"
- whatsoever, because the assertion (?!foo) is always true
- when the next three characters are "bar". A lookbehind
- assertion is needed to achieve this effect.
-
- Lookbehind assertions start with (?<= for positive asser-
- tions and (?<! for negative assertions. For example,
-
- (?<!foo)bar
-
- does find an occurrence of "bar" that is not preceded by
- "foo". The contents of a lookbehind assertion are restricted
- such that all the strings it matches must have a fixed
- length. However, if there are several alternatives, they do
- not all have to have the same fixed length. Thus
-
- (?<=bullock|donkey)
-
- is permitted, but
-
- (?<!dogs?|cats?)
-
- causes an error at compile time. Branches that match dif-
- ferent length strings are permitted only at the top level of
- a lookbehind assertion. This is an extension compared with
- Perl 5.005, which requires all branches to match the same
- length of string. An assertion such as
-
- (?<=ab(c|de))
-
- is not permitted, because its single top-level branch can
- match two different lengths, but it is acceptable if rewrit-
- ten to use two top-level branches:
-
- (?<=abc|abde)
-
- The implementation of lookbehind assertions is, for each
- alternative, to temporarily move the current position back
- by the fixed width and then try to match. If there are
- insufficient characters before the current position, the
- match is deemed to fail. Lookbehinds in conjunction with
- once-only subpatterns can be particularly useful for match-
- ing at the ends of strings; an example is given at the end
- of the section on once-only subpatterns.
-
- Several assertions (of any sort) may occur in succession.
- For example,
-
- (?<=\d{3})(?<!999)foo
-
- matches "foo" preceded by three digits that are not "999".
- Notice that each of the assertions is applied independently
- at the same point in the subject string. First there is a
- check that the previous three characters are all digits, and
- then there is a check that the same three characters are not
- "999". This pattern does not match "foo" preceded by six
- characters, the first of which are digits and the last three
- of which are not "999". For example, it doesn't match
- "123abcfoo". A pattern to do that is
-
- (?<=\d{3}...)(?<!999)foo
-
- This time the first assertion looks at the preceding six
- characters, checking that the first three are digits, and
- then the second assertion checks that the preceding three
- characters are not "999".
-
- Assertions can be nested in any combination. For example,
-
- (?<=(?<!foo)bar)baz
-
- matches an occurrence of "baz" that is preceded by "bar"
- which in turn is not preceded by "foo", while
-
- (?<=\d{3}(?!999)...)foo
-
- is another pattern which matches "foo" preceded by three
- digits and any three characters that are not "999".
-
- Assertion subpatterns are not capturing subpatterns, and may
- not be repeated, because it makes no sense to assert the
- same thing several times. If any kind of assertion contains
- capturing subpatterns within it, these are counted for the
- purposes of numbering the capturing subpatterns in the whole
- pattern. However, substring capturing is carried out only
- for positive assertions, because it does not make sense for
- negative assertions.
-
- Assertions count towards the maximum of 200 parenthesized
- subpatterns.
-
-
-
-ONCE-ONLY SUBPATTERNS
- With both maximizing and minimizing repetition, failure of
- what follows normally causes the repeated item to be re-
- evaluated to see if a different number of repeats allows the
- rest of the pattern to match. Sometimes it is useful to
- prevent this, either to change the nature of the match, or
- to cause it fail earlier than it otherwise might, when the
- author of the pattern knows there is no point in carrying
- on.
-
- Consider, for example, the pattern \d+foo when applied to
- the subject line
-
- 123456bar
-
- After matching all 6 digits and then failing to match "foo",
- the normal action of the matcher is to try again with only 5
- digits matching the \d+ item, and then with 4, and so on,
- before ultimately failing. Once-only subpatterns provide the
- means for specifying that once a portion of the pattern has
- matched, it is not to be re-evaluated in this way, so the
- matcher would give up immediately on failing to match "foo"
- the first time. The notation is another kind of special
- parenthesis, starting with (?> as in this example:
-
- (?>\d+)bar
-
- This kind of parenthesis "locks up" the part of the pattern
- it contains once it has matched, and a failure further into
- the pattern is prevented from backtracking into it.
- Backtracking past it to previous items, however, works as
- normal.
-
- An alternative description is that a subpattern of this type
- matches the string of characters that an identical stan-
- dalone pattern would match, if anchored at the current point
- in the subject string.
-
- Once-only subpatterns are not capturing subpatterns. Simple
- cases such as the above example can be thought of as a max-
- imizing repeat that must swallow everything it can. So,
- while both \d+ and \d+? are prepared to adjust the number of
- digits they match in order to make the rest of the pattern
- match, (?>\d+) can only match an entire sequence of digits.
-
- This construction can of course contain arbitrarily compli-
- cated subpatterns, and it can be nested.
-
- Once-only subpatterns can be used in conjunction with look-
- behind assertions to specify efficient matching at the end
- of the subject string. Consider a simple pattern such as
-
- abcd$
-
- when applied to a long string which does not match. Because
- matching proceeds from left to right, PCRE will look for
- each "a" in the subject and then see if what follows matches
- the rest of the pattern. If the pattern is specified as
-
- ^.*abcd$
-
- the initial .* matches the entire string at first, but when
- this fails (because there is no following "a"), it back-
- tracks to match all but the last character, then all but the
- last two characters, and so on. Once again the search for
- "a" covers the entire string, from right to left, so we are
- no better off. However, if the pattern is written as
-
- ^(?>.*)(?<=abcd)
-
- there can be no backtracking for the .* item; it can match
- only the entire string. The subsequent lookbehind assertion
- does a single test on the last four characters. If it fails,
- the match fails immediately. For long strings, this approach
- makes a significant difference to the processing time.
-
- When a pattern contains an unlimited repeat inside a subpat-
- tern that can itself be repeated an unlimited number of
- times, the use of a once-only subpattern is the only way to
- avoid some failing matches taking a very long time indeed.
- The pattern
-
- (\D+|<\d+>)*[!?]
-
- matches an unlimited number of substrings that either con-
- sist of non-digits, or digits enclosed in <>, followed by
- either ! or ?. When it matches, it runs quickly. However, if
- it is applied to
-
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
- it takes a long time before reporting failure. This is
- because the string can be divided between the two repeats in
- a large number of ways, and all have to be tried. (The exam-
- ple used [!?] rather than a single character at the end,
- because both PCRE and Perl have an optimization that allows
- for fast failure when a single character is used. They
- remember the last single character that is required for a
- match, and fail early if it is not present in the string.)
- If the pattern is changed to
-
- ((?>\D+)|<\d+>)*[!?]
-
- sequences of non-digits cannot be broken, and failure hap-
- pens quickly.
-
-
-
-CONDITIONAL SUBPATTERNS
- It is possible to cause the matching process to obey a sub-
- pattern conditionally or to choose between two alternative
- subpatterns, depending on the result of an assertion, or
- whether a previous capturing subpattern matched or not. The
- two possible forms of conditional subpattern are
-
- (?(condition)yes-pattern)
- (?(condition)yes-pattern|no-pattern)
-
- If the condition is satisfied, the yes-pattern is used; oth-
- erwise the no-pattern (if present) is used. If there are
- more than two alternatives in the subpattern, a compile-time
- error occurs.
-
- There are two kinds of condition. If the text between the
- parentheses consists of a sequence of digits, the condition
- is satisfied if the capturing subpattern of that number has
- previously matched. The number must be greater than zero.
- Consider the following pattern, which contains non-
- significant white space to make it more readable (assume the
- PCRE_EXTENDED option) and to divide it into three parts for
- ease of discussion:
-
- ( \( )? [^()]+ (?(1) \) )
-
- The first part matches an optional opening parenthesis, and
- if that character is present, sets it as the first captured
- substring. The second part matches one or more characters
- that are not parentheses. The third part is a conditional
- subpattern that tests whether the first set of parentheses
- matched or not. If they did, that is, if subject started
- with an opening parenthesis, the condition is true, and so
- the yes-pattern is executed and a closing parenthesis is
- required. Otherwise, since no-pattern is not present, the
- subpattern matches nothing. In other words, this pattern
- matches a sequence of non-parentheses, optionally enclosed
- in parentheses.
-
- If the condition is not a sequence of digits, it must be an
- assertion. This may be a positive or negative lookahead or
- lookbehind assertion. Consider this pattern, again contain-
- ing non-significant white space, and with the two alterna-
- tives on the second line:
-
- (?(?=[^a-z]*[a-z])
- \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )
-
- The condition is a positive lookahead assertion that matches
- an optional sequence of non-letters followed by a letter. In
- other words, it tests for the presence of at least one
- letter in the subject. If a letter is found, the subject is
- matched against the first alternative; otherwise it is
- matched against the second. This pattern matches strings in
- one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are
- letters and dd are digits.
-
-
-
-COMMENTS
- The sequence (?# marks the start of a comment which contin-
- ues up to the next closing parenthesis. Nested parentheses
- are not permitted. The characters that make up a comment
- play no part in the pattern matching at all.
-
- If the PCRE_EXTENDED option is set, an unescaped # character
- outside a character class introduces a comment that contin-
- ues up to the next newline character in the pattern.
-
-
-
-RECURSIVE PATTERNS
- Consider the problem of matching a string in parentheses,
- allowing for unlimited nested parentheses. Without the use
- of recursion, the best that can be done is to use a pattern
- that matches up to some fixed depth of nesting. It is not
- possible to handle an arbitrary nesting depth. Perl 5.6 has
- provided an experimental facility that allows regular
- expressions to recurse (amongst other things). It does this
- by interpolating Perl code in the expression at run time,
- and the code can refer to the expression itself. A Perl pat-
- tern to solve the parentheses problem can be created like
- this:
-
- $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
-
- The (?p{...}) item interpolates Perl code at run time, and
- in this case refers recursively to the pattern in which it
- appears. Obviously, PCRE cannot support the interpolation of
- Perl code. Instead, the special item (?R) is provided for
- the specific case of recursion. This PCRE pattern solves the
- parentheses problem (assume the PCRE_EXTENDED option is set
- so that white space is ignored):
-
- \( ( (?>[^()]+) | (?R) )* \)
-
- First it matches an opening parenthesis. Then it matches any
- number of substrings which can either be a sequence of non-
- parentheses, or a recursive match of the pattern itself
- (i.e. a correctly parenthesized substring). Finally there is
- a closing parenthesis.
-
- This particular example pattern contains nested unlimited
- repeats, and so the use of a once-only subpattern for match-
- ing strings of non-parentheses is important when applying
- the pattern to strings that do not match. For example, when
- it is applied to
-
- (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
-
- it yields "no match" quickly. However, if a once-only sub-
- pattern is not used, the match runs for a very long time
- indeed because there are so many different ways the + and *
- repeats can carve up the subject, and all have to be tested
- before failure can be reported.
-
- The values set for any capturing subpatterns are those from
- the outermost level of the recursion at which the subpattern
- value is set. If the pattern above is matched against
-
- (ab(cd)ef)
-
- the value for the capturing parentheses is "ef", which is
- the last value taken on at the top level. If additional
- parentheses are added, giving
-
- \( ( ( (?>[^()]+) | (?R) )* ) \)
- ^ ^
- ^ ^ the string they capture is
- "ab(cd)ef", the contents of the top level parentheses. If
- there are more than 15 capturing parentheses in a pattern,
- PCRE has to obtain extra memory to store data during a
- recursion, which it does by using pcre_malloc, freeing it
- via pcre_free afterwards. If no memory can be obtained, it
- saves data for the first 15 capturing parentheses only, as
- there is no way to give an out-of-memory error from within a
- recursion.
-
-
-
-PERFORMANCE
- Certain items that may appear in patterns are more efficient
- than others. It is more efficient to use a character class
- like [aeiou] than a set of alternatives such as (a|e|i|o|u).
- In general, the simplest construction that provides the
- required behaviour is usually the most efficient. Jeffrey
- Friedl's book contains a lot of discussion about optimizing
- regular expressions for efficient performance.
-
- When a pattern begins with .* and the PCRE_DOTALL option is
- set, the pattern is implicitly anchored by PCRE, since it
- can match only at the start of a subject string. However, if
- PCRE_DOTALL is not set, PCRE cannot make this optimization,
- because the . metacharacter does not then match a newline,
- and if the subject string contains newlines, the pattern may
- match from the character immediately following one of them
- instead of from the very start. For example, the pattern
-
- (.*) second
-
- matches the subject "first\nand second" (where \n stands for
- a newline character) with the first captured substring being
- "and". In order to do this, PCRE has to retry the match
- starting after every newline in the subject.
-
- If you are using such a pattern with subject strings that do
- not contain newlines, the best performance is obtained by
- setting PCRE_DOTALL, or starting the pattern with ^.* to
- indicate explicit anchoring. That saves PCRE from having to
- scan along the subject looking for a newline to restart at.
-
- Beware of patterns that contain nested indefinite repeats.
- These can take a long time to run when applied to a string
- that does not match. Consider the pattern fragment
-
- (a+)*
-
- This can match "aaaa" in 33 different ways, and this number
- increases very rapidly as the string gets longer. (The *
- repeat can match 0, 1, 2, 3, or 4 times, and for each of
- those cases other than 0, the + repeats can match different
- numbers of times.) When the remainder of the pattern is such
- that the entire match is going to fail, PCRE has in princi-
- ple to try every possible variation, and this can take an
- extremely long time.
-
- An optimization catches some of the more simple cases such
- as
-
- (a+)*b
-
- where a literal character follows. Before embarking on the
- standard matching procedure, PCRE checks that there is a "b"
- later in the subject string, and if there is not, it fails
- the match immediately. However, when there is no following
- literal this optimization cannot be used. You can see the
- difference by comparing the behaviour of
-
- (a+)*\d
-
- with the pattern above. The former gives a failure almost
- instantly when applied to a whole line of "a" characters,
- whereas the latter takes an appreciable time with strings
- longer than about 20 characters.
-
-
-
-UTF-8 SUPPORT
- Starting at release 3.3, PCRE has some support for character
- strings encoded in the UTF-8 format. This is incomplete, and
- is regarded as experimental. In order to use it, you must
- configure PCRE to include UTF-8 support in the code, and, in
- addition, you must call pcre_compile() with the PCRE_UTF8
- option flag. When you do this, both the pattern and any sub-
- ject strings that are matched against it are treated as
- UTF-8 strings instead of just strings of bytes, but only in
- the cases that are mentioned below.
-
- If you compile PCRE with UTF-8 support, but do not use it at
- run time, the library will be a bit bigger, but the addi-
- tional run time overhead is limited to testing the PCRE_UTF8
- flag in several places, so should not be very large.
-
- PCRE assumes that the strings it is given contain valid
- UTF-8 codes. It does not diagnose invalid UTF-8 strings. If
- you pass invalid UTF-8 strings to PCRE, the results are
- undefined.
-
- Running with PCRE_UTF8 set causes these changes in the way
- PCRE works:
-
- 1. In a pattern, the escape sequence \x{...}, where the con-
- tents of the braces is a string of hexadecimal digits, is
- interpreted as a UTF-8 character whose code number is the
- given hexadecimal number, for example: \x{1234}. This
- inserts from one to six literal bytes into the pattern,
- using the UTF-8 encoding. If a non-hexadecimal digit appears
- between the braces, the item is not recognized.
-
- 2. The original hexadecimal escape sequence, \xhh, generates
- a two-byte UTF-8 character if its value is greater than 127.
-
- 3. Repeat quantifiers are NOT correctly handled if they fol-
- low a multibyte character. For example, \x{100}* and \xc3+
- do not work. If you want to repeat such characters, you must
- enclose them in non-capturing parentheses, for example
- (?:\x{100}), at present.
-
- 4. The dot metacharacter matches one UTF-8 character instead
- of a single byte.
-
- 5. Unlike literal UTF-8 characters, the dot metacharacter
- followed by a repeat quantifier does operate correctly on
- UTF-8 characters instead of single bytes.
-
- 4. Although the \x{...} escape is permitted in a character
- class, characters whose values are greater than 255 cannot
- be included in a class.
-
- 5. A class is matched against a UTF-8 character instead of
- just a single byte, but it can match only characters whose
- values are less than 256. Characters with greater values
- always fail to match a class.
-
- 6. Repeated classes work correctly on multiple characters.
-
- 7. Classes containing just a single character whose value is
- greater than 127 (but less than 256), for example, [\x80] or
- [^\x{93}], do not work because these are optimized into sin-
- gle byte matches. In the first case, of course, the class
- brackets are just redundant.
-
- 8. Lookbehind assertions move backwards in the subject by a
- fixed number of characters instead of a fixed number of
- bytes. Simple cases have been tested to work correctly, but
- there may be hidden gotchas herein.
-
- 9. The character types such as \d and \w do not work
- correctly with UTF-8 characters. They continue to test a
- single byte.
-
- 10. Anything not explicitly mentioned here continues to work
- in bytes rather than in characters.
-
- The following UTF-8 features of Perl 5.6 are not imple-
- mented:
- 1. The escape sequence \C to match a single byte.
-
- 2. The use of Unicode tables and properties and escapes \p,
- \P, and \X.
-
-
-
-AUTHOR
- Philip Hazel <ph10@cam.ac.uk>
- University Computing Service,
- New Museums Site,
- Cambridge CB2 3QG, England.
- Phone: +44 1223 334714
-
- Last updated: 28 August 2000,
- the 250th anniversary of the death of J.S. Bach.
- Copyright (c) 1997-2000 University of Cambridge.
+++ /dev/null
-.TH PCREGREP 1\r
-.SH NAME\r
-pcregrep - a grep with Perl-compatible regular expressions.\r
-.SH SYNOPSIS\r
-.B pcregrep [-Vchilnsvx] pattern [file] ...\r
-\r
-\r
-.SH DESCRIPTION\r
-\fBpcregrep\fR searches files for character patterns, in the same way as other\r
-grep commands do, but it uses the PCRE regular expression library to support\r
-patterns that are compatible with the regular expressions of Perl 5. See\r
-\fBpcre(3)\fR for a full description of syntax and semantics.\r
-\r
-If no files are specified, \fBpcregrep\fR reads the standard input. By default,\r
-each line that matches the pattern is copied to the standard output, and if\r
-there is more than one file, the file name is printed before each line of\r
-output. However, there are options that can change how \fBpcregrep\fR behaves.\r
-\r
-Lines are limited to BUFSIZ characters. BUFSIZ is defined in \fB<stdio.h>\fR.\r
-The newline character is removed from the end of each line before it is matched\r
-against the pattern.\r
-\r
-\r
-.SH OPTIONS\r
-.TP 10\r
-\fB-V\fR\r
-Write the version number of the PCRE library being used to the standard error\r
-stream.\r
-.TP\r
-\fB-c\fR\r
-Do not print individual lines; instead just print a count of the number of\r
-lines that would otherwise have been printed. If several files are given, a\r
-count is printed for each of them.\r
-.TP\r
-\fB-h\fR\r
-Suppress printing of filenames when searching multiple files.\r
-.TP\r
-\fB-i\fR\r
-Ignore upper/lower case distinctions during comparisons.\r
-.TP\r
-\fB-l\fR\r
-Instead of printing lines from the files, just print the names of the files\r
-containing lines that would have been printed. Each file name is printed\r
-once, on a separate line.\r
-.TP\r
-\fB-n\fR\r
-Precede each line by its line number in the file.\r
-.TP\r
-\fB-s\fR\r
-Work silently, that is, display nothing except error messages.\r
-The exit status indicates whether any matches were found.\r
-.TP\r
-\fB-v\fR\r
-Invert the sense of the match, so that lines which do \fInot\fR match the\r
-pattern are now the ones that are found.\r
-.TP\r
-\fB-x\fR\r
-Force the pattern to be anchored (it must start matching at the beginning of\r
-the line) and in addition, require it to match the entire line. This is\r
-equivalent to having ^ and $ characters at the start and end of each\r
-alternative branch in the regular expression.\r
-\r
-\r
-.SH SEE ALSO\r
-\fBpcre(3)\fR, Perl 5 documentation\r
-\r
-\r
-.SH DIAGNOSTICS\r
-Exit status is 0 if any matches were found, 1 if no matches were found, and 2\r
-for syntax errors or inacessible files (even if matches were found).\r
-\r
-\r
-.SH AUTHOR\r
-Philip Hazel <ph10@cam.ac.uk>\r
-.br\r
-Copyright (c) 1997-2000 University of Cambridge.\r
+++ /dev/null
-<HTML>\r
-<HEAD>\r
-<TITLE>pcregrep specification</TITLE>\r
-</HEAD>\r
-<body bgcolor="#FFFFFF" text="#00005A">\r
-<H1>pcregrep specification</H1>\r
-This HTML document has been generated automatically from the original man page.\r
-If there is any nonsense in it, please consult the man page in case the\r
-conversion went wrong.\r
-<UL>\r
-<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>\r
-<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>\r
-<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>\r
-<LI><A NAME="TOC4" HREF="#SEC4">OPTIONS</A>\r
-<LI><A NAME="TOC5" HREF="#SEC5">SEE ALSO</A>\r
-<LI><A NAME="TOC6" HREF="#SEC6">DIAGNOSTICS</A>\r
-<LI><A NAME="TOC7" HREF="#SEC7">AUTHOR</A>\r
-</UL>\r
-<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>\r
-<P>\r
-pcregrep - a grep with Perl-compatible regular expressions.\r
-</P>\r
-<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>\r
-<P>\r
-<B>pcregrep [-Vchilnsvx] pattern [file] ...</B>\r
-</P>\r
-<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>\r
-<P>\r
-<B>pcregrep</B> searches files for character patterns, in the same way as other\r
-grep commands do, but it uses the PCRE regular expression library to support\r
-patterns that are compatible with the regular expressions of Perl 5. See\r
-<B>pcre(3)</B> for a full description of syntax and semantics.\r
-</P>\r
-<P>\r
-If no files are specified, <B>pcregrep</B> reads the standard input. By default,\r
-each line that matches the pattern is copied to the standard output, and if\r
-there is more than one file, the file name is printed before each line of\r
-output. However, there are options that can change how <B>pcregrep</B> behaves.\r
-</P>\r
-<P>\r
-Lines are limited to BUFSIZ characters. BUFSIZ is defined in <B><stdio.h></B>.\r
-The newline character is removed from the end of each line before it is matched\r
-against the pattern.\r
-</P>\r
-<LI><A NAME="SEC4" HREF="#TOC1">OPTIONS</A>\r
-<P>\r
-<B>-V</B>\r
-Write the version number of the PCRE library being used to the standard error\r
-stream.\r
-</P>\r
-<P>\r
-<B>-c</B>\r
-Do not print individual lines; instead just print a count of the number of\r
-lines that would otherwise have been printed. If several files are given, a\r
-count is printed for each of them.\r
-</P>\r
-<P>\r
-<B>-h</B>\r
-Suppress printing of filenames when searching multiple files.\r
-</P>\r
-<P>\r
-<B>-i</B>\r
-Ignore upper/lower case distinctions during comparisons.\r
-</P>\r
-<P>\r
-<B>-l</B>\r
-Instead of printing lines from the files, just print the names of the files\r
-containing lines that would have been printed. Each file name is printed\r
-once, on a separate line.\r
-</P>\r
-<P>\r
-<B>-n</B>\r
-Precede each line by its line number in the file.\r
-</P>\r
-<P>\r
-<B>-s</B>\r
-Work silently, that is, display nothing except error messages.\r
-The exit status indicates whether any matches were found.\r
-</P>\r
-<P>\r
-<B>-v</B>\r
-Invert the sense of the match, so that lines which do <I>not</I> match the\r
-pattern are now the ones that are found.\r
-</P>\r
-<P>\r
-<B>-x</B>\r
-Force the pattern to be anchored (it must start matching at the beginning of\r
-the line) and in addition, require it to match the entire line. This is\r
-equivalent to having ^ and $ characters at the start and end of each\r
-alternative branch in the regular expression.\r
-</P>\r
-<LI><A NAME="SEC5" HREF="#TOC1">SEE ALSO</A>\r
-<P>\r
-<B>pcre(3)</B>, Perl 5 documentation\r
-</P>\r
-<LI><A NAME="SEC6" HREF="#TOC1">DIAGNOSTICS</A>\r
-<P>\r
-Exit status is 0 if any matches were found, 1 if no matches were found, and 2\r
-for syntax errors or inacessible files (even if matches were found).\r
-</P>\r
-<LI><A NAME="SEC7" HREF="#TOC1">AUTHOR</A>\r
-<P>\r
-Philip Hazel <ph10@cam.ac.uk>\r
-<BR>\r
-Copyright (c) 1997-2000 University of Cambridge.\r
+++ /dev/null
-NAME\r
- pcregrep - a grep with Perl-compatible regular expressions.\r
-\r
-\r
-\r
-SYNOPSIS\r
- pcregrep [-Vchilnsvx] pattern [file] ...\r
-\r
-\r
-\r
-DESCRIPTION\r
- pcregrep searches files for character patterns, in the same\r
- way as other grep commands do, but it uses the PCRE regular\r
- expression library to support patterns that are compatible\r
- with the regular expressions of Perl 5. See pcre(3) for a\r
- full description of syntax and semantics.\r
-\r
- If no files are specified, pcregrep reads the standard\r
- input. By default, each line that matches the pattern is\r
- copied to the standard output, and if there is more than one\r
- file, the file name is printed before each line of output.\r
- However, there are options that can change how pcregrep\r
- behaves.\r
-\r
- Lines are limited to BUFSIZ characters. BUFSIZ is defined in\r
- <stdio.h>. The newline character is removed from the end of\r
- each line before it is matched against the pattern.\r
-\r
-\r
-\r
-OPTIONS\r
- -V Write the version number of the PCRE library being\r
- used to the standard error stream.\r
-\r
- -c Do not print individual lines; instead just print\r
- a count of the number of lines that would other-\r
- wise have been printed. If several files are\r
- given, a count is printed for each of them.\r
-\r
- -h Suppress printing of filenames when searching mul-\r
- tiple files.\r
-\r
- -i Ignore upper/lower case distinctions during com-\r
- parisons.\r
-\r
- -l Instead of printing lines from the files, just\r
- print the names of the files containing lines that\r
- would have been printed. Each file name is printed\r
- once, on a separate line.\r
-\r
- -n Precede each line by its line number in the file.\r
-\r
- -s Work silently, that is, display nothing except\r
- error messages. The exit status indicates whether\r
- any matches were found.\r
-\r
- -v Invert the sense of the match, so that lines which\r
- do not match the pattern are now the ones that are\r
- found.\r
-\r
- -x Force the pattern to be anchored (it must start\r
- matching at the beginning of the line) and in\r
- addition, require it to match the entire line.\r
- This is equivalent to having ^ and $ characters at\r
- the start and end of each alternative branch in\r
- the regular expression.\r
-\r
-\r
-\r
-SEE ALSO\r
- pcre(3), Perl 5 documentation\r
-\r
-\r
-\r
-\r
-\r
-DIAGNOSTICS\r
- Exit status is 0 if any matches were found, 1 if no matches\r
- were found, and 2 for syntax errors or inacessible files\r
- (even if matches were found).\r
-\r
-\r
-\r
-AUTHOR\r
- Philip Hazel <ph10@cam.ac.uk>\r
- Copyright (c) 1997-2000 University of Cambridge.\r
-\r
+++ /dev/null
-.TH PCRE 3\r
-.SH NAME\r
-pcreposix - POSIX API for Perl-compatible regular expressions.\r
-.SH SYNOPSIS\r
-.B #include <pcreposix.h>\r
-.PP\r
-.SM\r
-.br\r
-.B int regcomp(regex_t *\fIpreg\fR, const char *\fIpattern\fR,\r
-.ti +5n\r
-.B int \fIcflags\fR);\r
-.PP\r
-.br\r
-.B int regexec(regex_t *\fIpreg\fR, const char *\fIstring\fR,\r
-.ti +5n\r
-.B size_t \fInmatch\fR, regmatch_t \fIpmatch\fR[], int \fIeflags\fR);\r
-.PP\r
-.br\r
-.B size_t regerror(int \fIerrcode\fR, const regex_t *\fIpreg\fR,\r
-.ti +5n\r
-.B char *\fIerrbuf\fR, size_t \fIerrbuf_size\fR);\r
-.PP\r
-.br\r
-.B void regfree(regex_t *\fIpreg\fR);\r
-\r
-\r
-.SH DESCRIPTION\r
-This set of functions provides a POSIX-style API to the PCRE regular expression\r
-package. See the \fBpcre\fR documentation for a description of the native API,\r
-which contains additional functionality.\r
-\r
-The functions described here are just wrapper functions that ultimately call\r
-the native API. Their prototypes are defined in the \fBpcreposix.h\fR header\r
-file, and on Unix systems the library itself is called \fBpcreposix.a\fR, so\r
-can be accessed by adding \fB-lpcreposix\fR to the command for linking an\r
-application which uses them. Because the POSIX functions call the native ones,\r
-it is also necessary to add \fR-lpcre\fR.\r
-\r
-I have implemented only those option bits that can be reasonably mapped to PCRE\r
-native options. In addition, the options REG_EXTENDED and REG_NOSUB are defined\r
-with the value zero. They have no effect, but since programs that are written\r
-to the POSIX interface often use them, this makes it easier to slot in PCRE as\r
-a replacement library. Other POSIX options are not even defined.\r
-\r
-When PCRE is called via these functions, it is only the API that is POSIX-like\r
-in style. The syntax and semantics of the regular expressions themselves are\r
-still those of Perl, subject to the setting of various PCRE options, as\r
-described below.\r
-\r
-The header for these functions is supplied as \fBpcreposix.h\fR to avoid any\r
-potential clash with other POSIX libraries. It can, of course, be renamed or\r
-aliased as \fBregex.h\fR, which is the "correct" name. It provides two\r
-structure types, \fIregex_t\fR for compiled internal forms, and\r
-\fIregmatch_t\fR for returning captured substrings. It also defines some\r
-constants whose names start with "REG_"; these are used for setting options and\r
-identifying error codes.\r
-\r
-\r
-.SH COMPILING A PATTERN\r
-\r
-The function \fBregcomp()\fR is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument \fIpattern\fR. The \fIpreg\fR argument is a pointer\r
-to a regex_t structure which is used as a base for storing information about\r
-the compiled expression.\r
-\r
-The argument \fIcflags\fR is either zero, or contains one or more of the bits\r
-defined by the following macros:\r
-\r
- REG_ICASE\r
-\r
-The PCRE_CASELESS option is set when the expression is passed for compilation\r
-to the native function.\r
-\r
- REG_NEWLINE\r
-\r
-The PCRE_MULTILINE option is set when the expression is passed for compilation\r
-to the native function.\r
-\r
-In the absence of these flags, no options are passed to the native function.\r
-This means the the regex is compiled with PCRE default semantics. In\r
-particular, the way it handles newline characters in the subject string is the\r
-Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only\r
-\fIsome\fR of the effects specified for REG_NEWLINE. It does not affect the way\r
-newlines are matched by . (they aren't) or a negative class such as [^a] (they\r
-are).\r
-\r
-The yield of \fBregcomp()\fR is zero on success, and non-zero otherwise. The\r
-\fIpreg\fR structure is filled in on success, and one member of the structure\r
-is publicized: \fIre_nsub\fR contains the number of capturing subpatterns in\r
-the regular expression. Various error codes are defined in the header file.\r
-\r
-\r
-.SH MATCHING A PATTERN\r
-The function \fBregexec()\fR is called to match a pre-compiled pattern\r
-\fIpreg\fR against a given \fIstring\fR, which is terminated by a zero byte,\r
-subject to the options in \fIeflags\fR. These can be:\r
-\r
- REG_NOTBOL\r
-\r
-The PCRE_NOTBOL option is set when calling the underlying PCRE matching\r
-function.\r
-\r
- REG_NOTEOL\r
-\r
-The PCRE_NOTEOL option is set when calling the underlying PCRE matching\r
-function.\r
-\r
-The portion of the string that was matched, and also any captured substrings,\r
-are returned via the \fIpmatch\fR argument, which points to an array of\r
-\fInmatch\fR structures of type \fIregmatch_t\fR, containing the members\r
-\fIrm_so\fR and \fIrm_eo\fR. These contain the offset to the first character of\r
-each substring and the offset to the first character after the end of each\r
-substring, respectively. The 0th element of the vector relates to the entire\r
-portion of \fIstring\fR that was matched; subsequent elements relate to the\r
-capturing subpatterns of the regular expression. Unused entries in the array\r
-have both structure members set to -1.\r
-\r
-A successful match yields a zero return; various error codes are defined in the\r
-header file, of which REG_NOMATCH is the "expected" failure code.\r
-\r
-\r
-.SH ERROR MESSAGES\r
-The \fBregerror()\fR function maps a non-zero errorcode from either\r
-\fBregcomp\fR or \fBregexec\fR to a printable message. If \fIpreg\fR is not\r
-NULL, the error should have arisen from the use of that structure. A message\r
-terminated by a binary zero is placed in \fIerrbuf\fR. The length of the\r
-message, including the zero, is limited to \fIerrbuf_size\fR. The yield of the\r
-function is the size of buffer needed to hold the whole message.\r
-\r
-\r
-.SH STORAGE\r
-Compiling a regular expression causes memory to be allocated and associated\r
-with the \fIpreg\fR structure. The function \fBregfree()\fR frees all such\r
-memory, after which \fIpreg\fR may no longer be used as a compiled expression.\r
-\r
-\r
-.SH AUTHOR\r
-Philip Hazel <ph10@cam.ac.uk>\r
-.br\r
-University Computing Service,\r
-.br\r
-New Museums Site,\r
-.br\r
-Cambridge CB2 3QG, England.\r
-.br\r
-Phone: +44 1223 334714\r
-\r
-Copyright (c) 1997-2000 University of Cambridge.\r
+++ /dev/null
-<HTML>\r
-<HEAD>\r
-<TITLE>pcreposix specification</TITLE>\r
-</HEAD>\r
-<body bgcolor="#FFFFFF" text="#00005A">\r
-<H1>pcreposix specification</H1>\r
-This HTML document has been generated automatically from the original man page.\r
-If there is any nonsense in it, please consult the man page in case the\r
-conversion went wrong.\r
-<UL>\r
-<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>\r
-<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>\r
-<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>\r
-<LI><A NAME="TOC4" HREF="#SEC4">COMPILING A PATTERN</A>\r
-<LI><A NAME="TOC5" HREF="#SEC5">MATCHING A PATTERN</A>\r
-<LI><A NAME="TOC6" HREF="#SEC6">ERROR MESSAGES</A>\r
-<LI><A NAME="TOC7" HREF="#SEC7">STORAGE</A>\r
-<LI><A NAME="TOC8" HREF="#SEC8">AUTHOR</A>\r
-</UL>\r
-<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>\r
-<P>\r
-pcreposix - POSIX API for Perl-compatible regular expressions.\r
-</P>\r
-<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>\r
-<P>\r
-<B>#include <pcreposix.h></B>\r
-</P>\r
-<P>\r
-<B>int regcomp(regex_t *<I>preg</I>, const char *<I>pattern</I>,</B>\r
-<B>int <I>cflags</I>);</B>\r
-</P>\r
-<P>\r
-<B>int regexec(regex_t *<I>preg</I>, const char *<I>string</I>,</B>\r
-<B>size_t <I>nmatch</I>, regmatch_t <I>pmatch</I>[], int <I>eflags</I>);</B>\r
-</P>\r
-<P>\r
-<B>size_t regerror(int <I>errcode</I>, const regex_t *<I>preg</I>,</B>\r
-<B>char *<I>errbuf</I>, size_t <I>errbuf_size</I>);</B>\r
-</P>\r
-<P>\r
-<B>void regfree(regex_t *<I>preg</I>);</B>\r
-</P>\r
-<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>\r
-<P>\r
-This set of functions provides a POSIX-style API to the PCRE regular expression\r
-package. See the <B>pcre</B> documentation for a description of the native API,\r
-which contains additional functionality.\r
-</P>\r
-<P>\r
-The functions described here are just wrapper functions that ultimately call\r
-the native API. Their prototypes are defined in the <B>pcreposix.h</B> header\r
-file, and on Unix systems the library itself is called <B>pcreposix.a</B>, so\r
-can be accessed by adding <B>-lpcreposix</B> to the command for linking an\r
-application which uses them. Because the POSIX functions call the native ones,\r
-it is also necessary to add \fR-lpcre\fR.\r
-</P>\r
-<P>\r
-I have implemented only those option bits that can be reasonably mapped to PCRE\r
-native options. In addition, the options REG_EXTENDED and REG_NOSUB are defined\r
-with the value zero. They have no effect, but since programs that are written\r
-to the POSIX interface often use them, this makes it easier to slot in PCRE as\r
-a replacement library. Other POSIX options are not even defined.\r
-</P>\r
-<P>\r
-When PCRE is called via these functions, it is only the API that is POSIX-like\r
-in style. The syntax and semantics of the regular expressions themselves are\r
-still those of Perl, subject to the setting of various PCRE options, as\r
-described below.\r
-</P>\r
-<P>\r
-The header for these functions is supplied as <B>pcreposix.h</B> to avoid any\r
-potential clash with other POSIX libraries. It can, of course, be renamed or\r
-aliased as <B>regex.h</B>, which is the "correct" name. It provides two\r
-structure types, <I>regex_t</I> for compiled internal forms, and\r
-<I>regmatch_t</I> for returning captured substrings. It also defines some\r
-constants whose names start with "REG_"; these are used for setting options and\r
-identifying error codes.\r
-</P>\r
-<LI><A NAME="SEC4" HREF="#TOC1">COMPILING A PATTERN</A>\r
-<P>\r
-The function <B>regcomp()</B> is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument <I>pattern</I>. The <I>preg</I> argument is a pointer\r
-to a regex_t structure which is used as a base for storing information about\r
-the compiled expression.\r
-</P>\r
-<P>\r
-The argument <I>cflags</I> is either zero, or contains one or more of the bits\r
-defined by the following macros:\r
-</P>\r
-<P>\r
-<PRE>\r
- REG_ICASE\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_CASELESS option is set when the expression is passed for compilation\r
-to the native function.\r
-</P>\r
-<P>\r
-<PRE>\r
- REG_NEWLINE\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_MULTILINE option is set when the expression is passed for compilation\r
-to the native function.\r
-</P>\r
-<P>\r
-In the absence of these flags, no options are passed to the native function.\r
-This means the the regex is compiled with PCRE default semantics. In\r
-particular, the way it handles newline characters in the subject string is the\r
-Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only\r
-<I>some</I> of the effects specified for REG_NEWLINE. It does not affect the way\r
-newlines are matched by . (they aren't) or a negative class such as [^a] (they\r
-are).\r
-</P>\r
-<P>\r
-The yield of <B>regcomp()</B> is zero on success, and non-zero otherwise. The\r
-<I>preg</I> structure is filled in on success, and one member of the structure\r
-is publicized: <I>re_nsub</I> contains the number of capturing subpatterns in\r
-the regular expression. Various error codes are defined in the header file.\r
-</P>\r
-<LI><A NAME="SEC5" HREF="#TOC1">MATCHING A PATTERN</A>\r
-<P>\r
-The function <B>regexec()</B> is called to match a pre-compiled pattern\r
-<I>preg</I> against a given <I>string</I>, which is terminated by a zero byte,\r
-subject to the options in <I>eflags</I>. These can be:\r
-</P>\r
-<P>\r
-<PRE>\r
- REG_NOTBOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_NOTBOL option is set when calling the underlying PCRE matching\r
-function.\r
-</P>\r
-<P>\r
-<PRE>\r
- REG_NOTEOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_NOTEOL option is set when calling the underlying PCRE matching\r
-function.\r
-</P>\r
-<P>\r
-The portion of the string that was matched, and also any captured substrings,\r
-are returned via the <I>pmatch</I> argument, which points to an array of\r
-<I>nmatch</I> structures of type <I>regmatch_t</I>, containing the members\r
-<I>rm_so</I> and <I>rm_eo</I>. These contain the offset to the first character of\r
-each substring and the offset to the first character after the end of each\r
-substring, respectively. The 0th element of the vector relates to the entire\r
-portion of <I>string</I> that was matched; subsequent elements relate to the\r
-capturing subpatterns of the regular expression. Unused entries in the array\r
-have both structure members set to -1.\r
-</P>\r
-<P>\r
-A successful match yields a zero return; various error codes are defined in the\r
-header file, of which REG_NOMATCH is the "expected" failure code.\r
-</P>\r
-<LI><A NAME="SEC6" HREF="#TOC1">ERROR MESSAGES</A>\r
-<P>\r
-The <B>regerror()</B> function maps a non-zero errorcode from either\r
-<B>regcomp</B> or <B>regexec</B> to a printable message. If <I>preg</I> is not\r
-NULL, the error should have arisen from the use of that structure. A message\r
-terminated by a binary zero is placed in <I>errbuf</I>. The length of the\r
-message, including the zero, is limited to <I>errbuf_size</I>. The yield of the\r
-function is the size of buffer needed to hold the whole message.\r
-</P>\r
-<LI><A NAME="SEC7" HREF="#TOC1">STORAGE</A>\r
-<P>\r
-Compiling a regular expression causes memory to be allocated and associated\r
-with the <I>preg</I> structure. The function <B>regfree()</B> frees all such\r
-memory, after which <I>preg</I> may no longer be used as a compiled expression.\r
-</P>\r
-<LI><A NAME="SEC8" HREF="#TOC1">AUTHOR</A>\r
-<P>\r
-Philip Hazel <ph10@cam.ac.uk>\r
-<BR>\r
-University Computing Service,\r
-<BR>\r
-New Museums Site,\r
-<BR>\r
-Cambridge CB2 3QG, England.\r
-<BR>\r
-Phone: +44 1223 334714\r
-</P>\r
-<P>\r
-Copyright (c) 1997-2000 University of Cambridge.\r
+++ /dev/null
-NAME
- pcreposix - POSIX API for Perl-compatible regular expres-
- sions.
-
-
-
-SYNOPSIS
- #include <pcreposix.h>
-
- int regcomp(regex_t *preg, const char *pattern,
- int cflags);
-
- int regexec(regex_t *preg, const char *string,
- size_t nmatch, regmatch_t pmatch[], int eflags);
-
- size_t regerror(int errcode, const regex_t *preg,
- char *errbuf, size_t errbuf_size);
-
- void regfree(regex_t *preg);
-
-
-
-DESCRIPTION
- This set of functions provides a POSIX-style API to the PCRE
- regular expression package. See the pcre documentation for a
- description of the native API, which contains additional
- functionality.
-
- The functions described here are just wrapper functions that
- ultimately call the native API. Their prototypes are defined
- in the pcreposix.h header file, and on Unix systems the
- library itself is called pcreposix.a, so can be accessed by
- adding -lpcreposix to the command for linking an application
- which uses them. Because the POSIX functions call the native
- ones, it is also necessary to add -lpcre.
-
- I have implemented only those option bits that can be rea-
- sonably mapped to PCRE native options. In addition, the
- options REG_EXTENDED and REG_NOSUB are defined with the
- value zero. They have no effect, but since programs that are
- written to the POSIX interface often use them, this makes it
- easier to slot in PCRE as a replacement library. Other POSIX
- options are not even defined.
-
- When PCRE is called via these functions, it is only the API
- that is POSIX-like in style. The syntax and semantics of the
- regular expressions themselves are still those of Perl, sub-
- ject to the setting of various PCRE options, as described
- below.
-
- The header for these functions is supplied as pcreposix.h to
- avoid any potential clash with other POSIX libraries. It
- can, of course, be renamed or aliased as regex.h, which is
- the "correct" name. It provides two structure types, regex_t
- for compiled internal forms, and regmatch_t for returning
- captured substrings. It also defines some constants whose
- names start with "REG_"; these are used for setting options
- and identifying error codes.
-
-
-
-COMPILING A PATTERN
- The function regcomp() is called to compile a pattern into
- an internal form. The pattern is a C string terminated by a
- binary zero, and is passed in the argument pattern. The preg
- argument is a pointer to a regex_t structure which is used
- as a base for storing information about the compiled expres-
- sion.
-
- The argument cflags is either zero, or contains one or more
- of the bits defined by the following macros:
-
- REG_ICASE
-
- The PCRE_CASELESS option is set when the expression is
- passed for compilation to the native function.
-
- REG_NEWLINE
-
- The PCRE_MULTILINE option is set when the expression is
- passed for compilation to the native function.
-
- In the absence of these flags, no options are passed to the
- native function. This means the the regex is compiled with
- PCRE default semantics. In particular, the way it handles
- newline characters in the subject string is the Perl way,
- not the POSIX way. Note that setting PCRE_MULTILINE has only
- some of the effects specified for REG_NEWLINE. It does not
- affect the way newlines are matched by . (they aren't) or a
- negative class such as [^a] (they are).
-
- The yield of regcomp() is zero on success, and non-zero oth-
- erwise. The preg structure is filled in on success, and one
- member of the structure is publicized: re_nsub contains the
- number of capturing subpatterns in the regular expression.
- Various error codes are defined in the header file.
-
-
-
-MATCHING A PATTERN
- The function regexec() is called to match a pre-compiled
- pattern preg against a given string, which is terminated by
- a zero byte, subject to the options in eflags. These can be:
-
- REG_NOTBOL
-
- The PCRE_NOTBOL option is set when calling the underlying
- PCRE matching function.
-
- REG_NOTEOL
-
- The PCRE_NOTEOL option is set when calling the underlying
- PCRE matching function.
-
- The portion of the string that was matched, and also any
- captured substrings, are returned via the pmatch argument,
- which points to an array of nmatch structures of type
- regmatch_t, containing the members rm_so and rm_eo. These
- contain the offset to the first character of each substring
- and the offset to the first character after the end of each
- substring, respectively. The 0th element of the vector
- relates to the entire portion of string that was matched;
- subsequent elements relate to the capturing subpatterns of
- the regular expression. Unused entries in the array have
- both structure members set to -1.
-
- A successful match yields a zero return; various error codes
- are defined in the header file, of which REG_NOMATCH is the
- "expected" failure code.
-
-
-
-ERROR MESSAGES
- The regerror() function maps a non-zero errorcode from
- either regcomp or regexec to a printable message. If preg is
- not NULL, the error should have arisen from the use of that
- structure. A message terminated by a binary zero is placed
- in errbuf. The length of the message, including the zero, is
- limited to errbuf_size. The yield of the function is the
- size of buffer needed to hold the whole message.
-
-
-
-STORAGE
- Compiling a regular expression causes memory to be allocated
- and associated with the preg structure. The function reg-
- free() frees all such memory, after which preg may no longer
- be used as a compiled expression.
-
-
-
-AUTHOR
- Philip Hazel <ph10@cam.ac.uk>
- University Computing Service,
- New Museums Site,
- Cambridge CB2 3QG, England.
- Phone: +44 1223 334714
-
- Copyright (c) 1997-2000 University of Cambridge.
+++ /dev/null
-The pcretest program\r
---------------------\r
-\r
-This program is intended for testing PCRE, but it can also be used for\r
-experimenting with regular expressions.\r
-\r
-If it is given two filename arguments, it reads from the first and writes to\r
-the second. If it is given only one filename argument, it reads from that file\r
-and writes to stdout. Otherwise, it reads from stdin and writes to stdout, and\r
-prompts for each line of input, using "re>" to prompt for regular expressions,\r
-and "data>" to prompt for data lines.\r
-\r
-The program handles any number of sets of input on a single input file. Each\r
-set starts with a regular expression, and continues with any number of data\r
-lines to be matched against the pattern. An empty line signals the end of the\r
-data lines, at which point a new regular expression is read. The regular\r
-expressions are given enclosed in any non-alphameric delimiters other than\r
-backslash, for example\r
-\r
- /(a|bc)x+yz/\r
-\r
-White space before the initial delimiter is ignored. A regular expression may\r
-be continued over several input lines, in which case the newline characters are\r
-included within it. See the test input files in the testdata directory for many\r
-examples. It is possible to include the delimiter within the pattern by\r
-escaping it, for example\r
-\r
- /abc\/def/\r
-\r
-If you do so, the escape and the delimiter form part of the pattern, but since\r
-delimiters are always non-alphameric, this does not affect its interpretation.\r
-If the terminating delimiter is immediately followed by a backslash, for\r
-example,\r
-\r
- /abc/\\r
-\r
-then a backslash is added to the end of the pattern. This is done to provide a\r
-way of testing the error condition that arises if a pattern finishes with a\r
-backslash, because\r
-\r
- /abc\/\r
-\r
-is interpreted as the first line of a pattern that starts with "abc/", causing\r
-pcretest to read the next line as a continuation of the regular expression.\r
-\r
-\r
-PATTERN MODIFIERS\r
------------------\r
-\r
-The pattern may be followed by i, m, s, or x to set the PCRE_CASELESS,\r
-PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively. For\r
-example:\r
-\r
- /caseless/i\r
-\r
-These modifier letters have the same effect as they do in Perl. There are\r
-others which set PCRE options that do not correspond to anything in Perl: /A,\r
-/E, and /X set PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and PCRE_EXTRA respectively.\r
-\r
-Searching for all possible matches within each subject string can be requested\r
-by the /g or /G modifier. After finding a match, PCRE is called again to search\r
-the remainder of the subject string. The difference between /g and /G is that\r
-the former uses the startoffset argument to pcre_exec() to start searching at\r
-a new point within the entire string (which is in effect what Perl does),\r
-whereas the latter passes over a shortened substring. This makes a difference\r
-to the matching process if the pattern begins with a lookbehind assertion\r
-(including \b or \B).\r
-\r
-If any call to pcre_exec() in a /g or /G sequence matches an empty string, the\r
-next call is done with the PCRE_NOTEMPTY and PCRE_ANCHORED flags set in order\r
-to search for another, non-empty, match at the same point. If this second match\r
-fails, the start offset is advanced by one, and the normal match is retried.\r
-This imitates the way Perl handles such cases when using the /g modifier or the\r
-split() function.\r
-\r
-There are a number of other modifiers for controlling the way pcretest\r
-operates.\r
-\r
-The /+ modifier requests that as well as outputting the substring that matched\r
-the entire pattern, pcretest should in addition output the remainder of the\r
-subject string. This is useful for tests where the subject contains multiple\r
-copies of the same substring.\r
-\r
-The /L modifier must be followed directly by the name of a locale, for example,\r
-\r
- /pattern/Lfr\r
-\r
-For this reason, it must be the last modifier letter. The given locale is set,\r
-pcre_maketables() is called to build a set of character tables for the locale,\r
-and this is then passed to pcre_compile() when compiling the regular\r
-expression. Without an /L modifier, NULL is passed as the tables pointer; that\r
-is, /L applies only to the expression on which it appears.\r
-\r
-The /I modifier requests that pcretest output information about the compiled\r
-expression (whether it is anchored, has a fixed first character, and so on). It\r
-does this by calling pcre_fullinfo() after compiling an expression, and\r
-outputting the information it gets back. If the pattern is studied, the results\r
-of that are also output.\r
-\r
-The /D modifier is a PCRE debugging feature, which also assumes /I. It causes\r
-the internal form of compiled regular expressions to be output after\r
-compilation.\r
-\r
-The /S modifier causes pcre_study() to be called after the expression has been\r
-compiled, and the results used when the expression is matched.\r
-\r
-The /M modifier causes the size of memory block used to hold the compiled\r
-pattern to be output.\r
-\r
-The /P modifier causes pcretest to call PCRE via the POSIX wrapper API rather\r
-than its native API. When this is done, all other modifiers except /i, /m, and\r
-/+ are ignored. REG_ICASE is set if /i is present, and REG_NEWLINE is set if /m\r
-is present. The wrapper functions force PCRE_DOLLAR_ENDONLY always, and\r
-PCRE_DOTALL unless REG_NEWLINE is set.\r
-\r
-The /8 modifier causes pcretest to call PCRE with the PCRE_UTF8 option set.\r
-This turns on the (currently incomplete) support for UTF-8 character handling\r
-in PCRE, provided that it was compiled with this support enabled. This modifier\r
-also causes any non-printing characters in output strings to be printed using\r
-the \x{hh...} notation if they are valid UTF-8 sequences.\r
-\r
-\r
-DATA LINES\r
-----------\r
-\r
-Before each data line is passed to pcre_exec(), leading and trailing whitespace\r
-is removed, and it is then scanned for \ escapes. The following are recognized:\r
-\r
- \a alarm (= BEL)\r
- \b backspace\r
- \e escape\r
- \f formfeed\r
- \n newline\r
- \r carriage return\r
- \t tab\r
- \v vertical tab\r
- \nnn octal character (up to 3 octal digits)\r
- \xhh hexadecimal character (up to 2 hex digits)\r
- \x{hh...} hexadecimal UTF-8 character\r
-\r
- \A pass the PCRE_ANCHORED option to pcre_exec()\r
- \B pass the PCRE_NOTBOL option to pcre_exec()\r
- \Cdd call pcre_copy_substring() for substring dd after a successful\r
- match (any decimal number less than 32)\r
- \Gdd call pcre_get_substring() for substring dd after a successful\r
- match (any decimal number less than 32)\r
- \L call pcre_get_substringlist() after a successful match\r
- \N pass the PCRE_NOTEMPTY option to pcre_exec()\r
- \Odd set the size of the output vector passed to pcre_exec() to dd\r
- (any number of decimal digits)\r
- \Z pass the PCRE_NOTEOL option to pcre_exec()\r
-\r
-A backslash followed by anything else just escapes the anything else. If the\r
-very last character is a backslash, it is ignored. This gives a way of passing\r
-an empty line as data, since a real empty line terminates the data input.\r
-\r
-If /P was present on the regex, causing the POSIX wrapper API to be used, only\r
-\B, and \Z have any effect, causing REG_NOTBOL and REG_NOTEOL to be passed to\r
-regexec() respectively.\r
-\r
-The use of \x{hh...} to represent UTF-8 characters is not dependent on the use\r
-of the /8 modifier on the pattern. It is recognized always. There may be any\r
-number of hexadecimal digits inside the braces. The result is from one to six\r
-bytes, encoded according to the UTF-8 rules.\r
-\r
-\r
-OUTPUT FROM PCRETEST\r
---------------------\r
-\r
-When a match succeeds, pcretest outputs the list of captured substrings that\r
-pcre_exec() returns, starting with number 0 for the string that matched the\r
-whole pattern. Here is an example of an interactive pcretest run.\r
-\r
- $ pcretest\r
- PCRE version 2.06 08-Jun-1999\r
-\r
- re> /^abc(\d+)/\r
- data> abc123\r
- 0: abc123\r
- 1: 123\r
- data> xyz\r
- No match\r
-\r
-If the strings contain any non-printing characters, they are output as \0x\r
-escapes, or as \x{...} escapes if the /8 modifier was present on the pattern.\r
-If the pattern has the /+ modifier, then the output for substring 0 is followed\r
-by the the rest of the subject string, identified by "0+" like this:\r
-\r
- re> /cat/+\r
- data> cataract\r
- 0: cat\r
- 0+ aract\r
-\r
-If the pattern has the /g or /G modifier, the results of successive matching\r
-attempts are output in sequence, like this:\r
-\r
- re> /\Bi(\w\w)/g\r
- data> Mississippi\r
- 0: iss\r
- 1: ss\r
- 0: iss\r
- 1: ss\r
- 0: ipp\r
- 1: pp\r
-\r
-"No match" is output only if the first match attempt fails.\r
-\r
-If any of \C, \G, or \L are present in a data line that is successfully\r
-matched, the substrings extracted by the convenience functions are output with\r
-C, G, or L after the string number instead of a colon. This is in addition to\r
-the normal full list. The string length (that is, the return from the\r
-extraction function) is given in parentheses after each string for \C and \G.\r
-\r
-Note that while patterns can be continued over several lines (a plain ">"\r
-prompt is used for continuations), data lines may not. However newlines can be\r
-included in data by means of the \n escape.\r
-\r
-\r
-COMMAND LINE OPTIONS\r
---------------------\r
-\r
-If the -p option is given to pcretest, it is equivalent to adding /P to each\r
-regular expression: the POSIX wrapper API is used to call PCRE. None of the\r
-following flags has any effect in this case.\r
-\r
-If the option -d is given to pcretest, it is equivalent to adding /D to each\r
-regular expression: the internal form is output after compilation.\r
-\r
-If the option -i is given to pcretest, it is equivalent to adding /I to each\r
-regular expression: information about the compiled pattern is given after\r
-compilation.\r
-\r
-If the option -m is given to pcretest, it outputs the size of each compiled\r
-pattern after it has been compiled. It is equivalent to adding /M to each\r
-regular expression. For compatibility with earlier versions of pcretest, -s is\r
-a synonym for -m.\r
-\r
-If the -t option is given, each compile, study, and match is run 20000 times\r
-while being timed, and the resulting time per compile or match is output in\r
-milliseconds. Do not set -t with -m, because you will then get the size output\r
-20000 times and the timing will be distorted. If you want to change the number\r
-of repetitions used for timing, edit the definition of LOOPREPEAT at the top of\r
-pcretest.c\r
-\r
-Philip Hazel <ph10@cam.ac.uk>\r
-August 2000\r
+++ /dev/null
-The perltest program\r
---------------------\r
-\r
-The perltest program tests Perl's regular expressions; it has the same\r
-specification as pcretest, and so can be given identical input, except that\r
-input patterns can be followed only by Perl's lower case modifiers and /+ (as\r
-used by pcretest), which is recognized and handled by the program.\r
-\r
-The data lines are processed as Perl double-quoted strings, so if they contain\r
-" \ $ or @ characters, these have to be escaped. For this reason, all such\r
-characters in testinput1 and testinput3 are escaped so that they can be used\r
-for perltest as well as for pcretest, and the special upper case modifiers such\r
-as /A that pcretest recognizes are not used in these files. The output should\r
-be identical, apart from the initial identifying banner.\r
-\r
-For testing UTF-8 features, an alternative form of perltest, called perltest8,\r
-is supplied. This requires Perl 5.6 or higher. It recognizes the special\r
-modifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput5\r
-file can be fed to perltest8.\r
-\r
-The testinput2 and testinput4 files are not suitable for feeding to perltest,\r
-since they do make use of the special upper case modifiers and escapes that\r
-pcretest uses to test some features of PCRE. The first of these files also\r
-contains malformed regular expressions, in order to check that PCRE diagnoses\r
-them correctly. Similarly, testinput6 tests UTF-8 features that do not relate\r
-to Perl.\r
-\r
-Philip Hazel <ph10@cam.ac.uk>\r
-August 2000\r
+++ /dev/null
-README file for PCRE (Perl-compatible regular expression library)
------------------------------------------------------------------
-
-The latest release of PCRE is always available from
-
- ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
-
-Please read the NEWS file if you are upgrading from a previous release.
-
-PCRE has its own native API, but a set of "wrapper" functions that are based on
-the POSIX API are also supplied in the library libpcreposix. Note that this
-just provides a POSIX calling interface to PCRE: the regular expressions
-themselves still follow Perl syntax and semantics. The header file
-for the POSIX-style functions is called pcreposix.h. The official POSIX name is
-regex.h, but I didn't want to risk possible problems with existing files of
-that name by distributing it that way. To use it with an existing program that
-uses the POSIX API, it will have to be renamed or pointed at by a link.
-
-
-Building PCRE on a Unix system
-------------------------------
-
-To build PCRE on a Unix system, run the "configure" command in the PCRE
-distribution directory. This is a standard GNU "autoconf" configuration script,
-for which generic instructions are supplied in INSTALL. On many systems just
-running "./configure" is sufficient, but the usual methods of changing standard
-defaults are available. For example,
-
-CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
-
-specifies that the C compiler should be run with the flags '-O2 -Wall' instead
-of the default, and that "make install" should install PCRE under /opt/local
-instead of the default /usr/local.
-
-If you want to make use of the experimential, incomplete support for UTF-8
-character strings in PCRE, you must add --enable-utf8 to the "configure"
-command. Without it, the code for handling UTF-8 is not included in the
-library. (Even when included, it still has to be enabled by an option at run
-time.)
-
-The "configure" script builds four files:
-
-. Makefile is built by copying Makefile.in and making substitutions.
-. config.h is built by copying config.in and making substitutions.
-. pcre-config is built by copying pcre-config.in and making substitutions.
-. RunTest is a script for running tests
-
-Once "configure" has run, you can run "make". It builds two libraries called
-libpcre and libpcreposix, a test program called pcretest, and the pcregrep
-command. You can use "make install" to copy these, and the public header file
-pcre.h, to appropriate live directories on your system, in the normal way.
-
-Running "make install" also installs the command pcre-config, which can be used
-to recall information about the PCRE configuration and installation. For
-example,
-
- pcre-config --version
-
-prints the version number, and
-
- pcre-config --libs
-
-outputs information about where the library is installed. This command can be
-included in makefiles for programs that use PCRE, saving the programmer from
-having to remember too many details.
-
-
-Shared libraries on Unix systems
---------------------------------
-
-The default distribution builds PCRE as two shared libraries. This support is
-new and experimental and may not work on all systems. It relies on the
-"libtool" scripts - these are distributed with PCRE. It should build a
-"libtool" script and use this to compile and link shared libraries, which are
-placed in a subdirectory called .libs. The programs pcretest and pcregrep are
-built to use these uninstalled libraries by means of wrapper scripts. When you
-use "make install" to install shared libraries, pcregrep and pcretest are
-automatically re-built to use the newly installed libraries. However, only
-pcregrep is installed, as pcretest is really just a test program.
-
-To build PCRE using static libraries you must use --disable-shared when
-configuring it. For example
-
-./configure --prefix=/usr/gnu --disable-shared
-
-Then run "make" in the usual way.
-
-
-Building on non-Unix systems
-----------------------------
-
-For a non-Unix system, read the comments in the file NON-UNIX-USE. PCRE has
-been compiled on Windows systems and on Macintoshes, but I don't know the
-details because I don't use those systems. It should be straightforward to
-build PCRE on any system that has a Standard C compiler, because it uses only
-Standard C functions.
-
-
-Testing PCRE
-------------
-
-To test PCRE on a Unix system, run the RunTest script in the pcre directory.
-(This can also be run by "make runtest", "make check", or "make test".) For
-other systems, see the instruction in NON-UNIX-USE.
-
-The script runs the pcretest test program (which is documented in
-doc/pcretest.txt) on each of the testinput files (in the testdata directory) in
-turn, and compares the output with the contents of the corresponding testoutput
-file. A file called testtry is used to hold the output from pcretest. To run
-pcretest on just one of the test files, give its number as an argument to
-RunTest, for example:
-
- RunTest 3
-
-The first and third test files can also be fed directly into the perltest
-script to check that Perl gives the same results. The third file requires the
-additional features of release 5.005, which is why it is kept separate from the
-main test input, which needs only Perl 5.004. In the long run, when 5.005 (or
-higher) is widespread, these two test files may get amalgamated.
-
-The second set of tests check pcre_fullinfo(), pcre_info(), pcre_study(),
-pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error
-detection, and run-time flags that are specific to PCRE, as well as the POSIX
-wrapper API. It also uses the debugging flag to check some of the internals of
-pcre_compile().
-
-If you build PCRE with a locale setting that is not the standard C locale, the
-character tables may be different (see next paragraph). In some cases, this may
-cause failures in the second set of tests. For example, in a locale where the
-isprint() function yields TRUE for characters in the range 128-255, the use of
-[:isascii:] inside a character class defines a different set of characters, and
-this shows up in this test as a difference in the compiled code, which is being
-listed for checking. Where the comparison test output contains [\x00-\x7f] the
-test will contain [\x00-\xff], and similarly in some other cases. This is not a
-bug in PCRE.
-
-The fourth set of tests checks pcre_maketables(), the facility for building a
-set of character tables for a specific locale and using them instead of the
-default tables. The tests make use of the "fr" (French) locale. Before running
-the test, the script checks for the presence of this locale by running the
-"locale" command. If that command fails, or if it doesn't include "fr" in the
-list of available locales, the fourth test cannot be run, and a comment is
-output to say why. If running this test produces instances of the error
-
- ** Failed to set locale "fr"
-
-in the comparison output, it means that locale is not available on your system,
-despite being listed by "locale". This does not mean that PCRE is broken.
-
-The fifth test checks the experimental, incomplete UTF-8 support. It is not run
-automatically unless PCRE is built with UTF-8 support. This file can be fed
-directly to the perltest8 script, which requires Perl 5.6 or higher. The sixth
-file tests internal UTF-8 features of PCRE that are not relevant to Perl.
-
-
-Character tables
-----------------
-
-PCRE uses four tables for manipulating and identifying characters. The final
-argument of the pcre_compile() function is a pointer to a block of memory
-containing the concatenated tables. A call to pcre_maketables() can be used to
-generate a set of tables in the current locale. If the final argument for
-pcre_compile() is passed as NULL, a set of default tables that is built into
-the binary is used.
-
-The source file called chartables.c contains the default set of tables. This is
-not supplied in the distribution, but is built by the program dftables
-(compiled from dftables.c), which uses the ANSI C character handling functions
-such as isalnum(), isalpha(), isupper(), islower(), etc. to build the table
-sources. This means that the default C locale which is set for your system will
-control the contents of these default tables. You can change the default tables
-by editing chartables.c and then re-building PCRE. If you do this, you should
-probably also edit Makefile to ensure that the file doesn't ever get
-re-generated.
-
-The first two 256-byte tables provide lower casing and case flipping functions,
-respectively. The next table consists of three 32-byte bit maps which identify
-digits, "word" characters, and white space, respectively. These are used when
-building 32-byte bit maps that represent character classes.
-
-The final 256-byte table has bits indicating various character types, as
-follows:
-
- 1 white space character
- 2 letter
- 4 decimal digit
- 8 hexadecimal digit
- 16 alphanumeric or '_'
- 128 regular expression metacharacter or binary zero
-
-You should not alter the set of characters that contain the 128 bit, as that
-will cause PCRE to malfunction.
-
-
-Manifest
---------
-
-The distribution should contain the following files:
-
-(A) The actual source files of the PCRE library functions and their
- headers:
-
- dftables.c auxiliary program for building chartables.c
- get.c )
- maketables.c )
- study.c ) source of
- pcre.c ) the functions
- pcreposix.c )
- pcre.in "source" for the header for the external API; pcre.h
- is built from this by "configure"
- pcreposix.h header for the external POSIX wrapper API
- internal.h header for internal use
- config.in template for config.h, which is built by configure
-
-(B) Auxiliary files:
-
- AUTHORS information about the author of PCRE
- ChangeLog log of changes to the code
- INSTALL generic installation instructions
- LICENCE conditions for the use of PCRE
- COPYING the same, using GNU's standard name
- Makefile.in template for Unix Makefile, which is built by configure
- NEWS important changes in this release
- NON-UNIX-USE notes on building PCRE on non-Unix systems
- README this file
- RunTest.in template for a Unix shell script for running tests
- config.guess ) files used by libtool,
- config.sub ) used only when building a shared library
- configure a configuring shell script (built by autoconf)
- configure.in the autoconf input used to build configure
- doc/Tech.Notes notes on the encoding
- doc/pcre.3 man page source for the PCRE functions
- doc/pcre.html HTML version
- doc/pcre.txt plain text version
- doc/pcreposix.3 man page source for the POSIX wrapper API
- doc/pcreposix.html HTML version
- doc/pcreposix.txt plain text version
- doc/pcretest.txt documentation of test program
- doc/perltest.txt documentation of Perl test program
- doc/pcregrep.1 man page source for the pcregrep utility
- doc/pcregrep.html HTML version
- doc/pcregrep.txt plain text version
- install-sh a shell script for installing files
- ltconfig ) files used to build "libtool",
- ltmain.sh ) used only when building a shared library
- pcretest.c test program
- perltest Perl test program
- perltest8 Perl test program for UTF-8 tests
- pcregrep.c source of a grep utility that uses PCRE
- pcre-config.in source of script which retains PCRE information
- testdata/testinput1 test data, compatible with Perl 5.004 and 5.005
- testdata/testinput2 test data for error messages and non-Perl things
- testdata/testinput3 test data, compatible with Perl 5.005
- testdata/testinput4 test data for locale-specific tests
- testdata/testinput5 test data for UTF-8 tests compatible with Perl 5.6
- testdata/testinput6 test data for other UTF-8 tests
- testdata/testoutput1 test results corresponding to testinput1
- testdata/testoutput2 test results corresponding to testinput2
- testdata/testoutput3 test results corresponding to testinput3
- testdata/testoutput4 test results corresponding to testinput4
- testdata/testoutput5 test results corresponding to testinput5
- testdata/testoutput6 test results corresponding to testinput6
-
-(C) Auxiliary files for Win32 DLL
-
- dll.mk
- pcre.def
-
-Philip Hazel <ph10@cam.ac.uk>
-August 2000
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
- Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-/* This module contains some convenience functions for extracting substrings
-from the subject string after a regex match has succeeded. The original idea
-for these functions came from Scott Wimer <scottw@cgibuilder.com>. */
-
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-
-/*************************************************
-* Copy captured string to given buffer *
-*************************************************/
-
-/* This function copies a single captured substring into a given buffer.
-Note that we use memcpy() rather than strncpy() in case there are binary zeros
-in the string.
-
-Arguments:
- subject the subject string that was matched
- ovector pointer to the offsets table
- stringcount the number of substrings that were captured
- (i.e. the yield of the pcre_exec call, unless
- that was zero, in which case it should be 1/3
- of the offset table size)
- stringnumber the number of the required substring
- buffer where to put the substring
- size the size of the buffer
-
-Returns: if successful:
- the length of the copied string, not including the zero
- that is put on the end; can be zero
- if not successful:
- PCRE_ERROR_NOMEMORY (-6) buffer too small
- PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
-*/
-
-int
-pcre_copy_substring(const char *subject, int *ovector, int stringcount,
- int stringnumber, char *buffer, int size)
-{
-int yield;
-if (stringnumber < 0 || stringnumber >= stringcount)
- return PCRE_ERROR_NOSUBSTRING;
-stringnumber *= 2;
-yield = ovector[stringnumber+1] - ovector[stringnumber];
-if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
-memcpy(buffer, subject + ovector[stringnumber], yield);
-buffer[yield] = 0;
-return yield;
-}
-
-
-
-/*************************************************
-* Copy all captured strings to new store *
-*************************************************/
-
-/* This function gets one chunk of store and builds a list of pointers and all
-of the captured substrings in it. A NULL pointer is put on the end of the list.
-
-Arguments:
- subject the subject string that was matched
- ovector pointer to the offsets table
- stringcount the number of substrings that were captured
- (i.e. the yield of the pcre_exec call, unless
- that was zero, in which case it should be 1/3
- of the offset table size)
- listptr set to point to the list of pointers
-
-Returns: if successful: 0
- if not successful:
- PCRE_ERROR_NOMEMORY (-6) failed to get store
-*/
-
-int
-pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
- const char ***listptr)
-{
-int i;
-int size = sizeof(char *);
-int double_count = stringcount * 2;
-char **stringlist;
-char *p;
-
-for (i = 0; i < double_count; i += 2)
- size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
-
-stringlist = (char **)(pcre_malloc)(size);
-if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
-
-*listptr = (const char **)stringlist;
-p = (char *)(stringlist + stringcount + 1);
-
-for (i = 0; i < double_count; i += 2)
- {
- int len = ovector[i+1] - ovector[i];
- memcpy(p, subject + ovector[i], len);
- *stringlist++ = p;
- p += len;
- *p++ = 0;
- }
-
-*stringlist = NULL;
-return 0;
-}
-
-
-
-/*************************************************
-* Free store obtained by get_substring_list *
-*************************************************/
-
-/* This function exists for the benefit of people calling PCRE from non-C
-programs that can call its functions, but not free() or (pcre_free)() directly.
-
-Argument: the result of a previous pcre_get_substring_list()
-Returns: nothing
-*/
-
-void
-pcre_free_substring_list(const char **pointer)
-{
-(pcre_free)((void *)pointer);
-}
-
-
-
-/*************************************************
-* Copy captured string to new store *
-*************************************************/
-
-/* This function copies a single captured substring into a piece of new
-store
-
-Arguments:
- subject the subject string that was matched
- ovector pointer to the offsets table
- stringcount the number of substrings that were captured
- (i.e. the yield of the pcre_exec call, unless
- that was zero, in which case it should be 1/3
- of the offset table size)
- stringnumber the number of the required substring
- stringptr where to put a pointer to the substring
-
-Returns: if successful:
- the length of the string, not including the zero that
- is put on the end; can be zero
- if not successful:
- PCRE_ERROR_NOMEMORY (-6) failed to get store
- PCRE_ERROR_NOSUBSTRING (-7) substring not present
-*/
-
-int
-pcre_get_substring(const char *subject, int *ovector, int stringcount,
- int stringnumber, const char **stringptr)
-{
-int yield;
-char *substring;
-if (stringnumber < 0 || stringnumber >= stringcount)
- return PCRE_ERROR_NOSUBSTRING;
-stringnumber *= 2;
-yield = ovector[stringnumber+1] - ovector[stringnumber];
-substring = (char *)(pcre_malloc)(yield + 1);
-if (substring == NULL) return PCRE_ERROR_NOMEMORY;
-memcpy(substring, subject + ovector[stringnumber], yield);
-substring[yield] = 0;
-*stringptr = substring;
-return yield;
-}
-
-
-
-/*************************************************
-* Free store obtained by get_substring *
-*************************************************/
-
-/* This function exists for the benefit of people calling PCRE from non-C
-programs that can call its functions, but not free() or (pcre_free)() directly.
-
-Argument: the result of a previous pcre_get_substring()
-Returns: nothing
-*/
-
-void
-pcre_free_substring(const char *pointer)
-{
-(pcre_free)((void *)pointer);
-}
-
-/* End of get.c */
+++ /dev/null
-Basic Installation
-==================
-
- These are generic installation instructions that apply to systems that
-can run the `configure' shell script - Unix systems and any that imitate
-it. They are not specific to PCRE. There are PCRE-specific instructions
-for non-Unix systems in the file NON-UNIX-USE.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, a file
-`config.cache' that saves the results of its tests to speed up
-reconfiguring, and a file `config.log' containing compiler output
-(useful mainly for debugging `configure').
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If at some point `config.cache'
-contains results you don't want to keep, you may remove or edit it.
-
- The file `configure.in' is used to create `configure' by a program
-called `autoconf'. You only need `configure.in' if you want to change
-it or regenerate `configure' using a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system. If you're
- using `csh' on an old version of System V, you might need to type
- `sh ./configure' instead to prevent `csh' from trying to execute
- `configure' itself.
-
- Running `configure' takes awhile. While running, it prints some
- messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package.
-
- 4. Type `make install' to install the programs and any data files and
- documentation.
-
- 5. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. You can give `configure'
-initial values for variables by setting them in the environment. Using
-a Bourne-compatible shell, you can do that on the command line like
-this:
- CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
-
-Or on systems that have the `env' program, you can do it like this:
- env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
- If you have to use a `make' that does not supports the `VPATH'
-variable, you have to compile the package for one architecture at a time
-in the source code directory. After you have installed the package for
-one architecture, use `make distclean' before reconfiguring for another
-architecture.
-
-Installation Names
-==================
-
- By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc. You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' can not figure out
-automatically, but needs to determine by the type of host the package
-will run on. Usually `configure' can figure that out, but if it prints
-a message saying it can not guess the host type, give it the
-`--host=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name with three fields:
- CPU-COMPANY-SYSTEM
-
-See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the host type.
-
- If you are building compiler tools for cross-compiling, you can also
-use the `--target=TYPE' option to select the type of system they will
-produce code for and the `--build=TYPE' option to select the type of
-system on which you are compiling the package.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Operation Controls
-==================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--cache-file=FILE'
- Use and save the results of the tests in FILE instead of
- `./config.cache'. Set FILE to `/dev/null' to disable caching, for
- debugging `configure'.
-
-`--help'
- Print a summary of the options to `configure', and exit.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`--version'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`configure' also accepts some other, not widely useful, options.
+++ /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
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-
-/* This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
- Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-/* This header contains definitions that are shared between the different
-modules, but which are not relevant to the outside. */
-
-/* Get the definitions provided by running "configure" */
-
-#include "config.h"
-
-/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
-define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
-is set. Otherwise, include an emulating function for those systems that have
-neither (there some non-Unix environments where this is the case). This assumes
-that all calls to memmove are moving strings upwards in store, which is the
-case in PCRE. */
-
-#if ! HAVE_MEMMOVE
-#undef memmove /* some systems may have a macro */
-#if HAVE_BCOPY
-#define memmove(a, b, c) bcopy(b, a, c)
-#else
-void *
-pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n)
-{
-int i;
-dest += n;
-src += n;
-for (i = 0; i < n; ++i) *(--dest) = *(--src);
-}
-#define memmove(a, b, c) pcre_memmove(a, b, c)
-#endif
-#endif
-
-/* Standard C headers plus the external interface definition */
-
-#include <ctype.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "pcre.h"
-
-/* In case there is no definition of offsetof() provided - though any proper
-Standard C system should have one. */
-
-#ifndef offsetof
-#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
-#endif
-
-/* These are the public options that can change during matching. */
-
-#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
-
-/* Private options flags start at the most significant end of the four bytes,
-but skip the top bit so we can use ints for convenience without getting tangled
-with negative values. The public options defined in pcre.h start at the least
-significant end. Make sure they don't overlap, though now that we have expanded
-to four bytes there is plenty of space. */
-
-#define PCRE_FIRSTSET 0x40000000 /* first_char is set */
-#define PCRE_REQCHSET 0x20000000 /* req_char is set */
-#define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */
-#define PCRE_INGROUP 0x08000000 /* compiling inside a group */
-#define PCRE_ICHANGED 0x04000000 /* i option changes within regex */
-
-/* Options for the "extra" block produced by pcre_study(). */
-
-#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */
-
-/* Masks for identifying the public options which are permitted at compile
-time, run time or study time, respectively. */
-
-#define PUBLIC_OPTIONS \
- (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
- PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8)
-
-#define PUBLIC_EXEC_OPTIONS \
- (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY)
-
-#define PUBLIC_STUDY_OPTIONS 0 /* None defined */
-
-/* Magic number to provide a small check against being handed junk. */
-
-#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */
-
-/* Miscellaneous definitions */
-
-typedef int BOOL;
-
-#define FALSE 0
-#define TRUE 1
-
-/* These are escaped items that aren't just an encoding of a particular data
-value such as \n. They must have non-zero values, as check_escape() returns
-their negation. Also, they must appear in the same order as in the opcode
-definitions below, up to ESC_z. The final one must be ESC_REF as subsequent
-values are used for \1, \2, \3, etc. There is a test in the code for an escape
-greater than ESC_b and less than ESC_X to detect the types that may be
-repeated. If any new escapes are put in-between that don't consume a character,
-that code will have to change. */
-
-enum { ESC_A = 1, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w,
- ESC_Z, ESC_z, ESC_REF };
-
-/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets
-that extract substrings. Starting from 1 (i.e. after OP_END), the values up to
-OP_EOD must correspond in order to the list of escapes immediately above. */
-
-enum {
- OP_END, /* End of pattern */
-
- /* Values corresponding to backslashed metacharacters */
-
- OP_SOD, /* Start of data: \A */
- OP_NOT_WORD_BOUNDARY, /* \B */
- OP_WORD_BOUNDARY, /* \b */
- OP_NOT_DIGIT, /* \D */
- OP_DIGIT, /* \d */
- OP_NOT_WHITESPACE, /* \S */
- OP_WHITESPACE, /* \s */
- OP_NOT_WORDCHAR, /* \W */
- OP_WORDCHAR, /* \w */
- OP_EODN, /* End of data or \n at end of data: \Z. */
- OP_EOD, /* End of data: \z */
-
- OP_OPT, /* Set runtime options */
- OP_CIRC, /* Start of line - varies with multiline switch */
- OP_DOLL, /* End of line - varies with multiline switch */
- OP_ANY, /* Match any character */
- OP_CHARS, /* Match string of characters */
- OP_NOT, /* Match anything but the following char */
-
- OP_STAR, /* The maximizing and minimizing versions of */
- OP_MINSTAR, /* all these opcodes must come in pairs, with */
- OP_PLUS, /* the minimizing one second. */
- OP_MINPLUS, /* This first set applies to single characters */
- OP_QUERY,
- OP_MINQUERY,
- OP_UPTO, /* From 0 to n matches */
- OP_MINUPTO,
- OP_EXACT, /* Exactly n matches */
-
- OP_NOTSTAR, /* The maximizing and minimizing versions of */
- OP_NOTMINSTAR, /* all these opcodes must come in pairs, with */
- OP_NOTPLUS, /* the minimizing one second. */
- OP_NOTMINPLUS, /* This first set applies to "not" single characters */
- OP_NOTQUERY,
- OP_NOTMINQUERY,
- OP_NOTUPTO, /* From 0 to n matches */
- OP_NOTMINUPTO,
- OP_NOTEXACT, /* Exactly n matches */
-
- OP_TYPESTAR, /* The maximizing and minimizing versions of */
- OP_TYPEMINSTAR, /* all these opcodes must come in pairs, with */
- OP_TYPEPLUS, /* the minimizing one second. These codes must */
- OP_TYPEMINPLUS, /* be in exactly the same order as those above. */
- OP_TYPEQUERY, /* This set applies to character types such as \d */
- OP_TYPEMINQUERY,
- OP_TYPEUPTO, /* From 0 to n matches */
- OP_TYPEMINUPTO,
- OP_TYPEEXACT, /* Exactly n matches */
-
- OP_CRSTAR, /* The maximizing and minimizing versions of */
- OP_CRMINSTAR, /* all these opcodes must come in pairs, with */
- OP_CRPLUS, /* the minimizing one second. These codes must */
- OP_CRMINPLUS, /* be in exactly the same order as those above. */
- OP_CRQUERY, /* These are for character classes and back refs */
- OP_CRMINQUERY,
- OP_CRRANGE, /* These are different to the three seta above. */
- OP_CRMINRANGE,
-
- OP_CLASS, /* Match a character class */
- OP_REF, /* Match a back reference */
- OP_RECURSE, /* Match this pattern recursively */
-
- OP_ALT, /* Start of alternation */
- OP_KET, /* End of group that doesn't have an unbounded repeat */
- OP_KETRMAX, /* These two must remain together and in this */
- OP_KETRMIN, /* order. They are for groups the repeat for ever. */
-
- /* The assertions must come before ONCE and COND */
-
- OP_ASSERT, /* Positive lookahead */
- OP_ASSERT_NOT, /* Negative lookahead */
- OP_ASSERTBACK, /* Positive lookbehind */
- OP_ASSERTBACK_NOT, /* Negative lookbehind */
- OP_REVERSE, /* Move pointer back - used in lookbehind assertions */
-
- /* ONCE and COND must come after the assertions, with ONCE first, as there's
- a test for >= ONCE for a subpattern that isn't an assertion. */
-
- OP_ONCE, /* Once matched, don't back up into the subpattern */
- OP_COND, /* Conditional group */
- OP_CREF, /* Used to hold an extraction string number */
-
- OP_BRAZERO, /* These two must remain together and in this */
- OP_BRAMINZERO, /* order. */
-
- OP_BRA /* This and greater values are used for brackets that
- extract substrings. */
-};
-
-/* The highest extraction number. This is limited by the number of opcodes
-left after OP_BRA, i.e. 255 - OP_BRA. We actually set it somewhat lower. */
-
-#define EXTRACT_MAX 99
-
-/* The texts of compile-time error messages are defined as macros here so that
-they can be accessed by the POSIX wrapper and converted into error codes. Yes,
-I could have used error codes in the first place, but didn't feel like changing
-just to accommodate the POSIX wrapper. */
-
-#define ERR1 "\\ at end of pattern"
-#define ERR2 "\\c at end of pattern"
-#define ERR3 "unrecognized character follows \\"
-#define ERR4 "numbers out of order in {} quantifier"
-#define ERR5 "number too big in {} quantifier"
-#define ERR6 "missing terminating ] for character class"
-#define ERR7 "invalid escape sequence in character class"
-#define ERR8 "range out of order in character class"
-#define ERR9 "nothing to repeat"
-#define ERR10 "operand of unlimited repeat could match the empty string"
-#define ERR11 "internal error: unexpected repeat"
-#define ERR12 "unrecognized character after (?"
-#define ERR13 "too many capturing parenthesized sub-patterns"
-#define ERR14 "missing )"
-#define ERR15 "back reference to non-existent subpattern"
-#define ERR16 "erroffset passed as NULL"
-#define ERR17 "unknown option bit(s) set"
-#define ERR18 "missing ) after comment"
-#define ERR19 "too many sets of parentheses"
-#define ERR20 "regular expression too large"
-#define ERR21 "failed to get memory"
-#define ERR22 "unmatched parentheses"
-#define ERR23 "internal error: code overflow"
-#define ERR24 "unrecognized character after (?<"
-#define ERR25 "lookbehind assertion is not fixed length"
-#define ERR26 "malformed number after (?("
-#define ERR27 "conditional group contains more than two branches"
-#define ERR28 "assertion expected after (?("
-#define ERR29 "(?p must be followed by )"
-#define ERR30 "unknown POSIX class name"
-#define ERR31 "POSIX collating elements are not supported"
-#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support"
-#define ERR33 "characters with values > 255 are not yet supported in classes"
-#define ERR34 "character value in \\x{...} sequence is too large"
-#define ERR35 "invalid condition (?(0)"
-
-/* All character handling must be done as unsigned characters. Otherwise there
-are problems with top-bit-set characters and functions such as isspace().
-However, we leave the interface to the outside world as char *, because that
-should make things easier for callers. We define a short type for unsigned char
-to save lots of typing. I tried "uchar", but it causes problems on Digital
-Unix, where it is defined in sys/types, so use "uschar" instead. */
-
-typedef unsigned char uschar;
-
-/* The real format of the start of the pcre block; the actual code vector
-runs on as long as necessary after the end. */
-
-typedef struct real_pcre {
- unsigned long int magic_number;
- size_t size;
- const unsigned char *tables;
- unsigned long int options;
- uschar top_bracket;
- uschar top_backref;
- uschar first_char;
- uschar req_char;
- uschar code[1];
-} real_pcre;
-
-/* The real format of the extra block returned by pcre_study(). */
-
-typedef struct real_pcre_extra {
- uschar options;
- uschar start_bits[32];
-} real_pcre_extra;
-
-
-/* Structure for passing "static" information around between the functions
-doing the compiling, so that they are thread-safe. */
-
-typedef struct compile_data {
- const uschar *lcc; /* Points to lower casing table */
- const uschar *fcc; /* Points to case-flipping table */
- const uschar *cbits; /* Points to character type table */
- const uschar *ctypes; /* Points to table of type maps */
-} compile_data;
-
-/* Structure for passing "static" information around between the functions
-doing the matching, so that they are thread-safe. */
-
-typedef struct match_data {
- int errorcode; /* As it says */
- int *offset_vector; /* Offset vector */
- int offset_end; /* One past the end */
- int offset_max; /* The maximum usable for return data */
- const uschar *lcc; /* Points to lower casing table */
- const uschar *ctypes; /* Points to table of type maps */
- BOOL offset_overflow; /* Set if too many extractions */
- BOOL notbol; /* NOTBOL flag */
- BOOL noteol; /* NOTEOL flag */
- BOOL utf8; /* UTF8 flag */
- BOOL endonly; /* Dollar not before final \n */
- BOOL notempty; /* Empty string match not wanted */
- const uschar *start_pattern; /* For use when recursing */
- const uschar *start_subject; /* Start of the subject string */
- const uschar *end_subject; /* End of the subject string */
- const uschar *start_match; /* Start of this match attempt */
- const uschar *end_match_ptr; /* Subject position at end match */
- int end_offset_top; /* Highwater mark at end of match */
-} match_data;
-
-/* Bit definitions for entries in the pcre_ctypes table. */
-
-#define ctype_space 0x01
-#define ctype_letter 0x02
-#define ctype_digit 0x04
-#define ctype_xdigit 0x08
-#define ctype_word 0x10 /* alphameric or '_' */
-#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */
-
-/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set
-of bits for a class map. Some classes are built by combining these tables. */
-
-#define cbit_space 0 /* [:space:] or \s */
-#define cbit_xdigit 32 /* [:xdigit:] */
-#define cbit_digit 64 /* [:digit:] or \d */
-#define cbit_upper 96 /* [:upper:] */
-#define cbit_lower 128 /* [:lower:] */
-#define cbit_word 160 /* [:word:] or \w */
-#define cbit_graph 192 /* [:graph:] */
-#define cbit_print 224 /* [:print:] */
-#define cbit_punct 256 /* [:punct:] */
-#define cbit_cntrl 288 /* [:cntrl:] */
-#define cbit_length 320 /* Length of the cbits table */
-
-/* Offsets of the various tables from the base tables pointer, and
-total length. */
-
-#define lcc_offset 0
-#define fcc_offset 256
-#define cbits_offset 512
-#define ctypes_offset (cbits_offset + cbit_length)
-#define tables_length (ctypes_offset + 256)
-
-/* End of internal.h */
+++ /dev/null
-PCRE LICENCE
-------------
-
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-University of Cambridge Computing Service,
-Cambridge, England. Phone: +44 1223 334714.
-
-Copyright (c) 1997-2000 University of Cambridge
-
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission. In practice, this means that if you use
- PCRE in software which you distribute to others, commercially or
- otherwise, you must put a sentence like this
-
- Regular expression support is provided by the PCRE library package,
- which is open source software, written by Philip Hazel, and copyright
- by the University of Cambridge, England.
-
- somewhere reasonably visible in your documentation and in any relevant
- files or online help data or similar. A reference to the ftp site for
- the source, that is, to
-
- ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-
- should also be given in the documentation.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
-
-End
+++ /dev/null
-#! /bin/sh
-
-# ltconfig - Create a system-specific libtool.
-# Copyright (C) 1996-1999 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# 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.
-
-# A lot of this script is taken from autoconf-2.10.
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-echo=echo
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
- # Yippee, $echo works!
- :
-else
- # Restart under the correct shell.
- exec "$SHELL" "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-$*
-EOF
- exit 0
-fi
-
-# Find the correct PATH separator. Usually this is `:', but
-# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != Xset; then
- UNAME=${UNAME-`uname 2>/dev/null`}
- case X$UNAME in
- *-DOS) PATH_SEPARATOR=';' ;;
- *) PATH_SEPARATOR=':' ;;
- esac
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-if test "X${echo_test_string+set}" != Xset; then
- # find a string as large as possible, as long as the shell can cope with it
- for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
- if (echo_test_string="`eval $cmd`") 2>/dev/null &&
- echo_test_string="`eval $cmd`" &&
- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then
- break
- fi
- done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" != 'X\t' ||
- test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then
- # The Solaris, AIX, and Digital Unix default echo programs unquote
- # backslashes. This makes it impossible to quote backslashes using
- # echo "$something" | sed 's/\\/\\\\/g'
- #
- # So, first we look for a working echo in the user's PATH.
-
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
- for dir in $PATH /usr/ucb; do
- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- echo="$dir/echo"
- break
- fi
- done
- IFS="$save_ifs"
-
- if test "X$echo" = Xecho; then
- # We didn't find a better echo, so look for alternatives.
- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
- test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- # This shell has a builtin print -r that does the trick.
- echo='print -r'
- elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
- test "X$CONFIG_SHELL" != X/bin/ksh; then
- # If we have ksh, try running ltconfig again with it.
- ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}"
- export ORIGINAL_CONFIG_SHELL
- CONFIG_SHELL=/bin/ksh
- export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}
- else
- # Try using printf.
- echo='printf "%s\n"'
- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- # Cool, printf works
- :
- elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL"
- export CONFIG_SHELL
- SHELL="$CONFIG_SHELL"
- export SHELL
- echo="$CONFIG_SHELL $0 --fallback-echo"
- elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- echo="$CONFIG_SHELL $0 --fallback-echo"
- else
- # maybe with a smaller string...
- prev=:
-
- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then
- break
- fi
- prev="$cmd"
- done
-
- if test "$prev" != 'sed 50q "$0"'; then
- echo_test_string=`eval $prev`
- export echo_test_string
- exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"}
- else
- # Oops. We lost completely, so just stick with echo.
- echo=echo
- fi
- fi
- fi
- fi
-fi
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e s/^X//'
-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# The name of this program.
-progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'`
-
-# Constants:
-PROGRAM=ltconfig
-PACKAGE=libtool
-VERSION=1.3.4
-TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)"
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-rm="rm -f"
-
-help="Try \`$progname --help' for more information."
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-enable_shared=yes
-# All known linkers require a `.a' archive for static linking (except M$VC,
-# which needs '.lib').
-enable_static=yes
-enable_fast_install=yes
-enable_dlopen=unknown
-enable_win32_dll=no
-ltmain=
-silent=
-srcdir=
-ac_config_guess=
-ac_config_sub=
-host=
-nonopt=
-ofile="$default_ofile"
-verify_host=yes
-with_gcc=no
-with_gnu_ld=no
-need_locks=yes
-ac_ext=c
-objext=o
-libext=a
-exeext=
-cache_file=
-
-old_AR="$AR"
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-old_CPPFLAGS="$CPPFLAGS"
-old_LDFLAGS="$LDFLAGS"
-old_LD="$LD"
-old_LN_S="$LN_S"
-old_LIBS="$LIBS"
-old_NM="$NM"
-old_RANLIB="$RANLIB"
-old_DLLTOOL="$DLLTOOL"
-old_OBJDUMP="$OBJDUMP"
-old_AS="$AS"
-
-# Parse the command line options.
-args=
-prev=
-for option
-do
- case "$option" in
- -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
- esac
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- eval "$prev=\$option"
- prev=
- continue
- fi
-
- case "$option" in
- --help) cat <<EOM
-Usage: $progname [OPTION]... [HOST [LTMAIN]]
-
-Generate a system-specific libtool script.
-
- --debug enable verbose shell tracing
- --disable-shared do not build shared libraries
- --disable-static do not build static libraries
- --disable-fast-install do not optimize for fast installation
- --enable-dlopen enable dlopen support
- --enable-win32-dll enable building dlls on win32 hosts
- --help display this help and exit
- --no-verify do not verify that HOST is a valid host type
--o, --output=FILE specify the output file [default=$default_ofile]
- --quiet same as \`--silent'
- --silent do not print informational messages
- --srcdir=DIR find \`config.guess' in DIR
- --version output version information and exit
- --with-gcc assume that the GNU C compiler will be used
- --with-gnu-ld assume that the C compiler uses the GNU linker
- --disable-lock disable file locking
- --cache-file=FILE configure cache file
-
-LTMAIN is the \`ltmain.sh' shell script fragment or \`ltmain.c' program
-that provides basic libtool functionality.
-
-HOST is the canonical host system name [default=guessed].
-EOM
- exit 0
- ;;
-
- --debug)
- echo "$progname: enabling shell trace mode"
- set -x
- ;;
-
- --disable-shared) enable_shared=no ;;
-
- --disable-static) enable_static=no ;;
-
- --disable-fast-install) enable_fast_install=no ;;
-
- --enable-dlopen) enable_dlopen=yes ;;
-
- --enable-win32-dll) enable_win32_dll=yes ;;
-
- --quiet | --silent) silent=yes ;;
-
- --srcdir) prev=srcdir ;;
- --srcdir=*) srcdir="$optarg" ;;
-
- --no-verify) verify_host=no ;;
-
- --output | -o) prev=ofile ;;
- --output=*) ofile="$optarg" ;;
-
- --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"; exit 0 ;;
-
- --with-gcc) with_gcc=yes ;;
- --with-gnu-ld) with_gnu_ld=yes ;;
-
- --disable-lock) need_locks=no ;;
-
- --cache-file=*) cache_file="$optarg" ;;
-
- -*)
- echo "$progname: unrecognized option \`$option'" 1>&2
- echo "$help" 1>&2
- exit 1
- ;;
-
- *)
- if test -z "$ltmain"; then
- ltmain="$option"
- elif test -z "$host"; then
-# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1
-# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then
-# echo "$progname: warning \`$option' is not a valid host type" 1>&2
-# fi
- host="$option"
- else
- echo "$progname: too many arguments" 1>&2
- echo "$help" 1>&2
- exit 1
- fi ;;
- esac
-done
-
-if test -z "$ltmain"; then
- echo "$progname: you must specify a LTMAIN file" 1>&2
- echo "$help" 1>&2
- exit 1
-fi
-
-if test ! -f "$ltmain"; then
- echo "$progname: \`$ltmain' does not exist" 1>&2
- echo "$help" 1>&2
- exit 1
-fi
-
-# Quote any args containing shell metacharacters.
-ltconfig_args=
-for arg
-do
- case "$arg" in
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
- ltconfig_args="$ltconfig_args '$arg'" ;;
- *) ltconfig_args="$ltconfig_args $arg" ;;
- esac
-done
-
-# A relevant subset of AC_INIT.
-
-# 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
-# 5 compiler messages saved in config.log
-# 6 checking for... messages and results
-if test "$silent" = yes; then
- exec 6>/dev/null
-else
- exec 6>&1
-fi
-exec 5>>./config.log
-
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi
-if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi
-
-if test -n "$cache_file" && test -r "$cache_file"; then
- echo "loading cache $cache_file within ltconfig"
- . $cache_file
-fi
-
-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
-
-if test -z "$srcdir"; then
- # Assume the source directory is the same one as the path to LTMAIN.
- srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'`
- test "$srcdir" = "$ltmain" && srcdir=.
-fi
-
-trap "$rm conftest*; exit 1" 1 2 15
-if test "$verify_host" = yes; then
- # Check for config.guess and config.sub.
- ac_aux_dir=
- for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
- if test -f $ac_dir/config.guess; then
- ac_aux_dir=$ac_dir
- break
- fi
- done
- if test -z "$ac_aux_dir"; then
- echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2
- echo "$help" 1>&2
- exit 1
- fi
- ac_config_guess=$ac_aux_dir/config.guess
- ac_config_sub=$ac_aux_dir/config.sub
-
- # Make sure we can run config.sub.
- if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :
- else
- echo "$progname: cannot run $ac_config_sub" 1>&2
- echo "$help" 1>&2
- exit 1
- fi
-
- echo $ac_n "checking host system type""... $ac_c" 1>&6
-
- host_alias=$host
- case "$host_alias" in
- "")
- if host_alias=`$SHELL $ac_config_guess`; then :
- else
- echo "$progname: cannot guess host type; you must specify one" 1>&2
- echo "$help" 1>&2
- exit 1
- fi ;;
- esac
- host=`$SHELL $ac_config_sub $host_alias`
- echo "$ac_t$host" 1>&6
-
- # Make sure the host verified.
- test -z "$host" && exit 1
-
-elif test -z "$host"; then
- echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2
- echo "$help" 1>&2
- exit 1
-else
- host_alias=$host
-fi
-
-# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
-case "$host_os" in
-linux-gnu*) ;;
-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
-esac
-
-host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-case "$host_os" in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR cru $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-# Set a sane default for `AR'.
-test -z "$AR" && AR=ar
-
-# Set a sane default for `OBJDUMP'.
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-# If RANLIB is not set, then run the test.
-if test "${RANLIB+set}" != "set"; then
- result=no
-
- echo $ac_n "checking for ranlib... $ac_c" 1>&6
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
- for dir in $PATH; do
- test -z "$dir" && dir=.
- if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then
- RANLIB="ranlib"
- result="ranlib"
- break
- fi
- done
- IFS="$save_ifs"
-
- echo "$ac_t$result" 1>&6
-fi
-
-if test -n "$RANLIB"; then
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
-fi
-
-# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin.
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$AS" && AS=as
-
-# Check to see if we are using GCC.
-if test "$with_gcc" != yes || test -z "$CC"; then
- # If CC is not set, then try to find GCC or a usable CC.
- if test -z "$CC"; then
- echo $ac_n "checking for gcc... $ac_c" 1>&6
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
- for dir in $PATH; do
- test -z "$dir" && dir=.
- if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then
- CC="gcc"
- break
- fi
- done
- IFS="$save_ifs"
-
- if test -n "$CC"; then
- echo "$ac_t$CC" 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
- fi
-
- # Not "gcc", so try "cc", rejecting "/usr/ucb/cc".
- if test -z "$CC"; then
- echo $ac_n "checking for cc... $ac_c" 1>&6
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
- cc_rejected=no
- for dir in $PATH; do
- test -z "$dir" && dir=.
- if test -f $dir/cc || test -f $dir/cc$ac_exeext; then
- if test "$dir/cc" = "/usr/ucb/cc"; then
- cc_rejected=yes
- continue
- fi
- CC="cc"
- break
- fi
- done
- IFS="$save_ifs"
- if test $cc_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $CC
- shift
- if test $# -gt 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same name, so the bogon will be chosen
- # first if we set CC to just the name; use the full file name.
- shift
- set dummy "$dir/cc" "$@"
- shift
- CC="$@"
- fi
- fi
-
- if test -n "$CC"; then
- echo "$ac_t$CC" 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
-
- if test -z "$CC"; then
- echo "$progname: error: no acceptable cc found in \$PATH" 1>&2
- exit 1
- fi
- fi
-
- # Now see if the compiler is really GCC.
- with_gcc=no
- echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
- echo "$progname:581: checking whether we are using GNU C" >&5
-
- $rm conftest.c
- cat > conftest.c <<EOF
-#ifdef __GNUC__
- yes;
-#endif
-EOF
- if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:589: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
- with_gcc=yes
- fi
- $rm conftest.c
- echo "$ac_t$with_gcc" 1>&6
-fi
-
-# Allow CC to be a program name with arguments.
-set dummy $CC
-compiler="$2"
-
-echo $ac_n "checking for object suffix... $ac_c" 1>&6
-$rm conftest*
-echo 'int i = 1;' > conftest.c
-echo "$progname:603: checking for object suffix" >& 5
-if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then
- # Append any warnings to the config.log.
- cat conftest.err 1>&5
-
- for ac_file in conftest.*; do
- case $ac_file in
- *.c) ;;
- *) objext=`echo $ac_file | sed -e s/conftest.//` ;;
- esac
- done
-else
- cat conftest.err 1>&5
- echo "$progname: failed program was:" >&5
- cat conftest.c >&5
-fi
-$rm conftest*
-echo "$ac_t$objext" 1>&6
-
-echo $ac_n "checking for executable suffix... $ac_c" 1>&6
-if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_cv_exeext="no"
- $rm conftest*
- echo 'main () { return 0; }' > conftest.c
- echo "$progname:629: checking for executable suffix" >& 5
- if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then
- # Append any warnings to the config.log.
- cat conftest.err 1>&5
-
- for ac_file in conftest.*; do
- case $ac_file in
- *.c | *.err | *.$objext ) ;;
- *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;;
- esac
- done
- else
- cat conftest.err 1>&5
- echo "$progname: failed program was:" >&5
- cat conftest.c >&5
- fi
- $rm conftest*
-fi
-if test "X$ac_cv_exeext" = Xno; then
- exeext=""
-else
- exeext="$ac_cv_exeext"
-fi
-echo "$ac_t$ac_cv_exeext" 1>&6
-
-echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
-pic_flag=
-special_shlib_compile_flags=
-wl=
-link_static_flag=
-no_builtin_flag=
-
-if test "$with_gcc" = yes; then
- wl='-Wl,'
- link_static_flag='-static'
-
- case "$host_os" in
- beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- aix*)
- # Below there is a dirty hack to force normal static linking with -ldl
- # The problem is because libdl dynamically linked with both libc and
- # libC (AIX C++ library), which obviously doesn't included in libraries
- # list by gcc. This cause undefined symbols with -static flags.
- # This hack allows C programs to be linked with "-static -ldl", but
- # we not sure about C++ programs.
- link_static_flag="$link_static_flag ${wl}-lC"
- ;;
- cygwin* | mingw* | os2*)
- # We can build DLLs from non-PIC.
- ;;
- amigaos*)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- pic_flag='-m68020 -resident32 -malways-restore-a4'
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- pic_flag=-Kconform_pic
- fi
- ;;
- *)
- pic_flag='-fPIC'
- ;;
- esac
-else
- # PORTME Check for PIC flags for the system compiler.
- case "$host_os" in
- aix3* | aix4*)
- # All AIX code is PIC.
- link_static_flag='-bnso -bI:/lib/syscalls.exp'
- ;;
-
- hpux9* | hpux10* | hpux11*)
- # Is there a better link_static_flag that works with the bundled CC?
- wl='-Wl,'
- link_static_flag="${wl}-a ${wl}archive"
- pic_flag='+Z'
- ;;
-
- irix5* | irix6*)
- wl='-Wl,'
- link_static_flag='-non_shared'
- # PIC (with -KPIC) is the default.
- ;;
-
- cygwin* | mingw* | os2*)
- # We can build DLLs from non-PIC.
- ;;
-
- osf3* | osf4* | osf5*)
- # All OSF/1 code is PIC.
- wl='-Wl,'
- link_static_flag='-non_shared'
- ;;
-
- sco3.2v5*)
- pic_flag='-Kpic'
- link_static_flag='-dn'
- special_shlib_compile_flags='-belf'
- ;;
-
- solaris*)
- pic_flag='-KPIC'
- link_static_flag='-Bstatic'
- wl='-Wl,'
- ;;
-
- sunos4*)
- pic_flag='-PIC'
- link_static_flag='-Bstatic'
- wl='-Qoption ld '
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- pic_flag='-KPIC'
- link_static_flag='-Bstatic'
- wl='-Wl,'
- ;;
-
- uts4*)
- pic_flag='-pic'
- link_static_flag='-Bstatic'
- ;;
- sysv4*MP*)
- if test -d /usr/nec ;then
- pic_flag='-Kconform_pic'
- link_static_flag='-Bstatic'
- fi
- ;;
- *)
- can_build_shared=no
- ;;
- esac
-fi
-
-if test -n "$pic_flag"; then
- echo "$ac_t$pic_flag" 1>&6
-
- # Check to make sure the pic_flag actually works.
- echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
- $rm conftest*
- echo "int some_variable = 0;" > conftest.c
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $pic_flag -DPIC"
- echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5
- if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then
- # Append any warnings to the config.log.
- cat conftest.err 1>&5
-
- case "$host_os" in
- hpux9* | hpux10* | hpux11*)
- # On HP-UX, both CC and GCC only warn that PIC is supported... then they
- # create non-PIC objects. So, if there were any warnings, we assume that
- # PIC is not supported.
- if test -s conftest.err; then
- echo "$ac_t"no 1>&6
- can_build_shared=no
- pic_flag=
- else
- echo "$ac_t"yes 1>&6
- pic_flag=" $pic_flag"
- fi
- ;;
- *)
- echo "$ac_t"yes 1>&6
- pic_flag=" $pic_flag"
- ;;
- esac
- else
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- can_build_shared=no
- pic_flag=
- echo "$ac_t"no 1>&6
- fi
- CFLAGS="$save_CFLAGS"
- $rm conftest*
-else
- echo "$ac_t"none 1>&6
-fi
-
-# Check to see if options -o and -c are simultaneously supported by compiler
-echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6
-$rm -r conftest 2>/dev/null
-mkdir conftest
-cd conftest
-$rm conftest*
-echo "int some_variable = 0;" > conftest.c
-mkdir out
-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
-# that will create temporary files in the current directory regardless of
-# the output directory. Thus, making CWD read-only will cause this test
-# to fail, enabling locking or at least warning the user not to do parallel
-# builds.
-chmod -w .
-save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -o out/conftest2.o"
-echo "$progname:829: checking if $compiler supports -c -o file.o" >&5
-if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then
-
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s out/conftest.err; then
- echo "$ac_t"no 1>&6
- compiler_c_o=no
- else
- echo "$ac_t"yes 1>&6
- compiler_c_o=yes
- fi
-else
- # Append any errors to the config.log.
- cat out/conftest.err 1>&5
- compiler_c_o=no
- echo "$ac_t"no 1>&6
-fi
-CFLAGS="$save_CFLAGS"
-chmod u+w .
-$rm conftest* out/*
-rmdir out
-cd ..
-rmdir conftest
-$rm -r conftest 2>/dev/null
-
-if test x"$compiler_c_o" = x"yes"; then
- # Check to see if we can write to a .lo
- echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6
- $rm conftest*
- echo "int some_variable = 0;" > conftest.c
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -c -o conftest.lo"
- echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5
-if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then
-
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- echo "$ac_t"no 1>&6
- compiler_o_lo=no
- else
- echo "$ac_t"yes 1>&6
- compiler_o_lo=yes
- fi
- else
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- compiler_o_lo=no
- echo "$ac_t"no 1>&6
- fi
- CFLAGS="$save_CFLAGS"
- $rm conftest*
-else
- compiler_o_lo=no
-fi
-
-# Check to see if we can do hard links to lock some files if needed
-hard_links="nottested"
-if test "$compiler_c_o" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6
- hard_links=yes
- $rm conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- echo "$ac_t$hard_links" 1>&6
- $rm conftest*
- if test "$hard_links" = no; then
- echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-if test "$with_gcc" = yes; then
- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
- echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6
- $rm conftest*
- echo "int some_variable = 0;" > conftest.c
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c"
- echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
- if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
-
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- echo "$ac_t"no 1>&6
- compiler_rtti_exceptions=no
- else
- echo "$ac_t"yes 1>&6
- compiler_rtti_exceptions=yes
- fi
- else
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- compiler_rtti_exceptions=no
- echo "$ac_t"no 1>&6
- fi
- CFLAGS="$save_CFLAGS"
- $rm conftest*
-
- if test "$compiler_rtti_exceptions" = "yes"; then
- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
- else
- no_builtin_flag=' -fno-builtin'
- fi
-
-fi
-
-# Check for any special shared library compilation flags.
-if test -n "$special_shlib_compile_flags"; then
- echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2
- if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then :
- else
- echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2
- can_build_shared=no
- fi
-fi
-
-echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6
-$rm conftest*
-echo 'main(){return(0);}' > conftest.c
-save_LDFLAGS="$LDFLAGS"
-LDFLAGS="$LDFLAGS $link_static_flag"
-echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5
-if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
- echo "$ac_t$link_static_flag" 1>&6
-else
- echo "$ac_t"none 1>&6
- link_static_flag=
-fi
-LDFLAGS="$save_LDFLAGS"
-$rm conftest*
-
-if test -z "$LN_S"; then
- # Check to see if we can use ln -s, or we need hard links.
- echo $ac_n "checking whether ln -s works... $ac_c" 1>&6
- $rm conftest.dat
- if ln -s X conftest.dat 2>/dev/null; then
- $rm conftest.dat
- LN_S="ln -s"
- else
- LN_S=ln
- fi
- if test "$LN_S" = "ln -s"; then
- echo "$ac_t"yes 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
-fi
-
-# Make sure LD is an absolute path.
-if test -z "$LD"; then
- ac_prog=ld
- if test "$with_gcc" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
- echo "$progname:991: checking for ld used by GCC" >&5
- ac_prog=`($CC -print-prog-name=ld) 2>&5`
- case "$ac_prog" in
- # Accept absolute paths.
- [\\/]* | [A-Za-z]:[\\/]*)
- re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the path of ld
- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we are not using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
- elif test "$with_gnu_ld" = yes; then
- echo $ac_n "checking for GNU ld... $ac_c" 1>&6
- echo "$progname:1015: checking for GNU ld" >&5
- else
- echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
- echo "$progname:1018: checking for non-GNU ld" >&5
- fi
-
- if test -z "$LD"; then
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
- for ac_dir in $PATH; do
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some GNU ld's only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
- test "$with_gnu_ld" != no && break
- else
- test "$with_gnu_ld" != yes && break
- fi
- fi
- done
- IFS="$ac_save_ifs"
- fi
-
- if test -n "$LD"; then
- echo "$ac_t$LD" 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
-
- if test -z "$LD"; then
- echo "$progname: error: no acceptable ld found in \$PATH" 1>&2
- exit 1
- fi
-fi
-
-# Check to see if it really is or is not GNU ld.
-echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6
-# I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
- with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi
-echo "$ac_t$with_gnu_ld" 1>&6
-
-# See if the linker supports building shared libraries.
-echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6
-
-allow_undefined_flag=
-no_undefined_flag=
-need_lib_prefix=unknown
-need_version=unknown
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-archive_cmds=
-archive_expsym_cmds=
-old_archive_from_new_cmds=
-export_dynamic_flag_spec=
-whole_archive_flag_spec=
-thread_safe_flag_spec=
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-hardcode_shlibpath_var=unsupported
-runpath_var=
-always_export_symbols=no
-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
-# include_expsyms should be a list of space-separated symbols to be *always*
-# included in the symbol list
-include_expsyms=
-# exclude_expsyms can be an egrep regular expression of symbols to exclude
-# it will be wrapped by ` (' and `)$', so one must not match beginning or
-# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-# as well as any symbol that contains `d'.
-exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-# platforms (ab)use it in PIC code, but their linkers get confused if
-# the symbol is explicitly referenced. Since portable code cannot
-# rely on this symbol name, it's probably fine to never include it in
-# preloaded symbol tables.
-
-case "$host_os" in
-cygwin* | mingw*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$with_gcc" != yes; then
- with_gnu_ld=no
- fi
- ;;
-
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # See if GNU ld supports shared libraries.
- case "$host_os" in
- aix3* | aix4*)
- # On AIX, the GNU linker is very broken
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
- ;;
-
- amigaos*)
- archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
-
- # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
- # that the semantics of dynamic libraries on AmigaOS, at least up
- # to version 4, is to share data among multiple programs linked
- # with the same dynamic library. Since this doesn't match the
- # behavior of shared libraries on other platforms, we can use
- # them.
- ld_shlibs=no
- ;;
-
- beos*)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag=unsupported
- # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- cygwin* | mingw*)
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- allow_undefined_flag=unsupported
- always_export_symbols=yes
-
- # Extract the symbol export list from an `--export-all' def file,
- # then regenerate the def file from the symbol export list, so that
- # the compiled dll only exports the symbol export list.
- export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
- test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
- $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~
- sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols'
-
- archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
- _lt_hint=1;
- for symbol in `cat $export_symbols`; do
- echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def;
- _lt_hint=`expr 1 + \$_lt_hint`;
- done~
- test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
- test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
- $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
- $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
- $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts'
-
- old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a'
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib'
- # can we support soname and/or expsyms with a.out? -oliva
- fi
- ;;
-
- solaris* | sysv5*)
- if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
- elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts'
- wlarc=
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- *)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
-
- if test "$ld_shlibs" = yes; then
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
- case $host_os in
- cygwin* | mingw*)
- # dlltool doesn't understand --whole-archive et. al.
- whole_archive_flag_spec=
- ;;
- *)
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec=
- fi
- ;;
- esac
- fi
-else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case "$host_os" in
- aix3*)
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$with_gcc" = yes && test -z "$link_static_flag"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
-
- aix4*)
- hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'
- hardcode_libdir_separator=':'
- if test "$with_gcc" = yes; then
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" && \
- strings "$collect2name" | grep resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- hardcode_direct=yes
- else
- # We have old collect2
- hardcode_direct=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L=yes
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_libdir_separator=
- fi
- shared_flag='-shared'
- else
- shared_flag='${wl}-bM:SRE'
- hardcode_direct=yes
- fi
- allow_undefined_flag=' ${wl}-berok'
- archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}'
- archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}'
- case "$host_os" in aix4.[01]|aix4.[01].*)
- # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on
- always_export_symbols=yes ;;
- esac
- ;;
-
- amigaos*)
- archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- # see comment about different semantics on the GNU ld section
- ld_shlibs=no
- ;;
-
- cygwin* | mingw*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib /OUT:$oldlib$oldobjs'
- fix_srcfile_path='`cygpath -w $srcfile`'
- ;;
-
- freebsd1*)
- ld_shlibs=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd*)
- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- hpux9* | hpux10* | hpux11*)
- case "$host_os" in
- hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;;
- *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;;
- esac
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- hardcode_minus_L=yes # Not in the search PATH, but as the default
- # location of the library.
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- irix5* | irix6*)
- if test "$with_gcc" = yes; then
- archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
- else
- archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out
- else
- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF
- fi
- hardcode_libdir_flag_spec='${wl}-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- openbsd*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- allow_undefined_flag=unsupported
- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$with_gcc" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- osf4* | osf5*) # As osf3* with the addition of the -msym flag
- if test "$with_gcc" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- sco3.2v5*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- ;;
-
- solaris*)
- no_undefined_flag=' -z text'
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_shlibpath_var=no
- case "$host_os" in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *) # Supported since Solaris 2.6 (maybe 2.5.1?)
- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
- esac
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- sysv4)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- hardcode_direct=no #Motorola manual says yes, but my tests say they lie
- ;;
-
- sysv4.3*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
- hardcode_shlibpath_var=no
- export_dynamic_flag_spec='-Bexport'
- ;;
-
- sysv5*)
- no_undefined_flag=' -z text'
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
- hardcode_libdir_flag_spec=
- hardcode_shlibpath_var=no
- runpath_var='LD_RUN_PATH'
- ;;
-
- uts4*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- dgux*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- ld_shlibs=yes
- fi
- ;;
-
- sysv4.2uw2*)
- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts'
- hardcode_direct=yes
- hardcode_minus_L=no
- hardcode_shlibpath_var=no
- hardcode_runpath_var=yes
- runpath_var=LD_RUN_PATH
- ;;
-
- unixware7*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- *)
- ld_shlibs=no
- ;;
- esac
-fi
-echo "$ac_t$ld_shlibs" 1>&6
-test "$ld_shlibs" = no && can_build_shared=no
-
-if test -z "$NM"; then
- echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
- case "$NM" in
- [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path.
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
- for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
- NM="$ac_dir/nm -B"
- break
- elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
- NM="$ac_dir/nm -p"
- break
- else
- NM=${NM="$ac_dir/nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- fi
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$NM" && NM=nm
- ;;
- esac
- echo "$ac_t$NM" 1>&6
-fi
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Transform the above into a raw symbol and a C symbol.
-symxfrm='\1 \2\3 \3'
-
-# Transform an extracted symbol line into a proper C declaration
-global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
-
-# Define system-specific variables.
-case "$host_os" in
-aix*)
- symcode='[BCDT]'
- ;;
-cygwin* | mingw*)
- symcode='[ABCDGISTW]'
- ;;
-hpux*) # Its linker distinguishes data from code symbols
- global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
- ;;
-irix*)
- symcode='[BCDEGRST]'
- ;;
-solaris*)
- symcode='[BDT]'
- ;;
-sysv4)
- symcode='[DFNSTU]'
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
- symcode='[ABCDGISTW]'
-fi
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Write the raw and C identifiers.
- global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
- $rm conftest*
- cat > conftest.c <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
- echo "$progname:1635: checking if global_symbol_pipe works" >&5
- if { (eval echo $progname:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if { echo "$progname:1639: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
-
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if egrep ' nm_test_var$' "$nlist" >/dev/null; then
- if egrep ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<EOF > conftest.c
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
- # Now generate the symbol file.
- eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c'
-
- cat <<EOF >> conftest.c
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
- const char *name;
- lt_ptr_t address;
-}
-lt_preloaded_symbols[] =
-{
-EOF
- sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c
- cat <<\EOF >> conftest.c
- {0, (lt_ptr_t) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
- # Now try linking the two files.
- mv conftest.$objext conftstm.$objext
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="conftstm.$objext"
- CFLAGS="$CFLAGS$no_builtin_flag"
- if { (eval echo $progname:1691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
- pipe_works=yes
- else
- echo "$progname: failed program was:" >&5
- cat conftest.c >&5
- fi
- LIBS="$save_LIBS"
- else
- echo "cannot find nm_test_func in $nlist" >&5
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&5
- fi
- else
- echo "cannot run $global_symbol_pipe" >&5
- fi
- else
- echo "$progname: failed program was:" >&5
- cat conftest.c >&5
- fi
- $rm conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- global_symbol_pipe=
- fi
-done
-if test "$pipe_works" = yes; then
- echo "${ac_t}ok" 1>&6
-else
- echo "${ac_t}failed" 1>&6
-fi
-
-if test -z "$global_symbol_pipe"; then
- global_symbol_to_cdecl=
-fi
-
-# Check hardcoding attributes.
-echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
- test -n "$runpath_var"; then
-
- # We can hardcode non-existant directories.
- if test "$hardcode_direct" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$hardcode_shlibpath_var" != no &&
- test "$hardcode_minus_L" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action=unsupported
-fi
-echo "$ac_t$hardcode_action" 1>&6
-
-
-reload_flag=
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
-# PORTME Some linkers may need a different reload flag.
-reload_flag='-r'
-echo "$ac_t$reload_flag" 1>&6
-test -n "$reload_flag" && reload_flag=" $reload_flag"
-
-# PORTME Fill in your ld.so characteristics
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-file_magic_cmd=
-file_magic_test_file=
-deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [regex]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given egrep regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6
-case "$host_os" in
-aix3*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}.so$major'
- ;;
-
-aix4*)
- version_type=linux
- # AIX has no versioning support, so currently we can not hardcode correct
- # soname into executable. Probably we can add versioning support to
- # collect2, so additional links can be useful in future.
- # We preserve .a as extension for shared libraries though AIX4.2
- # and later linker supports .so
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a'
- shlibpath_var=LIBPATH
- deplibs_check_method=pass_all
- ;;
-
-amigaos*)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
- ;;
-
-beos*)
- library_names_spec='${libname}.so'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- deplibs_check_method=pass_all
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
-bsdi4*)
- version_type=linux
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=/shlib/libc.so
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- export_dynamic_flag_spec=-rdynamic
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw*)
- version_type=windows
- need_version=no
- need_lib_prefix=no
- if test "$with_gcc" = yes; then
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'
- else
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
- fi
- dynamic_linker='Win32 ld.exe'
- deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
- file_magic_cmd='${OBJDUMP} -f'
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
-freebsd1*)
- dynamic_linker=no
- ;;
-
-freebsd*)
- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
- version_type=freebsd-$objformat
- case "$version_type" in
- freebsd-elf*)
- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=`echo /usr/lib/libc.so*`
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- deplibs_check_method=unknown
- library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
- need_version=yes
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case "$host_os" in
- freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*)
- shlibpath_overrides_runpath=yes
- ;;
- *) # from 3.2 on
- shlibpath_overrides_runpath=no
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- dynamic_linker="$host_os dld.sl"
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
- soname_spec='${libname}${release}.sl$major'
- # HP-UX runs *really* slowly unless shared libraries are mode 555.
- postinstall_cmds='chmod 555 $lib'
- ;;
-
-irix5* | irix6*)
- version_type=irix
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}.so.$major'
- library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so'
- case "$host_os" in
- irix5*)
- libsuff= shlibsuff=
- # this will be overridden with pass_all, but let us keep it just in case
- deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
- ;;
- *)
- case "$LD" in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=`echo /lib${libsuff}/libc.so*`
- deplibs_check_method='pass_all'
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
- dynamic_linker=no
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
-
- if test -f /lib/ld.so.1; then
- dynamic_linker='GNU ld.so'
- else
- # Only the GNU ld.so supports shared libraries on MkLinux.
- case "$host_cpu" in
- powerpc*) dynamic_linker=no ;;
- *) dynamic_linker='Linux ld.so' ;;
- esac
- fi
- ;;
-
-netbsd*)
- version_type=sunos
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-openbsd*)
- version_type=sunos
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- need_version=no
- fi
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-os2*)
- libname_spec='$name'
- need_lib_prefix=no
- library_names_spec='$libname.dll $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_version=no
- soname_spec='${libname}${release}.so'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- # this will be overridden with pass_all, but let us keep it just in case
- deplibs_check_method='file_magic COFF format alpha shared library'
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=/shlib/libc.so
- deplibs_check_method='pass_all'
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-sco3.2v5*)
- version_type=osf
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-solaris*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib"
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=/lib/libc.so
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- case "$host_vendor" in
- ncr)
- deplibs_check_method='pass_all'
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
- file_magic_cmd=/usr/bin/file
- file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- esac
- ;;
-
-uts4*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-dgux*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux
- library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
- soname_spec='$libname.so.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-echo "$ac_t$dynamic_linker" 1>&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-# Report the final consequences.
-echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6
-
-# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in
-# configure.in, otherwise build static only libraries.
-case "$host_os" in
-cygwin* | mingw* | os2*)
- if test x$can_build_shared = xyes; then
- test x$enable_win32_dll = xno && can_build_shared=no
- echo "checking if package supports dlls... $can_build_shared" 1>&6
- fi
-;;
-esac
-
-if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then
- case "$deplibs_check_method" in
- "file_magic "*)
- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- egrep "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
- fi ;;
- esac
-fi
-
-echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case "$host_os" in
-aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
-aix4*)
- test "$enable_shared" = yes && enable_static=no
- ;;
-esac
-
-echo "$ac_t$enable_shared" 1>&6
-
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-
-echo "checking whether to build static libraries... $enable_static" 1>&6
-
-if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-echo $ac_n "checking for objdir... $ac_c" 1>&6
-rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-echo "$ac_t$objdir" 1>&6
-
-if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
-if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then
- lt_cv_dlopen=no lt_cv_dlopen_libs=
-echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "$progname:2212: checking for dlopen in -ldl" >&5
-ac_lib_var=`echo dl'_'dlopen | 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="-ldl $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2220 "ltconfig"
-/* 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. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen();
-
-int main() {
-dlopen()
-; return 0; }
-EOF
-if { (eval echo $progname:2233: \"$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 "$progname: 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
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for dlopen""... $ac_c" 1>&6
-echo "$progname:2252: checking for dlopen" >&5
-if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2257 "ltconfig"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char dlopen(); 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. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen();
-
-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_dlopen) || defined (__stub___dlopen)
-choke me
-#else
-dlopen();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo $progname:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_dlopen=yes"
-else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_dlopen=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- lt_cv_dlopen="dlopen"
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
-echo "$progname:2299: checking for dld_link in -ldld" >&5
-ac_lib_var=`echo dld'_'dld_link | 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="-ldld $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2307 "ltconfig"
-/* 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. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link();
-
-int main() {
-dld_link()
-; return 0; }
-EOF
-if { (eval echo $progname:2320: \"$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 "$progname: 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
- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for shl_load""... $ac_c" 1>&6
-echo "$progname:2339: checking for shl_load" >&5
-if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2344 "ltconfig"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char shl_load(); 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. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load();
-
-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_shl_load) || defined (__stub___shl_load)
-choke me
-#else
-shl_load();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo $progname:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_func_shl_load=yes"
-else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_func_shl_load=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- lt_cv_dlopen="shl_load"
-else
- echo "$ac_t""no" 1>&6
-echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "$progname:2387: checking for shl_load in -ldld" >&5
-ac_lib_var=`echo dld'_'shl_load | 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="-ldld $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2395 "ltconfig"
-#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. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load();
-
-int main() {
-shl_load()
-; return 0; }
-EOF
-if { (eval echo $progname:2409: \"$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 "$progname: 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
- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
- echo "$ac_t""no" 1>&6
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-fi
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- fi
-
- case "$lt_cv_dlopen" in
- dlopen)
-for ac_hdr in dlfcn.h; do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "$progname:2452: checking for $ac_hdr" >&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 2457 "ltconfig"
-#include <$ac_hdr>
-int fnord = 0;
-EOF
-ac_try="$ac_compile >/dev/null 2>conftest.out"
-{ (eval echo $progname:2462: \"$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 "$progname: 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
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-
- if test "x$ac_cv_header_dlfcn_h" = xyes; then
- CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
- fi
- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6
-echo "$progname:2490: checking whether a program can dlopen itself" >&5
-if test "${lt_cv_dlopen_self+set}" = set; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test "$cross_compiling" = yes; then
- lt_cv_dlopen_self=cross
- else
- cat > conftest.c <<EOF
-#line 2498 "ltconfig"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LTDL_GLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LTDL_GLOBAL DL_GLOBAL
-# else
-# define LTDL_GLOBAL 0
-# endif
-#endif
-
-/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LTDL_LAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LTDL_LAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LTDL_LAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LTDL_LAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LTDL_LAZY_OR_NOW DL_NOW
-# else
-# define LTDL_LAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-fnord() { int i=42;}
-main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
- if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
- if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); }
-
-EOF
-if { (eval echo $progname:2544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
-then
- lt_cv_dlopen_self=yes
-else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- lt_cv_dlopen_self=no
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$lt_cv_dlopen_self" 1>&6
-
- if test "$lt_cv_dlopen_self" = yes; then
- LDFLAGS="$LDFLAGS $link_static_flag"
- echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6
-echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5
-if test "${lt_cv_dlopen_self_static+set}" = set; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- if test "$cross_compiling" = yes; then
- lt_cv_dlopen_self_static=cross
- else
- cat > conftest.c <<EOF
-#line 2571 "ltconfig"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LTDL_GLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LTDL_GLOBAL DL_GLOBAL
-# else
-# define LTDL_GLOBAL 0
-# endif
-#endif
-
-/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LTDL_LAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LTDL_LAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LTDL_LAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LTDL_LAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LTDL_LAZY_OR_NOW DL_NOW
-# else
-# define LTDL_LAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-fnord() { int i=42;}
-main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
- if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
- if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); }
-
-EOF
-if { (eval echo $progname:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
-then
- lt_cv_dlopen_self_static=yes
-else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -fr conftest*
- lt_cv_dlopen_self_static=no
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6
-fi
- ;;
- esac
-
- case "$lt_cv_dlopen_self" in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case "$lt_cv_dlopen_self_static" in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-
-# Copy echo and quote the copy, instead of the original, because it is
-# used later.
-ltecho="$echo"
-if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then
- ltecho="$CONFIG_SHELL \$0 --fallback-echo"
-fi
-LTSHELL="$SHELL"
-
-LTCONFIG_VERSION="$VERSION"
-
-# Only quote variables if we're using ltmain.sh.
-case "$ltmain" in
-*.sh)
- # Now quote all the things that may contain metacharacters.
- for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \
- old_LD old_LDFLAGS old_LIBS \
- old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \
- AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \
- reload_flag reload_cmds wl \
- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
- thread_safe_flag_spec whole_archive_flag_spec libname_spec \
- library_names_spec soname_spec \
- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
- old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \
- file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \
- finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
- hardcode_libdir_flag_spec hardcode_libdir_separator \
- sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
- compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
-
- case "$var" in
- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
- old_postinstall_cmds | old_postuninstall_cmds | \
- export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
- postinstall_cmds | postuninstall_cmds | \
- finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
- # Double-quote double-evaled strings.
- eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
- ;;
- *)
- eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
- ;;
- esac
- done
-
- case "$ltecho" in
- *'\$0 --fallback-echo"')
- ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
- ;;
- esac
-
- trap "$rm \"$ofile\"; exit 1" 1 2 15
- echo "creating $ofile"
- $rm "$ofile"
- cat <<EOF > "$ofile"
-#! $SHELL
-
-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
-#
-# Copyright (C) 1996-1999 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# 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.
-#
-# 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.
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="sed -e s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-### BEGIN LIBTOOL CONFIG
-EOF
- cfgfile="$ofile"
- ;;
-
-*)
- # Double-quote the variables that need it (for aesthetics).
- for var in old_CC old_CFLAGS old_CPPFLAGS \
- old_LD old_LDFLAGS old_LIBS \
- old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do
- eval "$var=\\\"\$var\\\""
- done
-
- # Just create a config file.
- cfgfile="$ofile.cfg"
- trap "$rm \"$cfgfile\"; exit 1" 1 2 15
- echo "creating $cfgfile"
- $rm "$cfgfile"
- cat <<EOF > "$cfgfile"
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-EOF
- ;;
-esac
-
-cat <<EOF >> "$cfgfile"
-# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\
-# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\
-# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\
-# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\
-# $0$ltconfig_args
-#
-# Compiler and other test output produced by $progname, useful for
-# debugging $progname, is in ./config.log if it exists.
-
-# The version of $progname that generated this script.
-LTCONFIG_VERSION=$LTCONFIG_VERSION
-
-# Shell to use when invoking shell scripts.
-SHELL=$LTSHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-
-# An echo program that does not interpret backslashes.
-echo=$ltecho
-
-# The archiver.
-AR=$AR
-
-# The default C compiler.
-CC=$CC
-
-# The linker used to build libraries.
-LD=$LD
-
-# Whether we need hard or soft links.
-LN_S=$LN_S
-
-# A BSD-compatible nm program.
-NM=$NM
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$reload_flag
-reload_cmds=$reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$wl
-
-# Object file suffix (normally "o").
-objext="$objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$pic_flag
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$compiler_c_o
-
-# Can we write directly to a .lo ?
-compiler_o_lo=$compiler_o_lo
-
-# Must we lock files when doing compilation ?
-need_locks=$need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$link_static_flag
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$no_builtin_flag
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$whole_archive_flag_spec
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$thread_safe_flag_spec
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$libname_spec
-
-# List of archive names. First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$RANLIB
-old_archive_cmds=$old_archive_cmds
-old_postinstall_cmds=$old_postinstall_cmds
-old_postuninstall_cmds=$old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$old_archive_from_new_cmds
-
-# Commands used to build and install a shared archive.
-archive_cmds=$archive_cmds
-archive_expsym_cmds=$archive_expsym_cmds
-postinstall_cmds=$postinstall_cmds
-postuninstall_cmds=$postuninstall_cmds
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$allow_undefined_flag
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$no_undefined_flag
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$global_symbol_to_cdecl
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$hardcode_libdir_separator
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$include_expsyms
-
-EOF
-
-case "$ltmain" in
-*.sh)
- echo '### END LIBTOOL CONFIG' >> "$ofile"
- echo >> "$ofile"
- case "$host_os" in
- aix3*)
- cat <<\EOF >> "$ofile"
-
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-EOF
- ;;
- esac
-
- # Append the ltmain.sh script.
- sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
-
- chmod +x "$ofile"
- ;;
-
-*)
- # Compile the libtool program.
- echo "FIXME: would compile $ltmain"
- ;;
-esac
-
-test -n "$cache_file" || exit 0
-
-# AC_CACHE_SAVE
-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
-
-exit 0
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
+++ /dev/null
-# ltmain.sh - Provide generalized library-building support services.
-# NOTE: Changing this file will not affect anything until you rerun ltconfig.
-#
-# Copyright (C) 1996-1999 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# 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.
-#
-# 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.
-
-# Check that we have a working $echo.
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
- # Yippee, $echo works!
- :
-else
- # Restart under the correct shell, and then maybe $echo will work.
- exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-$*
-EOF
- exit 0
-fi
-
-# The name of this program.
-progname=`$echo "$0" | sed 's%^.*/%%'`
-modename="$progname"
-
-# Constants.
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION=1.3.4
-TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)"
-
-default_mode=
-help="Try \`$progname --help' for more information."
-magic="%%%MAGIC variable%%%"
-mkdir="mkdir"
-mv="mv -f"
-rm="rm -f"
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
-SP2NL='tr \040 \012'
-NL2SP='tr \015\012 \040\040'
-
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-# We save the old values to restore during execute mode.
-if test "${LC_ALL+set}" = set; then
- save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
-fi
-if test "${LANG+set}" = set; then
- save_LANG="$LANG"; LANG=C; export LANG
-fi
-
-if test "$LTCONFIG_VERSION" != "$VERSION"; then
- echo "$modename: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
- echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
- exit 1
-fi
-
-if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
- echo "$modename: not configured to build any kind of library" 1>&2
- echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
- exit 1
-fi
-
-# Global variables.
-mode=$default_mode
-nonopt=
-prev=
-prevopt=
-run=
-show="$echo"
-show_help=
-execute_dlfiles=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-
-# Parse our command line options once, thoroughly.
-while test $# -gt 0
-do
- arg="$1"
- shift
-
- case "$arg" in
- -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
- esac
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- case "$prev" in
- execute_dlfiles)
- eval "$prev=\"\$$prev \$arg\""
- ;;
- *)
- eval "$prev=\$arg"
- ;;
- esac
-
- prev=
- prevopt=
- continue
- fi
-
- # Have we seen a non-optional argument yet?
- case "$arg" in
- --help)
- show_help=yes
- ;;
-
- --version)
- echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
- exit 0
- ;;
-
- --config)
- sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0
- exit 0
- ;;
-
- --debug)
- echo "$progname: enabling shell trace mode"
- set -x
- ;;
-
- --dry-run | -n)
- run=:
- ;;
-
- --features)
- echo "host: $host"
- if test "$build_libtool_libs" = yes; then
- echo "enable shared libraries"
- else
- echo "disable shared libraries"
- fi
- if test "$build_old_libs" = yes; then
- echo "enable static libraries"
- else
- echo "disable static libraries"
- fi
- exit 0
- ;;
-
- --finish) mode="finish" ;;
-
- --mode) prevopt="--mode" prev=mode ;;
- --mode=*) mode="$optarg" ;;
-
- --quiet | --silent)
- show=:
- ;;
-
- -dlopen)
- prevopt="-dlopen"
- prev=execute_dlfiles
- ;;
-
- -*)
- $echo "$modename: unrecognized option \`$arg'" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
-
- *)
- nonopt="$arg"
- break
- ;;
- esac
-done
-
-if test -n "$prevopt"; then
- $echo "$modename: option \`$prevopt' requires an argument" 1>&2
- $echo "$help" 1>&2
- exit 1
-fi
-
-if test -z "$show_help"; then
-
- # Infer the operation mode.
- if test -z "$mode"; then
- case "$nonopt" in
- *cc | *++ | gcc* | *-gcc*)
- mode=link
- for arg
- do
- case "$arg" in
- -c)
- mode=compile
- break
- ;;
- esac
- done
- ;;
- *db | *dbx | *strace | *truss)
- mode=execute
- ;;
- *install*|cp|mv)
- mode=install
- ;;
- *rm)
- mode=uninstall
- ;;
- *)
- # If we have no mode, but dlfiles were specified, then do execute mode.
- test -n "$execute_dlfiles" && mode=execute
-
- # Just use the default operation mode.
- if test -z "$mode"; then
- if test -n "$nonopt"; then
- $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
- else
- $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
- fi
- fi
- ;;
- esac
- fi
-
- # Only execute mode is allowed to have -dlopen flags.
- if test -n "$execute_dlfiles" && test "$mode" != execute; then
- $echo "$modename: unrecognized option \`-dlopen'" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Change the help message to a mode-specific one.
- generic_help="$help"
- help="Try \`$modename --help --mode=$mode' for more information."
-
- # These modes are in order of execution frequency so that they run quickly.
- case "$mode" in
- # libtool compile mode
- compile)
- modename="$modename: compile"
- # Get the compilation command and the source file.
- base_compile=
- lastarg=
- srcfile="$nonopt"
- suppress_output=
-
- user_target=no
- for arg
- do
- # Accept any command-line options.
- case "$arg" in
- -o)
- if test "$user_target" != "no"; then
- $echo "$modename: you cannot specify \`-o' more than once" 1>&2
- exit 1
- fi
- user_target=next
- ;;
-
- -static)
- build_old_libs=yes
- continue
- ;;
- esac
-
- case "$user_target" in
- next)
- # The next one is the -o target name
- user_target=yes
- continue
- ;;
- yes)
- # We got the output file
- user_target=set
- libobj="$arg"
- continue
- ;;
- esac
-
- # Accept the current argument as the source file.
- lastarg="$srcfile"
- srcfile="$arg"
-
- # Aesthetically quote the previous argument.
-
- # Backslashify any backslashes, double quotes, and dollar signs.
- # These are the only characters that are still specially
- # interpreted inside of double-quoted scrings.
- lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
-
- # Double-quote args containing other shell metacharacters.
- # Many Bourne shells cannot handle close brackets correctly in scan
- # sets, so we specify it separately.
- case "$lastarg" in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- lastarg="\"$lastarg\""
- ;;
- esac
-
- # Add the previous argument to base_compile.
- if test -z "$base_compile"; then
- base_compile="$lastarg"
- else
- base_compile="$base_compile $lastarg"
- fi
- done
-
- case "$user_target" in
- set)
- ;;
- no)
- # Get the name of the library object.
- libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
- ;;
- *)
- $echo "$modename: you must specify a target with \`-o'" 1>&2
- exit 1
- ;;
- esac
-
- # Recognize several different file suffixes.
- # If the user specifies -o file.o, it is replaced with file.lo
- xform='[cCFSfmso]'
- case "$libobj" in
- *.ada) xform=ada ;;
- *.adb) xform=adb ;;
- *.ads) xform=ads ;;
- *.asm) xform=asm ;;
- *.c++) xform=c++ ;;
- *.cc) xform=cc ;;
- *.cpp) xform=cpp ;;
- *.cxx) xform=cxx ;;
- *.f90) xform=f90 ;;
- *.for) xform=for ;;
- esac
-
- libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
-
- case "$libobj" in
- *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
- *)
- $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
- exit 1
- ;;
- esac
-
- if test -z "$base_compile"; then
- $echo "$modename: you must specify a compilation command" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Delete any leftover library objects.
- if test "$build_old_libs" = yes; then
- removelist="$obj $libobj"
- else
- removelist="$libobj"
- fi
-
- $run $rm $removelist
- trap "$run $rm $removelist; exit 1" 1 2 15
-
- # Calculate the filename of the output object if compiler does
- # not support -o with -c
- if test "$compiler_c_o" = no; then
- output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext}
- lockfile="$output_obj.lock"
- removelist="$removelist $output_obj $lockfile"
- trap "$run $rm $removelist; exit 1" 1 2 15
- else
- need_locks=no
- lockfile=
- fi
-
- # Lock this critical section if it is needed
- # We use this script file to make the link, it avoids creating a new file
- if test "$need_locks" = yes; then
- until ln "$0" "$lockfile" 2>/dev/null; do
- $show "Waiting for $lockfile to be removed"
- sleep 2
- done
- elif test "$need_locks" = warn; then
- if test -f "$lockfile"; then
- echo "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $run $rm $removelist
- exit 1
- fi
- echo $srcfile > "$lockfile"
- fi
-
- if test -n "$fix_srcfile_path"; then
- eval srcfile=\"$fix_srcfile_path\"
- fi
-
- # Only build a PIC object if we are building libtool libraries.
- if test "$build_libtool_libs" = yes; then
- # Without this assignment, base_compile gets emptied.
- fbsd_hideous_sh_bug=$base_compile
-
- # All platforms use -DPIC, to notify preprocessed assembler code.
- command="$base_compile $srcfile $pic_flag -DPIC"
- if test "$build_old_libs" = yes; then
- lo_libobj="$libobj"
- dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$dir" = "X$libobj"; then
- dir="$objdir"
- else
- dir="$dir/$objdir"
- fi
- libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
-
- if test -d "$dir"; then
- $show "$rm $libobj"
- $run $rm $libobj
- else
- $show "$mkdir $dir"
- $run $mkdir $dir
- status=$?
- if test $status -ne 0 && test ! -d $dir; then
- exit $status
- fi
- fi
- fi
- if test "$compiler_o_lo" = yes; then
- output_obj="$libobj"
- command="$command -o $output_obj"
- elif test "$compiler_c_o" = yes; then
- output_obj="$obj"
- command="$command -o $output_obj"
- fi
-
- $run $rm "$output_obj"
- $show "$command"
- if $run eval "$command"; then :
- else
- test -n "$output_obj" && $run $rm $removelist
- exit 1
- fi
-
- if test "$need_locks" = warn &&
- test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
- echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $run $rm $removelist
- exit 1
- fi
-
- # Just move the object if needed, then go on to compile the next one
- if test x"$output_obj" != x"$libobj"; then
- $show "$mv $output_obj $libobj"
- if $run $mv $output_obj $libobj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
-
- # If we have no pic_flag, then copy the object into place and finish.
- if test -z "$pic_flag" && test "$build_old_libs" = yes; then
- # Rename the .lo from within objdir to obj
- if test -f $obj; then
- $show $rm $obj
- $run $rm $obj
- fi
-
- $show "$mv $libobj $obj"
- if $run $mv $libobj $obj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
-
- xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$obj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
- libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
- # Now arrange that obj and lo_libobj become the same file
- $show "(cd $xdir && $LN_S $baseobj $libobj)"
- if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
- exit 0
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
-
- # Allow error messages only from the first compilation.
- suppress_output=' >/dev/null 2>&1'
- fi
-
- # Only build a position-dependent object if we build old libraries.
- if test "$build_old_libs" = yes; then
- command="$base_compile $srcfile"
- if test "$compiler_c_o" = yes; then
- command="$command -o $obj"
- output_obj="$obj"
- fi
-
- # Suppress compiler output if we already did a PIC compilation.
- command="$command$suppress_output"
- $run $rm "$output_obj"
- $show "$command"
- if $run eval "$command"; then :
- else
- $run $rm $removelist
- exit 1
- fi
-
- if test "$need_locks" = warn &&
- test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
- echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $run $rm $removelist
- exit 1
- fi
-
- # Just move the object if needed
- if test x"$output_obj" != x"$obj"; then
- $show "$mv $output_obj $obj"
- if $run $mv $output_obj $obj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
-
- # Create an invalid libtool object if no PIC, so that we do not
- # accidentally link it into a program.
- if test "$build_libtool_libs" != yes; then
- $show "echo timestamp > $libobj"
- $run eval "echo timestamp > \$libobj" || exit $?
- else
- # Move the .lo from within objdir
- $show "$mv $libobj $lo_libobj"
- if $run $mv $libobj $lo_libobj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
- fi
-
- # Unlock the critical section if it was locked
- if test "$need_locks" != no; then
- $rm "$lockfile"
- fi
-
- exit 0
- ;;
-
- # libtool link mode
- link)
- modename="$modename: link"
- case "$host" in
- *-*-cygwin* | *-*-mingw* | *-*-os2*)
- # It is impossible to link a dll without this setting, and
- # we shouldn't force the makefile maintainer to figure out
- # which system we are compiling for in order to pass an extra
- # flag for every libtool invokation.
- # allow_undefined=no
-
- # FIXME: Unfortunately, there are problems with the above when trying
- # to make a dll which has undefined symbols, in which case not
- # even a static library is built. For now, we need to specify
- # -no-undefined on the libtool link line when we can be certain
- # that all symbols are satisfied, otherwise we get a static library.
- allow_undefined=yes
-
- # This is a source program that is used to create dlls on Windows
- # Don't remove nor modify the starting and closing comments
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# # ifdef __CYGWIN32__
-# # define __CYGWIN__ __CYGWIN32__
-# # endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-# __hDllInstance_base = hInst;
-# return TRUE;
-# }
-# /* ltdll.c ends here */
- # This is a source program that is used to create import libraries
- # on Windows for dlls which lack them. Don't remove nor modify the
- # starting and closing comments
-# /* impgen.c starts here */
-# /* Copyright (C) 1999 Free Software Foundation, Inc.
-#
-# This file is part of GNU libtool.
-#
-# 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.
-# */
-#
-# #include <stdio.h> /* for printf() */
-# #include <unistd.h> /* for open(), lseek(), read() */
-# #include <fcntl.h> /* for O_RDONLY, O_BINARY */
-# #include <string.h> /* for strdup() */
-#
-# static unsigned int
-# pe_get16 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[2];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 2);
-# return b[0] + (b[1]<<8);
-# }
-#
-# static unsigned int
-# pe_get32 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[4];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 4);
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# static unsigned int
-# pe_as32 (ptr)
-# void *ptr;
-# {
-# unsigned char *b = ptr;
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# int
-# main (argc, argv)
-# int argc;
-# char *argv[];
-# {
-# int dll;
-# unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
-# unsigned long export_rva, export_size, nsections, secptr, expptr;
-# unsigned long name_rvas, nexp;
-# unsigned char *expdata, *erva;
-# char *filename, *dll_name;
-#
-# filename = argv[1];
-#
-# dll = open(filename, O_RDONLY|O_BINARY);
-# if (!dll)
-# return 1;
-#
-# dll_name = filename;
-#
-# for (i=0; filename[i]; i++)
-# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
-# dll_name = filename + i +1;
-#
-# pe_header_offset = pe_get32 (dll, 0x3c);
-# opthdr_ofs = pe_header_offset + 4 + 20;
-# num_entries = pe_get32 (dll, opthdr_ofs + 92);
-#
-# if (num_entries < 1) /* no exports */
-# return 1;
-#
-# export_rva = pe_get32 (dll, opthdr_ofs + 96);
-# export_size = pe_get32 (dll, opthdr_ofs + 100);
-# nsections = pe_get16 (dll, pe_header_offset + 4 +2);
-# secptr = (pe_header_offset + 4 + 20 +
-# pe_get16 (dll, pe_header_offset + 4 + 16));
-#
-# expptr = 0;
-# for (i = 0; i < nsections; i++)
-# {
-# char sname[8];
-# unsigned long secptr1 = secptr + 40 * i;
-# unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
-# unsigned long vsize = pe_get32 (dll, secptr1 + 16);
-# unsigned long fptr = pe_get32 (dll, secptr1 + 20);
-# lseek(dll, secptr1, SEEK_SET);
-# read(dll, sname, 8);
-# if (vaddr <= export_rva && vaddr+vsize > export_rva)
-# {
-# expptr = fptr + (export_rva - vaddr);
-# if (export_rva + export_size > vaddr + vsize)
-# export_size = vsize - (export_rva - vaddr);
-# break;
-# }
-# }
-#
-# expdata = (unsigned char*)malloc(export_size);
-# lseek (dll, expptr, SEEK_SET);
-# read (dll, expdata, export_size);
-# erva = expdata - export_rva;
-#
-# nexp = pe_as32 (expdata+24);
-# name_rvas = pe_as32 (expdata+32);
-#
-# printf ("EXPORTS\n");
-# for (i = 0; i<nexp; i++)
-# {
-# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
-# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
-# }
-#
-# return 0;
-# }
-# /* impgen.c ends here */
- ;;
- *)
- allow_undefined=yes
- ;;
- esac
- compile_command="$nonopt"
- finalize_command="$nonopt"
-
- compile_rpath=
- finalize_rpath=
- compile_shlibpath=
- finalize_shlibpath=
- convenience=
- old_convenience=
- deplibs=
- linkopts=
-
- if test -n "$shlibpath_var"; then
- # get the directories listed in $shlibpath_var
- eval lib_search_path=\`\$echo \"X \${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
- else
- lib_search_path=
- fi
- # now prepend the system-specific ones
- eval lib_search_path=\"$sys_lib_search_path_spec\$lib_search_path\"
- eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
- avoid_version=no
- dlfiles=
- dlprefiles=
- dlself=no
- export_dynamic=no
- export_symbols=
- export_symbols_regex=
- generated=
- libobjs=
- link_against_libtool_libs=
- ltlibs=
- module=no
- objs=
- prefer_static_libs=no
- preload=no
- prev=
- prevarg=
- release=
- rpath=
- xrpath=
- perm_rpath=
- temp_rpath=
- thread_safe=no
- vinfo=
-
- # We need to know -static, to get the right output filenames.
- for arg
- do
- case "$arg" in
- -all-static | -static)
- if test "X$arg" = "X-all-static"; then
- if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
- $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
- fi
- if test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- else
- if test -z "$pic_flag" && test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- fi
- build_libtool_libs=no
- build_old_libs=yes
- prefer_static_libs=yes
- break
- ;;
- esac
- done
-
- # See if our shared archives depend on static archives.
- test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
- # Go through the arguments, transforming them on the way.
- while test $# -gt 0; do
- arg="$1"
- shift
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- case "$prev" in
- output)
- compile_command="$compile_command @OUTPUT@"
- finalize_command="$finalize_command @OUTPUT@"
- ;;
- esac
-
- case "$prev" in
- dlfiles|dlprefiles)
- if test "$preload" = no; then
- # Add the symbol object into the linking commands.
- compile_command="$compile_command @SYMFILE@"
- finalize_command="$finalize_command @SYMFILE@"
- preload=yes
- fi
- case "$arg" in
- *.la | *.lo) ;; # We handle these cases below.
- force)
- if test "$dlself" = no; then
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- self)
- if test "$prev" = dlprefiles; then
- dlself=yes
- elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
- dlself=yes
- else
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- *)
- if test "$prev" = dlfiles; then
- dlfiles="$dlfiles $arg"
- else
- dlprefiles="$dlprefiles $arg"
- fi
- prev=
- ;;
- esac
- ;;
- expsyms)
- export_symbols="$arg"
- if test ! -f "$arg"; then
- $echo "$modename: symbol file \`$arg' does not exist"
- exit 1
- fi
- prev=
- continue
- ;;
- expsyms_regex)
- export_symbols_regex="$arg"
- prev=
- continue
- ;;
- release)
- release="-$arg"
- prev=
- continue
- ;;
- rpath | xrpath)
- # We need an absolute path.
- case "$arg" in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- $echo "$modename: only absolute run-paths are allowed" 1>&2
- exit 1
- ;;
- esac
- if test "$prev" = rpath; then
- case "$rpath " in
- *" $arg "*) ;;
- *) rpath="$rpath $arg" ;;
- esac
- else
- case "$xrpath " in
- *" $arg "*) ;;
- *) xrpath="$xrpath $arg" ;;
- esac
- fi
- prev=
- continue
- ;;
- *)
- eval "$prev=\"\$arg\""
- prev=
- continue
- ;;
- esac
- fi
-
- prevarg="$arg"
-
- case "$arg" in
- -all-static)
- if test -n "$link_static_flag"; then
- compile_command="$compile_command $link_static_flag"
- finalize_command="$finalize_command $link_static_flag"
- fi
- continue
- ;;
-
- -allow-undefined)
- # FIXME: remove this flag sometime in the future.
- $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
- continue
- ;;
-
- -avoid-version)
- avoid_version=yes
- continue
- ;;
-
- -dlopen)
- prev=dlfiles
- continue
- ;;
-
- -dlpreopen)
- prev=dlprefiles
- continue
- ;;
-
- -export-dynamic)
- export_dynamic=yes
- continue
- ;;
-
- -export-symbols | -export-symbols-regex)
- if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
- $echo "$modename: not more than one -exported-symbols argument allowed"
- exit 1
- fi
- if test "X$arg" = "X-export-symbols"; then
- prev=expsyms
- else
- prev=expsyms_regex
- fi
- continue
- ;;
-
- -L*)
- dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
- # We need an absolute path.
- case "$dir" in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- absdir=`cd "$dir" && pwd`
- if test -z "$absdir"; then
- $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
- $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
- absdir="$dir"
- fi
- dir="$absdir"
- ;;
- esac
- case " $deplibs " in
- *" $arg "*) ;;
- *) deplibs="$deplibs $arg";;
- esac
- case " $lib_search_path " in
- *" $dir "*) ;;
- *) lib_search_path="$lib_search_path $dir";;
- esac
- case "$host" in
- *-*-cygwin* | *-*-mingw* | *-*-os2*)
- dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
- case ":$dllsearchpath:" in
- ::) dllsearchpath="$dllsearchdir";;
- *":$dllsearchdir:"*) ;;
- *) dllsearchpath="$dllsearchpath:$dllsearchdir";;
- esac
- ;;
- esac
- ;;
-
- -l*)
- if test "$arg" = "-lc"; then
- case "$host" in
- *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
- # These systems don't actually have c library (as such)
- continue
- ;;
- esac
- elif test "$arg" = "-lm"; then
- case "$host" in
- *-*-cygwin* | *-*-beos*)
- # These systems don't actually have math library (as such)
- continue
- ;;
- esac
- fi
- deplibs="$deplibs $arg"
- ;;
-
- -module)
- module=yes
- continue
- ;;
-
- -no-undefined)
- allow_undefined=no
- continue
- ;;
-
- -o) prev=output ;;
-
- -release)
- prev=release
- continue
- ;;
-
- -rpath)
- prev=rpath
- continue
- ;;
-
- -R)
- prev=xrpath
- continue
- ;;
-
- -R*)
- dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
- # We need an absolute path.
- case "$dir" in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- $echo "$modename: only absolute run-paths are allowed" 1>&2
- exit 1
- ;;
- esac
- case "$xrpath " in
- *" $dir "*) ;;
- *) xrpath="$xrpath $dir" ;;
- esac
- continue
- ;;
-
- -static)
- # If we have no pic_flag, then this is the same as -all-static.
- if test -z "$pic_flag" && test -n "$link_static_flag"; then
- compile_command="$compile_command $link_static_flag"
- finalize_command="$finalize_command $link_static_flag"
- fi
- continue
- ;;
-
- -thread-safe)
- thread_safe=yes
- continue
- ;;
-
- -version-info)
- prev=vinfo
- continue
- ;;
-
- # Some other compiler flag.
- -* | +*)
- # Unknown arguments in both finalize_command and compile_command need
- # to be aesthetically quoted because they are evaled later.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case "$arg" in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- ;;
-
- *.o | *.obj | *.a | *.lib)
- # A standard object.
- objs="$objs $arg"
- ;;
-
- *.lo)
- # A library object.
- if test "$prev" = dlfiles; then
- dlfiles="$dlfiles $arg"
- if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then
- prev=
- continue
- else
- # If libtool objects are unsupported, then we need to preload.
- prev=dlprefiles
- fi
- fi
-
- if test "$prev" = dlprefiles; then
- # Preload the old-style object.
- dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
- prev=
- fi
- libobjs="$libobjs $arg"
- ;;
-
- *.la)
- # A libtool-controlled library.
-
- dlname=
- libdir=
- library_names=
- old_library=
-
- # Check to see that this really is a libtool archive.
- if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
- else
- $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
- exit 1
- fi
-
- # If the library was installed with an old release of libtool,
- # it will not redefine variable installed.
- installed=yes
-
- # Read the .la file
- # If there is no directory component, then add one.
- case "$arg" in
- */* | *\\*) . $arg ;;
- *) . ./$arg ;;
- esac
-
- # Get the name of the library we link against.
- linklib=
- for l in $old_library $library_names; do
- linklib="$l"
- done
-
- if test -z "$linklib"; then
- $echo "$modename: cannot find name of link library for \`$arg'" 1>&2
- exit 1
- fi
-
- # Find the relevant object directory and library name.
- name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'`
-
- if test "X$installed" = Xyes; then
- dir="$libdir"
- else
- dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$dir" = "X$arg"; then
- dir="$objdir"
- else
- dir="$dir/$objdir"
- fi
- fi
-
- if test -n "$dependency_libs"; then
- # Extract -R and -L from dependency_libs
- temp_deplibs=
- for deplib in $dependency_libs; do
- case "$deplib" in
- -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
- case " $rpath $xrpath " in
- *" $temp_xrpath "*) ;;
- *) xrpath="$xrpath $temp_xrpath";;
- esac;;
- -L*) case "$compile_command $temp_deplibs " in
- *" $deplib "*) ;;
- *) temp_deplibs="$temp_deplibs $deplib";;
- esac
- temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'`
- case " $lib_search_path " in
- *" $temp_dir "*) ;;
- *) lib_search_path="$lib_search_path $temp_dir";;
- esac
- ;;
- *) temp_deplibs="$temp_deplibs $deplib";;
- esac
- done
- dependency_libs="$temp_deplibs"
- fi
-
- if test -z "$libdir"; then
- # It is a libtool convenience library, so add in its objects.
- convenience="$convenience $dir/$old_library"
- old_convenience="$old_convenience $dir/$old_library"
- deplibs="$deplibs$dependency_libs"
- compile_command="$compile_command $dir/$old_library$dependency_libs"
- finalize_command="$finalize_command $dir/$old_library$dependency_libs"
- continue
- fi
-
- # This library was specified with -dlopen.
- if test "$prev" = dlfiles; then
- dlfiles="$dlfiles $arg"
- if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then
- # If there is no dlname, no dlopen support or we're linking statically,
- # we need to preload.
- prev=dlprefiles
- else
- # We should not create a dependency on this library, but we
- # may need any libraries it requires.
- compile_command="$compile_command$dependency_libs"
- finalize_command="$finalize_command$dependency_libs"
- prev=
- continue
- fi
- fi
-
- # The library was specified with -dlpreopen.
- if test "$prev" = dlprefiles; then
- # Prefer using a static library (so that no silly _DYNAMIC symbols
- # are required to link).
- if test -n "$old_library"; then
- dlprefiles="$dlprefiles $dir/$old_library"
- else
- dlprefiles="$dlprefiles $dir/$linklib"
- fi
- prev=
- fi
-
- if test -n "$library_names" &&
- { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
- link_against_libtool_libs="$link_against_libtool_libs $arg"
- if test -n "$shlibpath_var"; then
- # Make sure the rpath contains only unique directories.
- case "$temp_rpath " in
- *" $dir "*) ;;
- *) temp_rpath="$temp_rpath $dir" ;;
- esac
- fi
-
- # We need an absolute path.
- case "$dir" in
- [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;;
- *)
- absdir=`cd "$dir" && pwd`
- if test -z "$absdir"; then
- $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
- $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
- absdir="$dir"
- fi
- ;;
- esac
-
- # This is the magic to use -rpath.
- # Skip directories that are in the system default run-time
- # search path, unless they have been requested with -R.
- case " $sys_lib_dlsearch_path " in
- *" $absdir "*) ;;
- *)
- case "$compile_rpath " in
- *" $absdir "*) ;;
- *) compile_rpath="$compile_rpath $absdir"
- esac
- ;;
- esac
-
- case " $sys_lib_dlsearch_path " in
- *" $libdir "*) ;;
- *)
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir"
- esac
- ;;
- esac
-
- lib_linked=yes
- case "$hardcode_action" in
- immediate | unsupported)
- if test "$hardcode_direct" = no; then
- compile_command="$compile_command $dir/$linklib"
- deplibs="$deplibs $dir/$linklib"
- case "$host" in
- *-*-cygwin* | *-*-mingw* | *-*-os2*)
- dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
- if test -n "$dllsearchpath"; then
- dllsearchpath="$dllsearchpath:$dllsearchdir"
- else
- dllsearchpath="$dllsearchdir"
- fi
- ;;
- esac
- elif test "$hardcode_minus_L" = no; then
- case "$host" in
- *-*-sunos*)
- compile_shlibpath="$compile_shlibpath$dir:"
- ;;
- esac
- case "$compile_command " in
- *" -L$dir "*) ;;
- *) compile_command="$compile_command -L$dir";;
- esac
- compile_command="$compile_command -l$name"
- deplibs="$deplibs -L$dir -l$name"
- elif test "$hardcode_shlibpath_var" = no; then
- case ":$compile_shlibpath:" in
- *":$dir:"*) ;;
- *) compile_shlibpath="$compile_shlibpath$dir:";;
- esac
- compile_command="$compile_command -l$name"
- deplibs="$deplibs -l$name"
- else
- lib_linked=no
- fi
- ;;
-
- relink)
- if test "$hardcode_direct" = yes; then
- compile_command="$compile_command $absdir/$linklib"
- deplibs="$deplibs $absdir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- case "$compile_command " in
- *" -L$absdir "*) ;;
- *) compile_command="$compile_command -L$absdir";;
- esac
- compile_command="$compile_command -l$name"
- deplibs="$deplibs -L$absdir -l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- case ":$compile_shlibpath:" in
- *":$absdir:"*) ;;
- *) compile_shlibpath="$compile_shlibpath$absdir:";;
- esac
- compile_command="$compile_command -l$name"
- deplibs="$deplibs -l$name"
- else
- lib_linked=no
- fi
- ;;
-
- *)
- lib_linked=no
- ;;
- esac
-
- if test "$lib_linked" != yes; then
- $echo "$modename: configuration error: unsupported hardcode properties"
- exit 1
- fi
-
- # Finalize command for both is simple: just hardcode it.
- if test "$hardcode_direct" = yes; then
- finalize_command="$finalize_command $libdir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- case "$finalize_command " in
- *" -L$libdir "*) ;;
- *) finalize_command="$finalize_command -L$libdir";;
- esac
- finalize_command="$finalize_command -l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- case ":$finalize_shlibpath:" in
- *":$libdir:"*) ;;
- *) finalize_shlibpath="$finalize_shlibpath$libdir:";;
- esac
- finalize_command="$finalize_command -l$name"
- else
- # We cannot seem to hardcode it, guess we'll fake it.
- case "$finalize_command " in
- *" -L$dir "*) ;;
- *) finalize_command="$finalize_command -L$libdir";;
- esac
- finalize_command="$finalize_command -l$name"
- fi
- else
- # Transform directly to old archives if we don't build new libraries.
- if test -n "$pic_flag" && test -z "$old_library"; then
- $echo "$modename: cannot find static library for \`$arg'" 1>&2
- exit 1
- fi
-
- # Here we assume that one of hardcode_direct or hardcode_minus_L
- # is not unsupported. This is valid on all known static and
- # shared platforms.
- if test "$hardcode_direct" != unsupported; then
- test -n "$old_library" && linklib="$old_library"
- compile_command="$compile_command $dir/$linklib"
- finalize_command="$finalize_command $dir/$linklib"
- else
- case "$compile_command " in
- *" -L$dir "*) ;;
- *) compile_command="$compile_command -L$dir";;
- esac
- compile_command="$compile_command -l$name"
- case "$finalize_command " in
- *" -L$dir "*) ;;
- *) finalize_command="$finalize_command -L$dir";;
- esac
- finalize_command="$finalize_command -l$name"
- fi
- fi
-
- # Add in any libraries that this one depends upon.
- compile_command="$compile_command$dependency_libs"
- finalize_command="$finalize_command$dependency_libs"
- continue
- ;;
-
- # Some other compiler argument.
- *)
- # Unknown arguments in both finalize_command and compile_command need
- # to be aesthetically quoted because they are evaled later.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case "$arg" in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- ;;
- esac
-
- # Now actually substitute the argument into the commands.
- if test -n "$arg"; then
- compile_command="$compile_command $arg"
- finalize_command="$finalize_command $arg"
- fi
- done
-
- if test -n "$prev"; then
- $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
- eval arg=\"$export_dynamic_flag_spec\"
- compile_command="$compile_command $arg"
- finalize_command="$finalize_command $arg"
- fi
-
- oldlibs=
- # calculate the name of the file, without its directory
- outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
- libobjs_save="$libobjs"
-
- case "$output" in
- "")
- $echo "$modename: you must specify an output file" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
-
- *.a | *.lib)
- if test -n "$link_against_libtool_libs"; then
- $echo "$modename: error: cannot link libtool libraries into archives" 1>&2
- exit 1
- fi
-
- if test -n "$deplibs"; then
- $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
- fi
-
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
- fi
-
- if test -n "$rpath"; then
- $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
- fi
-
- if test -n "$xrpath"; then
- $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
- fi
-
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
- fi
-
- if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
- $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
- fi
-
- # Now set the variables for building old libraries.
- build_libtool_libs=no
- oldlibs="$output"
- ;;
-
- *.la)
- # Make sure we only generate libraries of the form `libNAME.la'.
- case "$outputname" in
- lib*)
- name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
- eval libname=\"$libname_spec\"
- ;;
- *)
- if test "$module" = no; then
- $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
- if test "$need_lib_prefix" != no; then
- # Add the "lib" prefix for modules if required
- name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
- eval libname=\"$libname_spec\"
- else
- libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
- fi
- ;;
- esac
-
- output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$output_objdir" = "X$output"; then
- output_objdir="$objdir"
- else
- output_objdir="$output_objdir/$objdir"
- fi
-
- if test -n "$objs"; then
- $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
- exit 1
- fi
-
- # How the heck are we supposed to write a wrapper for a shared library?
- if test -n "$link_against_libtool_libs"; then
- $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2
- exit 1
- fi
-
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2
- fi
-
- set dummy $rpath
- if test $# -gt 2; then
- $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
- fi
- install_libdir="$2"
-
- oldlibs=
- if test -z "$rpath"; then
- if test "$build_libtool_libs" = yes; then
- # Building a libtool convenience library.
- libext=al
- oldlibs="$output_objdir/$libname.$libext $oldlibs"
- build_libtool_libs=convenience
- build_old_libs=yes
- fi
- dependency_libs="$deplibs"
-
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
- fi
- else
-
- # Parse the version information argument.
- IFS="${IFS= }"; save_ifs="$IFS"; IFS=':'
- set dummy $vinfo 0 0 0
- IFS="$save_ifs"
-
- if test -n "$8"; then
- $echo "$modename: too many parameters to \`-version-info'" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- current="$2"
- revision="$3"
- age="$4"
-
- # Check that each of the things are valid numbers.
- case "$current" in
- 0 | [1-9] | [1-9][0-9]*) ;;
- *)
- $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- ;;
- esac
-
- case "$revision" in
- 0 | [1-9] | [1-9][0-9]*) ;;
- *)
- $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- ;;
- esac
-
- case "$age" in
- 0 | [1-9] | [1-9][0-9]*) ;;
- *)
- $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- ;;
- esac
-
- if test $age -gt $current; then
- $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- fi
-
- # Calculate the version variables.
- major=
- versuffix=
- verstring=
- case "$version_type" in
- none) ;;
-
- irix)
- major=`expr $current - $age + 1`
- versuffix="$major.$revision"
- verstring="sgi$major.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$revision
- while test $loop != 0; do
- iface=`expr $revision - $loop`
- loop=`expr $loop - 1`
- verstring="sgi$major.$iface:$verstring"
- done
- ;;
-
- linux)
- major=.`expr $current - $age`
- versuffix="$major.$age.$revision"
- ;;
-
- osf)
- major=`expr $current - $age`
- versuffix=".$current.$age.$revision"
- verstring="$current.$age.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$age
- while test $loop != 0; do
- iface=`expr $current - $loop`
- loop=`expr $loop - 1`
- verstring="$verstring:${iface}.0"
- done
-
- # Make executables depend on our current version.
- verstring="$verstring:${current}.0"
- ;;
-
- sunos)
- major=".$current"
- versuffix=".$current.$revision"
- ;;
-
- freebsd-aout)
- major=".$current"
- versuffix=".$current.$revision";
- ;;
-
- freebsd-elf)
- major=".$current"
- versuffix=".$current";
- ;;
-
- windows)
- # Like Linux, but with '-' rather than '.', since we only
- # want one extension on Windows 95.
- major=`expr $current - $age`
- versuffix="-$major-$age-$revision"
- ;;
-
- *)
- $echo "$modename: unknown library version type \`$version_type'" 1>&2
- echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
- exit 1
- ;;
- esac
-
- # Clear the version info if we defaulted, and they specified a release.
- if test -z "$vinfo" && test -n "$release"; then
- major=
- verstring="0.0"
- if test "$need_version" = no; then
- versuffix=
- else
- versuffix=".0.0"
- fi
- fi
-
- # Remove version info from name if versioning should be avoided
- if test "$avoid_version" = yes && test "$need_version" = no; then
- major=
- versuffix=
- verstring=""
- fi
-
- # Check to see if the archive will have undefined symbols.
- if test "$allow_undefined" = yes; then
- if test "$allow_undefined_flag" = unsupported; then
- $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
- build_libtool_libs=no
- build_old_libs=yes
- fi
- else
- # Don't allow undefined symbols.
- allow_undefined_flag="$no_undefined_flag"
- fi
-
- dependency_libs="$deplibs"
- case "$host" in
- *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
- # these systems don't actually have a c library (as such)!
- ;;
- *)
- # Add libc to deplibs on all other systems.
- deplibs="$deplibs -lc"
- ;;
- esac
- fi
-
- # Create the output directory, or remove our outputs if we need to.
- if test -d $output_objdir; then
- $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
- $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
- else
- $show "$mkdir $output_objdir"
- $run $mkdir $output_objdir
- status=$?
- if test $status -ne 0 && test ! -d $output_objdir; then
- exit $status
- fi
- fi
-
- # Now set the variables for building old libraries.
- if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
- oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
- # Transform .lo files to .o files.
- oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
- fi
-
- if test "$build_libtool_libs" = yes; then
- # Transform deplibs into only deplibs that can be linked in shared.
- name_save=$name
- libname_save=$libname
- release_save=$release
- versuffix_save=$versuffix
- major_save=$major
- # I'm not sure if I'm treating the release correctly. I think
- # release should show up in the -l (ie -lgmp5) so we don't want to
- # add it in twice. Is that correct?
- release=""
- versuffix=""
- major=""
- newdeplibs=
- droppeddeps=no
- case "$deplibs_check_method" in
- pass_all)
- # Don't check for shared/static. Everything works.
- # This might be a little naive. We might want to check
- # whether the library exists or not. But this is on
- # osf3 & osf4 and I'm not really sure... Just
- # implementing what was already the behaviour.
- newdeplibs=$deplibs
- ;;
- test_compile)
- # This code stresses the "libraries are programs" paradigm to its
- # limits. Maybe even breaks it. We compile a program, linking it
- # against the deplibs as a proxy for the library. Then we can check
- # whether they linked in statically or dynamically with ldd.
- $rm conftest.c
- cat > conftest.c <<EOF
- int main() { return 0; }
-EOF
- $rm conftest
- $CC -o conftest conftest.c $deplibs
- if test $? -eq 0 ; then
- ldd_output=`ldd conftest`
- for i in $deplibs; do
- name="`expr $i : '-l\(.*\)'`"
- # If $name is empty we are operating on a -L argument.
- if test "$name" != "" ; then
- libname=`eval \\$echo \"$libname_spec\"`
- deplib_matches=`eval \\$echo \"$library_names_spec\"`
- set dummy $deplib_matches
- deplib_match=$2
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- newdeplibs="$newdeplibs $i"
- else
- droppeddeps=yes
- echo
- echo "*** Warning: This library needs some functionality provided by $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- fi
- else
- newdeplibs="$newdeplibs $i"
- fi
- done
- else
- # Error occured in the first compile. Let's try to salvage the situation:
- # Compile a seperate program for each library.
- for i in $deplibs; do
- name="`expr $i : '-l\(.*\)'`"
- # If $name is empty we are operating on a -L argument.
- if test "$name" != "" ; then
- $rm conftest
- $CC -o conftest conftest.c $i
- # Did it work?
- if test $? -eq 0 ; then
- ldd_output=`ldd conftest`
- libname=`eval \\$echo \"$libname_spec\"`
- deplib_matches=`eval \\$echo \"$library_names_spec\"`
- set dummy $deplib_matches
- deplib_match=$2
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- newdeplibs="$newdeplibs $i"
- else
- droppeddeps=yes
- echo
- echo "*** Warning: This library needs some functionality provided by $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- fi
- else
- droppeddeps=yes
- echo
- echo "*** Warning! Library $i is needed by this library but I was not able to"
- echo "*** make it link in! You will probably need to install it or some"
- echo "*** library that it depends on before this library will be fully"
- echo "*** functional. Installing it before continuing would be even better."
- fi
- else
- newdeplibs="$newdeplibs $i"
- fi
- done
- fi
- ;;
- file_magic*)
- set dummy $deplibs_check_method
- file_magic_regex="`expr \"$deplibs_check_method\" : \"$2 \(.*\)\"`"
- for a_deplib in $deplibs; do
- name="`expr $a_deplib : '-l\(.*\)'`"
- # If $name is empty we are operating on a -L argument.
- if test "$name" != "" ; then
- libname=`eval \\$echo \"$libname_spec\"`
- for i in $lib_search_path; do
- potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
- for potent_lib in $potential_libs; do
- # Follow soft links.
- if ls -lLd "$potent_lib" 2>/dev/null \
- | grep " -> " >/dev/null; then
- continue
- fi
- # The statement above tries to avoid entering an
- # endless loop below, in case of cyclic links.
- # We might still enter an endless loop, since a link
- # loop can be closed while we follow links,
- # but so what?
- potlib="$potent_lib"
- while test -h "$potlib" 2>/dev/null; do
- potliblink=`ls -ld $potlib | sed 's/.* -> //'`
- case "$potliblink" in
- [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
- *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
- esac
- done
- if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
- | sed 10q \
- | egrep "$file_magic_regex" > /dev/null; then
- newdeplibs="$newdeplibs $a_deplib"
- a_deplib=""
- break 2
- fi
- done
- done
- if test -n "$a_deplib" ; then
- droppeddeps=yes
- echo
- echo "*** Warning: This library needs some functionality provided by $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- fi
- else
- # Add a -L argument.
- newdeplibs="$newdeplibs $a_deplib"
- fi
- done # Gone through all deplibs.
- ;;
- none | unknown | *)
- newdeplibs=""
- if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
- -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' |
- grep . >/dev/null; then
- echo
- if test "X$deplibs_check_method" = "Xnone"; then
- echo "*** Warning: inter-library dependencies are not supported in this platform."
- else
- echo "*** Warning: inter-library dependencies are not known to be supported."
- fi
- echo "*** All declared inter-library dependencies are being dropped."
- droppeddeps=yes
- fi
- ;;
- esac
- versuffix=$versuffix_save
- major=$major_save
- release=$release_save
- libname=$libname_save
- name=$name_save
-
- if test "$droppeddeps" = yes; then
- if test "$module" = yes; then
- echo
- echo "*** Warning: libtool could not satisfy all declared inter-library"
- echo "*** dependencies of module $libname. Therefore, libtool will create"
- echo "*** a static module, that should work as long as the dlopening"
- echo "*** application is linked with the -dlopen flag."
- if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
- fi
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- else
- echo "*** The inter-library dependencies that have been dropped here will be"
- echo "*** automatically added whenever a program is linked with this library"
- echo "*** or is declared to -dlopen it."
- fi
- fi
- # Done checking deplibs!
- deplibs=$newdeplibs
- fi
-
- # All the library-specific variables (install_libdir is set above).
- library_names=
- old_library=
- dlname=
-
- # Test again, we may have decided not to build it any more
- if test "$build_libtool_libs" = yes; then
- # Get the real and link names of the library.
- eval library_names=\"$library_names_spec\"
- set dummy $library_names
- realname="$2"
- shift; shift
-
- if test -n "$soname_spec"; then
- eval soname=\"$soname_spec\"
- else
- soname="$realname"
- fi
-
- lib="$output_objdir/$realname"
- for link
- do
- linknames="$linknames $link"
- done
-
- # Ensure that we have .o objects for linkers which dislike .lo
- # (e.g. aix) in case we are running --disable-static
- for obj in $libobjs; do
- xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$obj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
- oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
- if test ! -f $xdir/$oldobj; then
- $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
- $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
- fi
- done
-
- # Use standard objects if they are pic
- test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
- $show "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
- $run $rm $export_symbols
- eval cmds=\"$export_symbols_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- if test -n "$export_symbols_regex"; then
- $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
- $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
- $show "$mv \"${export_symbols}T\" \"$export_symbols\""
- $run eval '$mv "${export_symbols}T" "$export_symbols"'
- fi
- fi
- fi
-
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
- fi
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec"; then
- eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
- else
- gentop="$output_objdir/${outputname}x"
- $show "${rm}r $gentop"
- $run ${rm}r "$gentop"
- $show "mkdir $gentop"
- $run mkdir "$gentop"
- status=$?
- if test $status -ne 0 && test ! -d "$gentop"; then
- exit $status
- fi
- generated="$generated $gentop"
-
- for xlib in $convenience; do
- # Extract the objects.
- case "$xlib" in
- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
- *) xabs=`pwd`"/$xlib" ;;
- esac
- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
- xdir="$gentop/$xlib"
-
- $show "${rm}r $xdir"
- $run ${rm}r "$xdir"
- $show "mkdir $xdir"
- $run mkdir "$xdir"
- status=$?
- if test $status -ne 0 && test ! -d "$xdir"; then
- exit $status
- fi
- $show "(cd $xdir && $AR x $xabs)"
- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
- libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
- done
- fi
- fi
-
- if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
- eval flag=\"$thread_safe_flag_spec\"
- linkopts="$linkopts $flag"
- fi
-
- # Do each of the archive commands.
- if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
- eval cmds=\"$archive_expsym_cmds\"
- else
- eval cmds=\"$archive_cmds\"
- fi
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
-
- # Create links to the real library.
- for linkname in $linknames; do
- if test "$realname" != "$linkname"; then
- $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
- $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
- fi
- done
-
- # If -module or -export-dynamic was specified, set the dlname.
- if test "$module" = yes || test "$export_dynamic" = yes; then
- # On all known operating systems, these are identical.
- dlname="$soname"
- fi
- fi
- ;;
-
- *.lo | *.o | *.obj)
- if test -n "$link_against_libtool_libs"; then
- $echo "$modename: error: cannot link libtool libraries into objects" 1>&2
- exit 1
- fi
-
- if test -n "$deplibs"; then
- $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
- fi
-
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
- fi
-
- if test -n "$rpath"; then
- $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
- fi
-
- if test -n "$xrpath"; then
- $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
- fi
-
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
- fi
-
- case "$output" in
- *.lo)
- if test -n "$objs"; then
- $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
- exit 1
- fi
- libobj="$output"
- obj=`$echo "X$output" | $Xsed -e "$lo2o"`
- ;;
- *)
- libobj=
- obj="$output"
- ;;
- esac
-
- # Delete the old objects.
- $run $rm $obj $libobj
-
- # Objects from convenience libraries. This assumes
- # single-version convenience libraries. Whenever we create
- # different ones for PIC/non-PIC, this we'll have to duplicate
- # the extraction.
- reload_conv_objs=
- gentop=
- # reload_cmds runs $LD directly, so let us get rid of
- # -Wl from whole_archive_flag_spec
- wl=
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec"; then
- eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
- else
- gentop="$output_objdir/${obj}x"
- $show "${rm}r $gentop"
- $run ${rm}r "$gentop"
- $show "mkdir $gentop"
- $run mkdir "$gentop"
- status=$?
- if test $status -ne 0 && test ! -d "$gentop"; then
- exit $status
- fi
- generated="$generated $gentop"
-
- for xlib in $convenience; do
- # Extract the objects.
- case "$xlib" in
- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
- *) xabs=`pwd`"/$xlib" ;;
- esac
- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
- xdir="$gentop/$xlib"
-
- $show "${rm}r $xdir"
- $run ${rm}r "$xdir"
- $show "mkdir $xdir"
- $run mkdir "$xdir"
- status=$?
- if test $status -ne 0 && test ! -d "$xdir"; then
- exit $status
- fi
- $show "(cd $xdir && $AR x $xabs)"
- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
- reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
- done
- fi
- fi
-
- # Create the old-style object.
- reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs"
-
- output="$obj"
- eval cmds=\"$reload_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
-
- # Exit if we aren't doing a library object file.
- if test -z "$libobj"; then
- if test -n "$gentop"; then
- $show "${rm}r $gentop"
- $run ${rm}r $gentop
- fi
-
- exit 0
- fi
-
- if test "$build_libtool_libs" != yes; then
- if test -n "$gentop"; then
- $show "${rm}r $gentop"
- $run ${rm}r $gentop
- fi
-
- # Create an invalid libtool object if no PIC, so that we don't
- # accidentally link it into a program.
- $show "echo timestamp > $libobj"
- $run eval "echo timestamp > $libobj" || exit $?
- exit 0
- fi
-
- if test -n "$pic_flag"; then
- # Only do commands if we really have different PIC objects.
- reload_objs="$libobjs $reload_conv_objs"
- output="$libobj"
- eval cmds=\"$reload_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- else
- # Just create a symlink.
- $show $rm $libobj
- $run $rm $libobj
- xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$libobj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
- oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
- $show "(cd $xdir && $LN_S $oldobj $baseobj)"
- $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
- fi
-
- if test -n "$gentop"; then
- $show "${rm}r $gentop"
- $run ${rm}r $gentop
- fi
-
- exit 0
- ;;
-
- # Anything else should be a program.
- *)
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
- fi
-
- if test "$preload" = yes; then
- if test "$dlopen" = unknown && test "$dlopen_self" = unknown &&
- test "$dlopen_self_static" = unknown; then
- $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
- fi
- fi
-
- if test -n "$rpath$xrpath"; then
- # If the user specified any rpath flags, then add them.
- for libdir in $rpath $xrpath; do
- # This is the magic to use -rpath.
- case "$compile_rpath " in
- *" $libdir "*) ;;
- *) compile_rpath="$compile_rpath $libdir" ;;
- esac
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir" ;;
- esac
- done
- fi
-
- # Now hardcode the library paths
- rpath=
- hardcode_libdirs=
- for libdir in $compile_rpath $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- rpath="$rpath $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$perm_rpath " in
- *" $libdir "*) ;;
- *) perm_rpath="$perm_rpath $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- compile_rpath="$rpath"
-
- rpath=
- hardcode_libdirs=
- for libdir in $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- rpath="$rpath $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$finalize_perm_rpath " in
- *" $libdir "*) ;;
- *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- finalize_rpath="$rpath"
-
- output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$output_objdir" = "X$output"; then
- output_objdir="$objdir"
- else
- output_objdir="$output_objdir/$objdir"
- fi
-
- # Create the binary in the object directory, then wrap it.
- if test ! -d $output_objdir; then
- $show "$mkdir $output_objdir"
- $run $mkdir $output_objdir
- status=$?
- if test $status -ne 0 && test ! -d $output_objdir; then
- exit $status
- fi
- fi
-
- if test -n "$libobjs" && test "$build_old_libs" = yes; then
- # Transform all the library objects into standard objects.
- compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
- finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
- fi
-
- dlsyms=
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- if test -n "$NM" && test -n "$global_symbol_pipe"; then
- dlsyms="${outputname}S.c"
- else
- $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
- fi
- fi
-
- if test -n "$dlsyms"; then
- case "$dlsyms" in
- "") ;;
- *.c)
- # Discover the nlist of each of the dlfiles.
- nlist="$output_objdir/${outputname}.nm"
-
- $show "$rm $nlist ${nlist}S ${nlist}T"
- $run $rm "$nlist" "${nlist}S" "${nlist}T"
-
- # Parse the name list into a source file.
- $show "creating $output_objdir/$dlsyms"
-
- test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
-/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
-/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-/* Prevent the only kind of declaration conflicts we can make. */
-#define lt_preloaded_symbols some_other_symbol
-
-/* External symbol declarations for the compiler. */\
-"
-
- if test "$dlself" = yes; then
- $show "generating symbol list for \`$output'"
-
- test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
-
- # Add our own program objects to the symbol list.
- progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
- for arg in $progfiles; do
- $show "extracting global C symbols from \`$arg'"
- $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
- done
-
- if test -n "$exclude_expsyms"; then
- $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
- $run eval '$mv "$nlist"T "$nlist"'
- fi
-
- if test -n "$export_symbols_regex"; then
- $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
- $run eval '$mv "$nlist"T "$nlist"'
- fi
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- export_symbols="$output_objdir/$output.exp"
- $run $rm $export_symbols
- $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
- else
- $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
- $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
- $run eval 'mv "$nlist"T "$nlist"'
- fi
- fi
-
- for arg in $dlprefiles; do
- $show "extracting global C symbols from \`$arg'"
- name=`echo "$arg" | sed -e 's%^.*/%%'`
- $run eval 'echo ": $name " >> "$nlist"'
- $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
- done
-
- if test -z "$run"; then
- # Make sure we have at least an empty file.
- test -f "$nlist" || : > "$nlist"
-
- if test -n "$exclude_expsyms"; then
- egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
- $mv "$nlist"T "$nlist"
- fi
-
- # Try sorting and uniquifying the output.
- if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then
- :
- else
- grep -v "^: " < "$nlist" > "$nlist"S
- fi
-
- if test -f "$nlist"S; then
- eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
- else
- echo '/* NONE */' >> "$output_objdir/$dlsyms"
- fi
-
- $echo >> "$output_objdir/$dlsyms" "\
-
-#undef lt_preloaded_symbols
-
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
- const char *name;
- lt_ptr_t address;
-}
-lt_preloaded_symbols[] =
-{\
-"
-
- sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \
- -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \
- < "$nlist" >> "$output_objdir/$dlsyms"
-
- $echo >> "$output_objdir/$dlsyms" "\
- {0, (lt_ptr_t) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
- fi
-
- pic_flag_for_symtable=
- case "$host" in
- # compiling the symbol table file with pic_flag works around
- # a FreeBSD bug that causes programs to crash when -lm is
- # linked before any other PIC object. But we must not use
- # pic_flag when linking with -static. The problem exists in
- # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
- *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
- case "$compile_command " in
- *" -static "*) ;;
- *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
- esac;;
- *-*-hpux*)
- case "$compile_command " in
- *" -static "*) ;;
- *) pic_flag_for_symtable=" $pic_flag -DPIC";;
- esac
- esac
-
- # Now compile the dynamic symbol file.
- $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
- $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
-
- # Clean up the generated files.
- $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
- $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
-
- # Transform the symbol file into the correct name.
- compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
- finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
- ;;
- *)
- $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
- exit 1
- ;;
- esac
- else
- # We keep going just in case the user didn't refer to
- # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
- # really was required.
-
- # Nullify the symbol file.
- compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
- finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
- fi
-
- if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then
- # Replace the output file specification.
- compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
- link_command="$compile_command$compile_rpath"
-
- # We have no uninstalled library dependencies, so finalize right now.
- $show "$link_command"
- $run eval "$link_command"
- status=$?
-
- # Delete the generated files.
- if test -n "$dlsyms"; then
- $show "$rm $output_objdir/${outputname}S.${objext}"
- $run $rm "$output_objdir/${outputname}S.${objext}"
- fi
-
- exit $status
- fi
-
- if test -n "$shlibpath_var"; then
- # We should set the shlibpath_var
- rpath=
- for dir in $temp_rpath; do
- case "$dir" in
- [\\/]* | [A-Za-z]:[\\/]*)
- # Absolute path.
- rpath="$rpath$dir:"
- ;;
- *)
- # Relative path: add a thisdir entry.
- rpath="$rpath\$thisdir/$dir:"
- ;;
- esac
- done
- temp_rpath="$rpath"
- fi
-
- if test -n "$compile_shlibpath$finalize_shlibpath"; then
- compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
- fi
- if test -n "$finalize_shlibpath"; then
- finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
- fi
-
- compile_var=
- finalize_var=
- if test -n "$runpath_var"; then
- if test -n "$perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $perm_rpath; do
- rpath="$rpath$dir:"
- done
- compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- if test -n "$finalize_perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $finalize_perm_rpath; do
- rpath="$rpath$dir:"
- done
- finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- fi
-
- if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
-
- $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
- $echo "$modename: \`$output' will be relinked during installation" 1>&2
- else
- if test "$fast_install" != no; then
- link_command="$finalize_var$compile_command$finalize_rpath"
- if test "$fast_install" = yes; then
- relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
- else
- # fast_install is set to needless
- relink_command=
- fi
- else
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
- fi
- fi
-
- # Replace the output file specification.
- link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
- # Delete the old output files.
- $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
- $show "$link_command"
- $run eval "$link_command" || exit $?
-
- # Now create the wrapper script.
- $show "creating $output"
-
- # Quote the relink command for shipping.
- if test -n "$relink_command"; then
- relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
- fi
-
- # Quote $echo for shipping.
- if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
- case "$0" in
- [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
- *) qecho="$SHELL `pwd`/$0 --fallback-echo";;
- esac
- qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
- else
- qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
- fi
-
- # Only actually do things if our run command is non-null.
- if test -z "$run"; then
- # win32 will think the script is a binary if it has
- # a .exe suffix, so we strip it off here.
- case $output in
- *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
- esac
- $rm $output
- trap "$rm $output; exit 1" 1 2 15
-
- $echo > $output "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
- # install mode needs the following variable:
- link_against_libtool_libs='$link_against_libtool_libs'
-else
- # When we are sourced in execute mode, \$file and \$echo are already set.
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- echo=\"$qecho\"
- file=\"\$0\"
- # Make sure echo works.
- if test \"X\$1\" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
- elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
- # Yippee, \$echo works!
- :
- else
- # Restart under the correct shell, and then maybe \$echo will work.
- exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
- fi
- fi\
-"
- $echo >> $output "\
-
- # Find the directory that this script lives in.
- thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
- test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
- # Follow symbolic links until we get to the real thisdir.
- file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
- while test -n \"\$file\"; do
- destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
-
- # If there was a directory component, then change thisdir.
- if test \"x\$destdir\" != \"x\$file\"; then
- case \"\$destdir\" in
- [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;;
- *) thisdir=\"\$thisdir/\$destdir\" ;;
- esac
- fi
-
- file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
- file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
- done
-
- # Try to get the absolute directory name.
- absdir=\`cd \"\$thisdir\" && pwd\`
- test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
- if test "$fast_install" = yes; then
- echo >> $output "\
- program=lt-'$outputname'
- progdir=\"\$thisdir/$objdir\"
-
- if test ! -f \"\$progdir/\$program\" || \\
- { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
- test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
- file=\"\$\$-\$program\"
-
- if test ! -d \"\$progdir\"; then
- $mkdir \"\$progdir\"
- else
- $rm \"\$progdir/\$file\"
- fi"
-
- echo >> $output "\
-
- # relink executable if necessary
- if test -n \"\$relink_command\"; then
- if (cd \"\$thisdir\" && eval \$relink_command); then :
- else
- $rm \"\$progdir/\$file\"
- exit 1
- fi
- fi
-
- $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
- { $rm \"\$progdir/\$program\";
- $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
- $rm \"\$progdir/\$file\"
- fi"
- else
- echo >> $output "\
- program='$outputname'
- progdir=\"\$thisdir/$objdir\"
-"
- fi
-
- echo >> $output "\
-
- if test -f \"\$progdir/\$program\"; then"
-
- # Export our shlibpath_var if we have one.
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
- $echo >> $output "\
- # Add our own library path to $shlibpath_var
- $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
- # Some systems cannot cope with colon-terminated $shlibpath_var
- # The second colon is a workaround for a bug in BeOS R4 sed
- $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
-
- export $shlibpath_var
-"
- fi
-
- # fixup the dll searchpath if we need to.
- if test -n "$dllsearchpath"; then
- $echo >> $output "\
- # Add the dll search path components to the executable PATH
- PATH=$dllsearchpath:\$PATH
-"
- fi
-
- $echo >> $output "\
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- # Run the actual program with our arguments.
-"
- case $host in
- *-*-cygwin* | *-*-mingw | *-*-os2*)
- # win32 systems need to use the prog path for dll
- # lookup to work
- $echo >> $output "\
- exec \$progdir\\\\\$program \${1+\"\$@\"}
-"
- ;;
- *)
- $echo >> $output "\
- # Export the path to the program.
- PATH=\"\$progdir:\$PATH\"
- export PATH
-
- exec \$program \${1+\"\$@\"}
-"
- ;;
- esac
- $echo >> $output "\
- \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
- exit 1
- fi
- else
- # The program doesn't exist.
- \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
- \$echo \"This script is just a wrapper for \$program.\" 1>&2
- echo \"See the $PACKAGE documentation for more information.\" 1>&2
- exit 1
- fi
-fi\
-"
- chmod +x $output
- fi
- exit 0
- ;;
- esac
-
- # See if we need to build an old-fashioned archive.
- for oldlib in $oldlibs; do
-
- if test "$build_libtool_libs" = convenience; then
- oldobjs="$libobjs_save"
- addlibs="$convenience"
- build_libtool_libs=no
- else
- if test "$build_libtool_libs" = module; then
- oldobjs="$libobjs_save"
- build_libtool_libs=no
- else
- oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
- fi
- addlibs="$old_convenience"
- fi
-
- if test -n "$addlibs"; then
- gentop="$output_objdir/${outputname}x"
- $show "${rm}r $gentop"
- $run ${rm}r "$gentop"
- $show "mkdir $gentop"
- $run mkdir "$gentop"
- status=$?
- if test $status -ne 0 && test ! -d "$gentop"; then
- exit $status
- fi
- generated="$generated $gentop"
-
- # Add in members from convenience archives.
- for xlib in $addlibs; do
- # Extract the objects.
- case "$xlib" in
- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
- *) xabs=`pwd`"/$xlib" ;;
- esac
- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
- xdir="$gentop/$xlib"
-
- $show "${rm}r $xdir"
- $run ${rm}r "$xdir"
- $show "mkdir $xdir"
- $run mkdir "$xdir"
- status=$?
- if test $status -ne 0 && test ! -d "$xdir"; then
- exit $status
- fi
- $show "(cd $xdir && $AR x $xabs)"
- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
- oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
- done
- fi
-
- # Do each command in the archive commands.
- if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
- eval cmds=\"$old_archive_from_new_cmds\"
- else
- # Ensure that we have .o objects in place in case we decided
- # not to build a shared library, and have fallen back to building
- # static libs even though --disable-static was passed!
- for oldobj in $oldobjs; do
- if test ! -f $oldobj; then
- xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$oldobj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
- obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
- $show "(cd $xdir && ${LN_S} $obj $baseobj)"
- $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
- fi
- done
-
- eval cmds=\"$old_archive_cmds\"
- fi
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- done
-
- if test -n "$generated"; then
- $show "${rm}r$generated"
- $run ${rm}r$generated
- fi
-
- # Now create the libtool archive.
- case "$output" in
- *.la)
- old_library=
- test "$build_old_libs" = yes && old_library="$libname.$libext"
- $show "creating $output"
-
- if test -n "$xrpath"; then
- temp_xrpath=
- for libdir in $xrpath; do
- temp_xrpath="$temp_xrpath -R$libdir"
- done
- dependency_libs="$temp_xrpath $dependency_libs"
- fi
-
- # Only create the output if not a dry run.
- if test -z "$run"; then
- for installed in no yes; do
- if test "$installed" = yes; then
- if test -z "$install_libdir"; then
- break
- fi
- output="$output_objdir/$outputname"i
- fi
- $rm $output
- $echo > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$dlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'\
-"
- done
- fi
-
- # Do a symbolic link so that the libtool archive can be found in
- # LD_LIBRARY_PATH before the program is installed.
- $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
- $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $?
- ;;
- esac
- exit 0
- ;;
-
- # libtool install mode
- install)
- modename="$modename: install"
-
- # There may be an optional sh(1) argument at the beginning of
- # install_prog (especially on Windows NT).
- if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then
- # Aesthetically quote it.
- arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
- case "$arg" in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- install_prog="$arg "
- arg="$1"
- shift
- else
- install_prog=
- arg="$nonopt"
- fi
-
- # The real first argument should be the name of the installation program.
- # Aesthetically quote it.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case "$arg" in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- install_prog="$install_prog$arg"
-
- # We need to accept at least all the BSD install flags.
- dest=
- files=
- opts=
- prev=
- install_type=
- isdir=no
- stripme=
- for arg
- do
- if test -n "$dest"; then
- files="$files $dest"
- dest="$arg"
- continue
- fi
-
- case "$arg" in
- -d) isdir=yes ;;
- -f) prev="-f" ;;
- -g) prev="-g" ;;
- -m) prev="-m" ;;
- -o) prev="-o" ;;
- -s)
- stripme=" -s"
- continue
- ;;
- -*) ;;
-
- *)
- # If the previous option needed an argument, then skip it.
- if test -n "$prev"; then
- prev=
- else
- dest="$arg"
- continue
- fi
- ;;
- esac
-
- # Aesthetically quote the argument.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case "$arg" in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- install_prog="$install_prog $arg"
- done
-
- if test -z "$install_prog"; then
- $echo "$modename: you must specify an install program" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- if test -n "$prev"; then
- $echo "$modename: the \`$prev' option requires an argument" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- if test -z "$files"; then
- if test -z "$dest"; then
- $echo "$modename: no file or destination specified" 1>&2
- else
- $echo "$modename: you must specify a destination" 1>&2
- fi
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Strip any trailing slash from the destination.
- dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
-
- # Check to see that the destination is a directory.
- test -d "$dest" && isdir=yes
- if test "$isdir" = yes; then
- destdir="$dest"
- destname=
- else
- destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
- test "X$destdir" = "X$dest" && destdir=.
- destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
-
- # Not a directory, so check to see that there is only one file specified.
- set dummy $files
- if test $# -gt 2; then
- $echo "$modename: \`$dest' is not a directory" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
- fi
- case "$destdir" in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- for file in $files; do
- case "$file" in
- *.lo) ;;
- *)
- $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
- esac
- done
- ;;
- esac
-
- # This variable tells wrapper scripts just to set variables rather
- # than running their programs.
- libtool_install_magic="$magic"
-
- staticlibs=
- future_libdirs=
- current_libdirs=
- for file in $files; do
-
- # Do each installation.
- case "$file" in
- *.a | *.lib)
- # Do the static libraries later.
- staticlibs="$staticlibs $file"
- ;;
-
- *.la)
- # Check to see that this really is a libtool archive.
- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
- else
- $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- library_names=
- old_library=
- # If there is no directory component, then add one.
- case "$file" in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Add the libdir to current_libdirs if it is the destination.
- if test "X$destdir" = "X$libdir"; then
- case "$current_libdirs " in
- *" $libdir "*) ;;
- *) current_libdirs="$current_libdirs $libdir" ;;
- esac
- else
- # Note the libdir as a future libdir.
- case "$future_libdirs " in
- *" $libdir "*) ;;
- *) future_libdirs="$future_libdirs $libdir" ;;
- esac
- fi
-
- dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/"
- test "X$dir" = "X$file/" && dir=
- dir="$dir$objdir"
-
- # See the names of the shared library.
- set dummy $library_names
- if test -n "$2"; then
- realname="$2"
- shift
- shift
-
- # Install the shared library and build the symlinks.
- $show "$install_prog $dir/$realname $destdir/$realname"
- $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $?
-
- if test $# -gt 0; then
- # Delete the old symlinks, and create new ones.
- for linkname
- do
- if test "$linkname" != "$realname"; then
- $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
- $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
- fi
- done
- fi
-
- # Do each command in the postinstall commands.
- lib="$destdir/$realname"
- eval cmds=\"$postinstall_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- fi
-
- # Install the pseudo-library for information purposes.
- name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- instname="$dir/$name"i
- $show "$install_prog $instname $destdir/$name"
- $run eval "$install_prog $instname $destdir/$name" || exit $?
-
- # Maybe install the static library, too.
- test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
- ;;
-
- *.lo)
- # Install (i.e. copy) a libtool object.
-
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- destfile="$destdir/$destfile"
- fi
-
- # Deduce the name of the destination old-style object file.
- case "$destfile" in
- *.lo)
- staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
- ;;
- *.o | *.obj)
- staticdest="$destfile"
- destfile=
- ;;
- *)
- $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
- esac
-
- # Install the libtool object if requested.
- if test -n "$destfile"; then
- $show "$install_prog $file $destfile"
- $run eval "$install_prog $file $destfile" || exit $?
- fi
-
- # Install the old object if enabled.
- if test "$build_old_libs" = yes; then
- # Deduce the name of the old-style object file.
- staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
-
- $show "$install_prog $staticobj $staticdest"
- $run eval "$install_prog \$staticobj \$staticdest" || exit $?
- fi
- exit 0
- ;;
-
- *)
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- destfile="$destdir/$destfile"
- fi
-
- # Do a test to see if this is really a libtool program.
- if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- link_against_libtool_libs=
- relink_command=
-
- # If there is no directory component, then add one.
- case "$file" in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Check the variables that should have been set.
- if test -z "$link_against_libtool_libs"; then
- $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
- exit 1
- fi
-
- finalize=yes
- for lib in $link_against_libtool_libs; do
- # Check to see that each library is installed.
- libdir=
- if test -f "$lib"; then
- # If there is no directory component, then add one.
- case "$lib" in
- */* | *\\*) . $lib ;;
- *) . ./$lib ;;
- esac
- fi
- libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`"
- if test -n "$libdir" && test ! -f "$libfile"; then
- $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
- finalize=no
- fi
- done
-
- outputname=
- if test "$fast_install" = no && test -n "$relink_command"; then
- if test "$finalize" = yes && test -z "$run"; then
- tmpdir="/tmp"
- test -n "$TMPDIR" && tmpdir="$TMPDIR"
- tmpdir="$tmpdir/libtool-$$"
- if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
- else
- $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
- continue
- fi
- outputname="$tmpdir/$file"
- # Replace the output file specification.
- relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
- $show "$relink_command"
- if $run eval "$relink_command"; then :
- else
- $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
- ${rm}r "$tmpdir"
- continue
- fi
- file="$outputname"
- else
- $echo "$modename: warning: cannot relink \`$file'" 1>&2
- fi
- else
- # Install the binary that we compiled earlier.
- file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
- fi
- fi
-
- $show "$install_prog$stripme $file $destfile"
- $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
- test -n "$outputname" && ${rm}r "$tmpdir"
- ;;
- esac
- done
-
- for file in $staticlibs; do
- name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
- # Set up the ranlib parameters.
- oldlib="$destdir/$name"
-
- $show "$install_prog $file $oldlib"
- $run eval "$install_prog \$file \$oldlib" || exit $?
-
- # Do each command in the postinstall commands.
- eval cmds=\"$old_postinstall_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- done
-
- if test -n "$future_libdirs"; then
- $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
- fi
-
- if test -n "$current_libdirs"; then
- # Maybe just do a dry run.
- test -n "$run" && current_libdirs=" -n$current_libdirs"
- exec $SHELL $0 --finish$current_libdirs
- exit 1
- fi
-
- exit 0
- ;;
-
- # libtool finish mode
- finish)
- modename="$modename: finish"
- libdirs="$nonopt"
- admincmds=
-
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
- for dir
- do
- libdirs="$libdirs $dir"
- done
-
- for libdir in $libdirs; do
- if test -n "$finish_cmds"; then
- # Do each command in the finish commands.
- eval cmds=\"$finish_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || admincmds="$admincmds
- $cmd"
- done
- IFS="$save_ifs"
- fi
- if test -n "$finish_eval"; then
- # Do the single finish_eval.
- eval cmds=\"$finish_eval\"
- $run eval "$cmds" || admincmds="$admincmds
- $cmds"
- fi
- done
- fi
-
- # Exit here if they wanted silent mode.
- test "$show" = : && exit 0
-
- echo "----------------------------------------------------------------------"
- echo "Libraries have been installed in:"
- for libdir in $libdirs; do
- echo " $libdir"
- done
- echo
- echo "If you ever happen to want to link against installed libraries"
- echo "in a given directory, LIBDIR, you must either use libtool, and"
- echo "specify the full pathname of the library, or use \`-LLIBDIR'"
- echo "flag during linking and do at least one of the following:"
- if test -n "$shlibpath_var"; then
- echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
- echo " during execution"
- fi
- if test -n "$runpath_var"; then
- echo " - add LIBDIR to the \`$runpath_var' environment variable"
- echo " during linking"
- fi
- if test -n "$hardcode_libdir_flag_spec"; then
- libdir=LIBDIR
- eval flag=\"$hardcode_libdir_flag_spec\"
-
- echo " - use the \`$flag' linker flag"
- fi
- if test -n "$admincmds"; then
- echo " - have your system administrator run these commands:$admincmds"
- fi
- if test -f /etc/ld.so.conf; then
- echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
- fi
- echo
- echo "See any operating system documentation about shared libraries for"
- echo "more information, such as the ld(1) and ld.so(8) manual pages."
- echo "----------------------------------------------------------------------"
- exit 0
- ;;
-
- # libtool execute mode
- execute)
- modename="$modename: execute"
-
- # The first argument is the command name.
- cmd="$nonopt"
- if test -z "$cmd"; then
- $echo "$modename: you must specify a COMMAND" 1>&2
- $echo "$help"
- exit 1
- fi
-
- # Handle -dlopen flags immediately.
- for file in $execute_dlfiles; do
- if test ! -f "$file"; then
- $echo "$modename: \`$file' is not a file" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- dir=
- case "$file" in
- *.la)
- # Check to see that this really is a libtool archive.
- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
- else
- $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Read the libtool library.
- dlname=
- library_names=
-
- # If there is no directory component, then add one.
- case "$file" in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Skip this library if it cannot be dlopened.
- if test -z "$dlname"; then
- # Warn if it was a shared library.
- test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
- continue
- fi
-
- dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
- test "X$dir" = "X$file" && dir=.
-
- if test -f "$dir/$objdir/$dlname"; then
- dir="$dir/$objdir"
- else
- $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
- exit 1
- fi
- ;;
-
- *.lo)
- # Just add the directory containing the .lo file.
- dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
- test "X$dir" = "X$file" && dir=.
- ;;
-
- *)
- $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
- continue
- ;;
- esac
-
- # Get the absolute pathname.
- absdir=`cd "$dir" && pwd`
- test -n "$absdir" && dir="$absdir"
-
- # Now add the directory to shlibpath_var.
- if eval "test -z \"\$$shlibpath_var\""; then
- eval "$shlibpath_var=\"\$dir\""
- else
- eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
- fi
- done
-
- # This variable tells wrapper scripts just to set shlibpath_var
- # rather than running their programs.
- libtool_execute_magic="$magic"
-
- # Check if any of the arguments is a wrapper script.
- args=
- for file
- do
- case "$file" in
- -*) ;;
- *)
- # Do a test to see if this is really a libtool program.
- if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- # If there is no directory component, then add one.
- case "$file" in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Transform arg to wrapped name.
- file="$progdir/$program"
- fi
- ;;
- esac
- # Quote arguments (to preserve shell metacharacters).
- file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
- args="$args \"$file\""
- done
-
- if test -z "$run"; then
- if test -n "$shlibpath_var"; then
- # Export the shlibpath_var.
- eval "export $shlibpath_var"
- fi
-
- # Restore saved enviroment variables
- if test "${save_LC_ALL+set}" = set; then
- LC_ALL="$save_LC_ALL"; export LC_ALL
- fi
- if test "${save_LANG+set}" = set; then
- LANG="$save_LANG"; export LANG
- fi
-
- # Now actually exec the command.
- eval "exec \$cmd$args"
-
- $echo "$modename: cannot exec \$cmd$args"
- exit 1
- else
- # Display what would be done.
- if test -n "$shlibpath_var"; then
- eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
- $echo "export $shlibpath_var"
- fi
- $echo "$cmd$args"
- exit 0
- fi
- ;;
-
- # libtool uninstall mode
- uninstall)
- modename="$modename: uninstall"
- rm="$nonopt"
- files=
-
- for arg
- do
- case "$arg" in
- -*) rm="$rm $arg" ;;
- *) files="$files $arg" ;;
- esac
- done
-
- if test -z "$rm"; then
- $echo "$modename: you must specify an RM program" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- for file in $files; do
- dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
- test "X$dir" = "X$file" && dir=.
- name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
- rmfiles="$file"
-
- case "$name" in
- *.la)
- # Possibly a libtool archive, so verify it.
- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- . $dir/$name
-
- # Delete the libtool libraries and symlinks.
- for n in $library_names; do
- rmfiles="$rmfiles $dir/$n"
- done
- test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library"
-
- $show "$rm $rmfiles"
- $run $rm $rmfiles
-
- if test -n "$library_names"; then
- # Do each command in the postuninstall commands.
- eval cmds=\"$postuninstall_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd"
- done
- IFS="$save_ifs"
- fi
-
- if test -n "$old_library"; then
- # Do each command in the old_postuninstall commands.
- eval cmds=\"$old_postuninstall_cmds\"
- IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd"
- done
- IFS="$save_ifs"
- fi
-
- # FIXME: should reinstall the best remaining shared library.
- fi
- ;;
-
- *.lo)
- if test "$build_old_libs" = yes; then
- oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
- rmfiles="$rmfiles $dir/$oldobj"
- fi
- $show "$rm $rmfiles"
- $run $rm $rmfiles
- ;;
-
- *)
- $show "$rm $rmfiles"
- $run $rm $rmfiles
- ;;
- esac
- done
- exit 0
- ;;
-
- "")
- $echo "$modename: you must specify a MODE" 1>&2
- $echo "$generic_help" 1>&2
- exit 1
- ;;
- esac
-
- $echo "$modename: invalid operation mode \`$mode'" 1>&2
- $echo "$generic_help" 1>&2
- exit 1
-fi # test -z "$show_help"
-
-# We need to display help for each of the modes.
-case "$mode" in
-"") $echo \
-"Usage: $modename [OPTION]... [MODE-ARG]...
-
-Provide generalized library-building support services.
-
- --config show all configuration variables
- --debug enable verbose shell tracing
--n, --dry-run display commands without modifying any files
- --features display basic configuration information and exit
- --finish same as \`--mode=finish'
- --help display this help message and exit
- --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
- --quiet same as \`--silent'
- --silent don't print informational messages
- --version print version information
-
-MODE must be one of the following:
-
- compile compile a source file into a libtool object
- execute automatically set library path, then run a program
- finish complete the installation of libtool libraries
- install install libraries or executables
- link create a library or an executable
- uninstall remove libraries from an installed directory
-
-MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
-a more detailed description of MODE."
- exit 0
- ;;
-
-compile)
- $echo \
-"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
- -o OUTPUT-FILE set the output file name to OUTPUT-FILE
- -static always build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
- ;;
-
-execute)
- $echo \
-"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
- -dlopen FILE add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
- ;;
-
-finish)
- $echo \
-"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges. Use
-the \`--dry-run' option if you just want to see what would be executed."
- ;;
-
-install)
- $echo \
-"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command. The first component should be
-either the \`install' or \`cp' program.
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
- ;;
-
-link)
- $echo \
-"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
- -all-static do not do any dynamic linking at all
- -avoid-version do not add a version suffix if possible
- -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
- -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
- -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
- -export-symbols SYMFILE
- try to export only the symbols listed in SYMFILE
- -export-symbols-regex REGEX
- try to export only the symbols matching REGEX
- -LLIBDIR search LIBDIR for required installed libraries
- -lNAME OUTPUT-FILE requires the installed library libNAME
- -module build a library that can dlopened
- -no-undefined declare that a library does not refer to external symbols
- -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
- -release RELEASE specify package release information
- -rpath LIBDIR the created library will eventually be installed in LIBDIR
- -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
- -static do not do any dynamic linking of libtool libraries
- -version-info CURRENT[:REVISION[:AGE]]
- specify library version info [each variable defaults to 0]
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename. Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
- ;;
-
-uninstall)
- $echo \
-"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
- ;;
-
-*)
- $echo "$modename: invalid operation mode \`$mode'" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
-esac
-
-echo
-$echo "Try \`$modename --help' for more information about other modes."
-
-exit 0
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/*
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
- Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-
-See the file Tech.Notes for some information on the internals.
-*/
-
-
-/* This file is compiled on its own as part of the PCRE library. However,
-it is also included in the compilation of dftables.c, in which case the macro
-DFTABLES is defined. */
-
-#ifndef DFTABLES
-#include "internal.h"
-#endif
-
-
-
-/*************************************************
-* Create PCRE character tables *
-*************************************************/
-
-/* This function builds a set of character tables for use by PCRE and returns
-a pointer to them. They are build using the ctype functions, and consequently
-their contents will depend upon the current locale setting. When compiled as
-part of the library, the store is obtained via pcre_malloc(), but when compiled
-inside dftables, use malloc().
-
-Arguments: none
-Returns: pointer to the contiguous block of data
-*/
-
-unsigned const char *
-pcre_maketables(void)
-{
-unsigned char *yield, *p;
-int i;
-
-#ifndef DFTABLES
-yield = (unsigned char*)(pcre_malloc)(tables_length);
-#else
-yield = (unsigned char*)malloc(tables_length);
-#endif
-
-if (yield == NULL) return NULL;
-p = yield;
-
-/* First comes the lower casing table */
-
-for (i = 0; i < 256; i++) *p++ = tolower(i);
-
-/* Next the case-flipping table */
-
-for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
-
-/* Then the character class tables. Don't try to be clever and save effort
-on exclusive ones - in some locales things may be different. */
-
-memset(p, 0, cbit_length);
-for (i = 0; i < 256; i++)
- {
- if (isdigit(i))
- {
- p[cbit_digit + i/8] |= 1 << (i&7);
- p[cbit_word + i/8] |= 1 << (i&7);
- }
- if (isupper(i))
- {
- p[cbit_upper + i/8] |= 1 << (i&7);
- p[cbit_word + i/8] |= 1 << (i&7);
- }
- if (islower(i))
- {
- p[cbit_lower + i/8] |= 1 << (i&7);
- p[cbit_word + i/8] |= 1 << (i&7);
- }
- if (i == '_') p[cbit_word + i/8] |= 1 << (i&7);
- if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7);
- if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
- if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7);
- if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7);
- if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7);
- if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7);
- }
-p += cbit_length;
-
-/* Finally, the character type table */
-
-for (i = 0; i < 256; i++)
- {
- int x = 0;
- if (isspace(i)) x += ctype_space;
- if (isalpha(i)) x += ctype_letter;
- if (isdigit(i)) x += ctype_digit;
- if (isxdigit(i)) x += ctype_xdigit;
- if (isalnum(i) || i == '_') x += ctype_word;
- if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta;
- *p++ = x;
- }
-
-return yield;
-}
-
-/* End of maketables.c */
+++ /dev/null
-#!/bin/sh
-
-prefix=/usr/local
-exec_prefix=${prefix}
-exec_prefix_set=no
-
-usage="\
-Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]"
-
-if test $# -eq 0; then
- echo "${usage}" 1>&2
- exit 1
-fi
-
-while test $# -gt 0; do
- case "$1" in
- -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
- esac
-
- case $1 in
- --prefix=*)
- prefix=$optarg
- if test $exec_prefix_set = no ; then
- exec_prefix=$optarg
- fi
- ;;
- --prefix)
- echo $prefix
- ;;
- --exec-prefix=*)
- exec_prefix=$optarg
- exec_prefix_set=yes
- ;;
- --exec-prefix)
- echo $exec_prefix
- ;;
- --version)
- echo 3.4
- ;;
- --cflags | --cflags-posix)
- if test ${prefix}/include != /usr/include ; then
- includes=-I${prefix}/include
- fi
- echo $includes
- ;;
- --libs-posix)
- echo -L${exec_prefix}/lib -lpcreposix -lpcre
- ;;
- --libs)
- echo -L${exec_prefix}/lib -lpcre
- ;;
- *)
- echo "${usage}" 1>&2
- exit 1
- ;;
- esac
- shift
-done
+++ /dev/null
-#!/bin/sh
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-exec_prefix_set=no
-
-usage="\
-Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]"
-
-if test $# -eq 0; then
- echo "${usage}" 1>&2
- exit 1
-fi
-
-while test $# -gt 0; do
- case "$1" in
- -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
- esac
-
- case $1 in
- --prefix=*)
- prefix=$optarg
- if test $exec_prefix_set = no ; then
- exec_prefix=$optarg
- fi
- ;;
- --prefix)
- echo $prefix
- ;;
- --exec-prefix=*)
- exec_prefix=$optarg
- exec_prefix_set=yes
- ;;
- --exec-prefix)
- echo $exec_prefix
- ;;
- --version)
- echo @PCRE_VERSION@
- ;;
- --cflags | --cflags-posix)
- if test @includedir@ != /usr/include ; then
- includes=-I@includedir@
- fi
- echo $includes
- ;;
- --libs-posix)
- echo -L@libdir@ -lpcreposix -lpcre
- ;;
- --libs)
- echo -L@libdir@ -lpcre
- ;;
- *)
- echo "${usage}" 1>&2
- exit 1
- ;;
- esac
- shift
-done
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
- Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-
-/* Define DEBUG to get debugging output on stdout. */
-
-/* #define DEBUG */
-
-/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
-inline, and there are *still* stupid compilers about that don't like indented
-pre-processor statements. I suppose it's only been 10 years... */
-
-#ifdef DEBUG
-#define DPRINTF(p) printf p
-#else
-#define DPRINTF(p) /*nothing*/
-#endif
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-/* Allow compilation as C++ source code, should anybody want to do that. */
-
-#ifdef __cplusplus
-#define class pcre_class
-#endif
-
-
-/* Number of items on the nested bracket stacks at compile time. This should
-not be set greater than 200. */
-
-#define BRASTACK_SIZE 200
-
-
-/* The number of bytes in a literal character string above which we can't add
-any more is different when UTF-8 characters may be encountered. */
-
-#ifdef SUPPORT_UTF8
-#define MAXLIT 250
-#else
-#define MAXLIT 255
-#endif
-
-
-/* Min and max values for the common repeats; for the maxima, 0 => infinity */
-
-static const char rep_min[] = { 0, 0, 1, 1, 0, 0 };
-static const char rep_max[] = { 0, 0, 0, 0, 1, 1 };
-
-/* Text forms of OP_ values and things, for debugging (not all used) */
-
-#ifdef DEBUG
-static const char *OP_names[] = {
- "End", "\\A", "\\B", "\\b", "\\D", "\\d",
- "\\S", "\\s", "\\W", "\\w", "\\Z", "\\z",
- "Opt", "^", "$", "Any", "chars", "not",
- "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
- "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
- "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
- "*", "*?", "+", "+?", "?", "??", "{", "{",
- "class", "Ref", "Recurse",
- "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",
- "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref",
- "Brazero", "Braminzero", "Bra"
-};
-#endif
-
-/* Table for handling escaped characters in the range '0'-'z'. Positive returns
-are simple data values; negative values are for special things like \d and so
-on. Zero means further processing is needed (for things like \x), or the escape
-is invalid. */
-
-static const short int escapes[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */
- 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */
- '@', -ESC_A, -ESC_B, 0, -ESC_D, 0, 0, 0, /* @ - G */
- 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
- 0, 0, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */
- 0, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */
- '`', 7, -ESC_b, 0, -ESC_d, 27, '\f', 0, /* ` - g */
- 0, 0, 0, 0, 0, 0, '\n', 0, /* h - o */
- 0, 0, '\r', -ESC_s, '\t', 0, 0, -ESC_w, /* p - w */
- 0, 0, -ESC_z /* x - z */
-};
-
-/* Tables of names of POSIX character classes and their lengths. The list is
-terminated by a zero length entry. The first three must be alpha, upper, lower,
-as this is assumed for handling case independence. */
-
-static const char *posix_names[] = {
- "alpha", "lower", "upper",
- "alnum", "ascii", "cntrl", "digit", "graph",
- "print", "punct", "space", "word", "xdigit" };
-
-static const uschar posix_name_lengths[] = {
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
-
-/* Table of class bit maps for each POSIX class; up to three may be combined
-to form the class. */
-
-static const int posix_class_maps[] = {
- cbit_lower, cbit_upper, -1, /* alpha */
- cbit_lower, -1, -1, /* lower */
- cbit_upper, -1, -1, /* upper */
- cbit_digit, cbit_lower, cbit_upper, /* alnum */
- cbit_print, cbit_cntrl, -1, /* ascii */
- cbit_cntrl, -1, -1, /* cntrl */
- cbit_digit, -1, -1, /* digit */
- cbit_graph, -1, -1, /* graph */
- cbit_print, -1, -1, /* print */
- cbit_punct, -1, -1, /* punct */
- cbit_space, -1, -1, /* space */
- cbit_word, -1, -1, /* word */
- cbit_xdigit,-1, -1 /* xdigit */
-};
-
-
-/* Definition to allow mutual recursion */
-
-static BOOL
- compile_regex(int, int, int *, uschar **, const uschar **, const char **,
- BOOL, int, int *, int *, compile_data *);
-
-/* Structure for building a chain of data that actually lives on the
-stack, for holding the values of the subject pointer at the start of each
-subpattern, so as to detect when an empty string has been matched by a
-subpattern - to break infinite loops. */
-
-typedef struct eptrblock {
- struct eptrblock *prev;
- const uschar *saved_eptr;
-} eptrblock;
-
-/* Flag bits for the match() function */
-
-#define match_condassert 0x01 /* Called to check a condition assertion */
-#define match_isgroup 0x02 /* Set if start of bracketed group */
-
-
-
-/*************************************************
-* Global variables *
-*************************************************/
-
-/* PCRE is thread-clean and doesn't use any global variables in the normal
-sense. However, it calls memory allocation and free functions via the two
-indirections below, which are can be changed by the caller, but are shared
-between all threads. */
-
-void *(*pcre_malloc)(size_t) = malloc;
-void (*pcre_free)(void *) = free;
-
-
-
-/*************************************************
-* Macros and tables for character handling *
-*************************************************/
-
-/* When UTF-8 encoding is being used, a character is no longer just a single
-byte. The macros for character handling generate simple sequences when used in
-byte-mode, and more complicated ones for UTF-8 characters. */
-
-#ifndef SUPPORT_UTF8
-#define GETCHARINC(c, eptr) c = *eptr++;
-#define GETCHARLEN(c, eptr, len) c = *eptr;
-#define BACKCHAR(eptr)
-
-#else /* SUPPORT_UTF8 */
-
-/* Get the next UTF-8 character, advancing the pointer */
-
-#define GETCHARINC(c, eptr) \
- c = *eptr++; \
- if (md->utf8 && (c & 0xc0) == 0xc0) \
- { \
- int a = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
- int s = 6 - a; /* Amount to shift next byte */ \
- c &= utf8_table3[a]; /* Low order bits from first byte */ \
- while (a-- > 0) \
- { \
- c |= (*eptr++ & 0x3f) << s; \
- s += 6; \
- } \
- }
-
-/* Get the next UTF-8 character, not advancing the pointer, setting length */
-
-#define GETCHARLEN(c, eptr, len) \
- c = *eptr; \
- len = 1; \
- if (md->utf8 && (c & 0xc0) == 0xc0) \
- { \
- int i; \
- int a = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
- int s = 6 - a; /* Amount to shift next byte */ \
- c &= utf8_table3[a]; /* Low order bits from first byte */ \
- for (i = 1; i <= a; i++) \
- { \
- c |= (eptr[i] & 0x3f) << s; \
- s += 6; \
- } \
- len += a; \
- }
-
-/* If the pointer is not at the start of a character, move it back until
-it is. */
-
-#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--;
-
-#endif
-
-
-
-/*************************************************
-* Default character tables *
-*************************************************/
-
-/* A default set of character tables is included in the PCRE binary. Its source
-is built by the maketables auxiliary program, which uses the default C ctypes
-functions, and put in the file chartables.c. These tables are used by PCRE
-whenever the caller of pcre_compile() does not provide an alternate set of
-tables. */
-
-#include "chartables.c"
-
-
-
-#ifdef SUPPORT_UTF8
-/*************************************************
-* Tables for UTF-8 support *
-*************************************************/
-
-/* These are the breakpoints for different numbers of bytes in a UTF-8
-character. */
-
-static int utf8_table1[] = { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
-
-/* These are the indicator bits and the mask for the data bits to set in the
-first byte of a character, indexed by the number of additional bytes. */
-
-static int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
-static int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
-
-/* Table of the number of extra characters, indexed by the first character
-masked with 0x3f. The highest number for a valid UTF-8 character is in fact
-0x3d. */
-
-static uschar utf8_table4[] = {
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
- 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
- 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
-
-
-/*************************************************
-* Convert character value to UTF-8 *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x7fffffff
-and encodes it as a UTF-8 character in 0 to 6 bytes.
-
-Arguments:
- cvalue the character value
- buffer pointer to buffer for result - at least 6 bytes long
-
-Returns: number of characters placed in the buffer
-*/
-
-static int
-ord2utf8(int cvalue, uschar *buffer)
-{
-register int i, j;
-for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
- if (cvalue <= utf8_table1[i]) break;
-*buffer++ = utf8_table2[i] | (cvalue & utf8_table3[i]);
-cvalue >>= 6 - i;
-for (j = 0; j < i; j++)
- {
- *buffer++ = 0x80 | (cvalue & 0x3f);
- cvalue >>= 6;
- }
-return i + 1;
-}
-#endif
-
-
-
-/*************************************************
-* Return version string *
-*************************************************/
-
-#define STRING(a) # a
-#define XSTRING(s) STRING(s)
-
-const char *
-pcre_version(void)
-{
-return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE);
-}
-
-
-
-
-/*************************************************
-* (Obsolete) Return info about compiled pattern *
-*************************************************/
-
-/* This is the original "info" function. It picks potentially useful data out
-of the private structure, but its interface was too rigid. It remains for
-backwards compatibility. The public options are passed back in an int - though
-the re->options field has been expanded to a long int, all the public options
-at the low end of it, and so even on 16-bit systems this will still be OK.
-Therefore, I haven't changed the API for pcre_info().
-
-Arguments:
- external_re points to compiled code
- optptr where to pass back the options
- first_char where to pass back the first character,
- or -1 if multiline and all branches start ^,
- or -2 otherwise
-
-Returns: number of capturing subpatterns
- or negative values on error
-*/
-
-int
-pcre_info(const pcre *external_re, int *optptr, int *first_char)
-{
-const real_pcre *re = (const real_pcre *)external_re;
-if (re == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
-if (first_char != NULL)
- *first_char = ((re->options & PCRE_FIRSTSET) != 0)? re->first_char :
- ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
-return re->top_bracket;
-}
-
-
-
-/*************************************************
-* Return info about compiled pattern *
-*************************************************/
-
-/* This is a newer "info" function which has an extensible interface so
-that additional items can be added compatibly.
-
-Arguments:
- external_re points to compiled code
- external_study points to study data, or NULL
- what what information is required
- where where to put the information
-
-Returns: 0 if data returned, negative on error
-*/
-
-int
-pcre_fullinfo(const pcre *external_re, const pcre_extra *study_data, int what,
- void *where)
-{
-const real_pcre *re = (const real_pcre *)external_re;
-const real_pcre_extra *study = (const real_pcre_extra *)study_data;
-
-if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-
-switch (what)
- {
- case PCRE_INFO_OPTIONS:
- *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;
- break;
-
- case PCRE_INFO_SIZE:
- *((size_t *)where) = re->size;
- break;
-
- case PCRE_INFO_CAPTURECOUNT:
- *((int *)where) = re->top_bracket;
- break;
-
- case PCRE_INFO_BACKREFMAX:
- *((int *)where) = re->top_backref;
- break;
-
- case PCRE_INFO_FIRSTCHAR:
- *((int *)where) =
- ((re->options & PCRE_FIRSTSET) != 0)? re->first_char :
- ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
- break;
-
- case PCRE_INFO_FIRSTTABLE:
- *((const uschar **)where) =
- (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
- study->start_bits : NULL;
- break;
-
- case PCRE_INFO_LASTLITERAL:
- *((int *)where) =
- ((re->options & PCRE_REQCHSET) != 0)? re->req_char : -1;
- break;
-
- default: return PCRE_ERROR_BADOPTION;
- }
-
-return 0;
-}
-
-
-
-#ifdef DEBUG
-/*************************************************
-* Debugging function to print chars *
-*************************************************/
-
-/* Print a sequence of chars in printable format, stopping at the end of the
-subject if the requested.
-
-Arguments:
- p points to characters
- length number to print
- is_subject TRUE if printing from within md->start_subject
- md pointer to matching data block, if is_subject is TRUE
-
-Returns: nothing
-*/
-
-static void
-pchars(const uschar *p, int length, BOOL is_subject, match_data *md)
-{
-int c;
-if (is_subject && length > md->end_subject - p) length = md->end_subject - p;
-while (length-- > 0)
- if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c);
-}
-#endif
-
-
-
-
-/*************************************************
-* Handle escapes *
-*************************************************/
-
-/* This function is called when a \ has been encountered. It either returns a
-positive value for a simple escape such as \n, or a negative value which
-encodes one of the more complicated things such as \d. When UTF-8 is enabled,
-a positive value greater than 255 may be returned. On entry, ptr is pointing at
-the \. On exit, it is on the final character of the escape sequence.
-
-Arguments:
- ptrptr points to the pattern position pointer
- errorptr points to the pointer to the error message
- bracount number of previous extracting brackets
- options the options bits
- isclass TRUE if inside a character class
- cd pointer to char tables block
-
-Returns: zero or positive => a data character
- negative => a special escape sequence
- on error, errorptr is set
-*/
-
-static int
-check_escape(const uschar **ptrptr, const char **errorptr, int bracount,
- int options, BOOL isclass, compile_data *cd)
-{
-const uschar *ptr = *ptrptr;
-int c, i;
-
-/* If backslash is at the end of the pattern, it's an error. */
-
-c = *(++ptr);
-if (c == 0) *errorptr = ERR1;
-
-/* Digits or letters may have special meaning; all others are literals. */
-
-else if (c < '0' || c > 'z') {}
-
-/* Do an initial lookup in a table. A non-zero result is something that can be
-returned immediately. Otherwise further processing may be required. */
-
-else if ((i = escapes[c - '0']) != 0) c = i;
-
-/* Escapes that need further processing, or are illegal. */
-
-else
- {
- const uschar *oldptr;
- switch (c)
- {
- /* The handling of escape sequences consisting of a string of digits
- starting with one that is not zero is not straightforward. By experiment,
- the way Perl works seems to be as follows:
-
- Outside a character class, the digits are read as a decimal number. If the
- number is less than 10, or if there are that many previous extracting
- left brackets, then it is a back reference. Otherwise, up to three octal
- digits are read to form an escaped byte. Thus \123 is likely to be octal
- 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal
- value is greater than 377, the least significant 8 bits are taken. Inside a
- character class, \ followed by a digit is always an octal number. */
-
- case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
-
- if (!isclass)
- {
- oldptr = ptr;
- c -= '0';
- while ((cd->ctypes[ptr[1]] & ctype_digit) != 0)
- c = c * 10 + *(++ptr) - '0';
- if (c < 10 || c <= bracount)
- {
- c = -(ESC_REF + c);
- break;
- }
- ptr = oldptr; /* Put the pointer back and fall through */
- }
-
- /* Handle an octal number following \. If the first digit is 8 or 9, Perl
- generates a binary zero byte and treats the digit as a following literal.
- Thus we have to pull back the pointer by one. */
-
- if ((c = *ptr) >= '8')
- {
- ptr--;
- c = 0;
- break;
- }
-
- /* \0 always starts an octal number, but we may drop through to here with a
- larger first octal digit. */
-
- case '0':
- c -= '0';
- while(i++ < 2 && (cd->ctypes[ptr[1]] & ctype_digit) != 0 &&
- ptr[1] != '8' && ptr[1] != '9')
- c = c * 8 + *(++ptr) - '0';
- c &= 255; /* Take least significant 8 bits */
- break;
-
- /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number
- which can be greater than 0xff, but only if the ddd are hex digits. */
-
- case 'x':
-#ifdef SUPPORT_UTF8
- if (ptr[1] == '{' && (options & PCRE_UTF8) != 0)
- {
- const uschar *pt = ptr + 2;
- register int count = 0;
- c = 0;
- while ((cd->ctypes[*pt] & ctype_xdigit) != 0)
- {
- count++;
- c = c * 16 + cd->lcc[*pt] -
- (((cd->ctypes[*pt] & ctype_digit) != 0)? '0' : 'W');
- pt++;
- }
- if (*pt == '}')
- {
- if (c < 0 || count > 8) *errorptr = ERR34;
- ptr = pt;
- break;
- }
- /* If the sequence of hex digits does not end with '}', then we don't
- recognize this construct; fall through to the normal \x handling. */
- }
-#endif
-
- /* Read just a single hex char */
-
- c = 0;
- while (i++ < 2 && (cd->ctypes[ptr[1]] & ctype_xdigit) != 0)
- {
- ptr++;
- c = c * 16 + cd->lcc[*ptr] -
- (((cd->ctypes[*ptr] & ctype_digit) != 0)? '0' : 'W');
- }
- break;
-
- /* Other special escapes not starting with a digit are straightforward */
-
- case 'c':
- c = *(++ptr);
- if (c == 0)
- {
- *errorptr = ERR2;
- return 0;
- }
-
- /* A letter is upper-cased; then the 0x40 bit is flipped */
-
- if (c >= 'a' && c <= 'z') c = cd->fcc[c];
- c ^= 0x40;
- break;
-
- /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
- other alphameric following \ is an error if PCRE_EXTRA was set; otherwise,
- for Perl compatibility, it is a literal. This code looks a bit odd, but
- there used to be some cases other than the default, and there may be again
- in future, so I haven't "optimized" it. */
-
- default:
- if ((options & PCRE_EXTRA) != 0) switch(c)
- {
- default:
- *errorptr = ERR3;
- break;
- }
- break;
- }
- }
-
-*ptrptr = ptr;
-return c;
-}
-
-
-
-/*************************************************
-* Check for counted repeat *
-*************************************************/
-
-/* This function is called when a '{' is encountered in a place where it might
-start a quantifier. It looks ahead to see if it really is a quantifier or not.
-It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd}
-where the ddds are digits.
-
-Arguments:
- p pointer to the first char after '{'
- cd pointer to char tables block
-
-Returns: TRUE or FALSE
-*/
-
-static BOOL
-is_counted_repeat(const uschar *p, compile_data *cd)
-{
-if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE;
-while ((cd->ctypes[*p] & ctype_digit) != 0) p++;
-if (*p == '}') return TRUE;
-
-if (*p++ != ',') return FALSE;
-if (*p == '}') return TRUE;
-
-if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE;
-while ((cd->ctypes[*p] & ctype_digit) != 0) p++;
-return (*p == '}');
-}
-
-
-
-/*************************************************
-* Read repeat counts *
-*************************************************/
-
-/* Read an item of the form {n,m} and return the values. This is called only
-after is_counted_repeat() has confirmed that a repeat-count quantifier exists,
-so the syntax is guaranteed to be correct, but we need to check the values.
-
-Arguments:
- p pointer to first char after '{'
- minp pointer to int for min
- maxp pointer to int for max
- returned as -1 if no max
- errorptr points to pointer to error message
- cd pointer to character tables clock
-
-Returns: pointer to '}' on success;
- current ptr on error, with errorptr set
-*/
-
-static const uschar *
-read_repeat_counts(const uschar *p, int *minp, int *maxp,
- const char **errorptr, compile_data *cd)
-{
-int min = 0;
-int max = -1;
-
-while ((cd->ctypes[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0';
-
-if (*p == '}') max = min; else
- {
- if (*(++p) != '}')
- {
- max = 0;
- while((cd->ctypes[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0';
- if (max < min)
- {
- *errorptr = ERR4;
- return p;
- }
- }
- }
-
-/* Do paranoid checks, then fill in the required variables, and pass back the
-pointer to the terminating '}'. */
-
-if (min > 65535 || max > 65535)
- *errorptr = ERR5;
-else
- {
- *minp = min;
- *maxp = max;
- }
-return p;
-}
-
-
-
-/*************************************************
-* Find the fixed length of a pattern *
-*************************************************/
-
-/* Scan a pattern and compute the fixed length of subject that will match it,
-if the length is fixed. This is needed for dealing with backward assertions.
-
-Arguments:
- code points to the start of the pattern (the bracket)
- options the compiling options
-
-Returns: the fixed length, or -1 if there is no fixed length
-*/
-
-static int
-find_fixedlength(uschar *code, int options)
-{
-int length = -1;
-
-register int branchlength = 0;
-register uschar *cc = code + 3;
-
-/* Scan along the opcodes for this branch. If we get to the end of the
-branch, check the length against that of the other branches. */
-
-for (;;)
- {
- int d;
- register int op = *cc;
- if (op >= OP_BRA) op = OP_BRA;
-
- switch (op)
- {
- case OP_BRA:
- case OP_ONCE:
- case OP_COND:
- d = find_fixedlength(cc, options);
- if (d < 0) return -1;
- branchlength += d;
- do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT);
- cc += 3;
- break;
-
- /* Reached end of a branch; if it's a ket it is the end of a nested
- call. If it's ALT it is an alternation in a nested call. If it is
- END it's the end of the outer call. All can be handled by the same code. */
-
- case OP_ALT:
- case OP_KET:
- case OP_KETRMAX:
- case OP_KETRMIN:
- case OP_END:
- if (length < 0) length = branchlength;
- else if (length != branchlength) return -1;
- if (*cc != OP_ALT) return length;
- cc += 3;
- branchlength = 0;
- break;
-
- /* Skip over assertive subpatterns */
-
- case OP_ASSERT:
- case OP_ASSERT_NOT:
- case OP_ASSERTBACK:
- case OP_ASSERTBACK_NOT:
- do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT);
- cc += 3;
- break;
-
- /* Skip over things that don't match chars */
-
- case OP_REVERSE:
- cc++;
- /* Fall through */
-
- case OP_CREF:
- case OP_OPT:
- cc++;
- /* Fall through */
-
- case OP_SOD:
- case OP_EOD:
- case OP_EODN:
- case OP_CIRC:
- case OP_DOLL:
- case OP_NOT_WORD_BOUNDARY:
- case OP_WORD_BOUNDARY:
- cc++;
- break;
-
- /* Handle char strings. In UTF-8 mode we must count characters, not bytes.
- This requires a scan of the string, unfortunately. We assume valid UTF-8
- strings, so all we do is reduce the length by one for byte whose bits are
- 10xxxxxx. */
-
- case OP_CHARS:
- branchlength += *(++cc);
-#ifdef SUPPORT_UTF8
- for (d = 1; d <= *cc; d++)
- if ((cc[d] & 0xc0) == 0x80) branchlength--;
-#endif
- cc += *cc + 1;
- break;
-
- /* Handle exact repetitions */
-
- case OP_EXACT:
- case OP_TYPEEXACT:
- branchlength += (cc[1] << 8) + cc[2];
- cc += 4;
- break;
-
- /* Handle single-char matchers */
-
- case OP_NOT_DIGIT:
- case OP_DIGIT:
- case OP_NOT_WHITESPACE:
- case OP_WHITESPACE:
- case OP_NOT_WORDCHAR:
- case OP_WORDCHAR:
- case OP_ANY:
- branchlength++;
- cc++;
- break;
-
-
- /* Check a class for variable quantification */
-
- case OP_CLASS:
- cc += (*cc == OP_REF)? 2 : 33;
-
- switch (*cc)
- {
- case OP_CRSTAR:
- case OP_CRMINSTAR:
- case OP_CRQUERY:
- case OP_CRMINQUERY:
- return -1;
-
- case OP_CRRANGE:
- case OP_CRMINRANGE:
- if ((cc[1] << 8) + cc[2] != (cc[3] << 8) + cc[4]) return -1;
- branchlength += (cc[1] << 8) + cc[2];
- cc += 5;
- break;
-
- default:
- branchlength++;
- }
- break;
-
- /* Anything else is variable length */
-
- default:
- return -1;
- }
- }
-/* Control never gets here */
-}
-
-
-
-
-/*************************************************
-* Check for POSIX class syntax *
-*************************************************/
-
-/* This function is called when the sequence "[:" or "[." or "[=" is
-encountered in a character class. It checks whether this is followed by an
-optional ^ and then a sequence of letters, terminated by a matching ":]" or
-".]" or "=]".
-
-Argument:
- ptr pointer to the initial [
- endptr where to return the end pointer
- cd pointer to compile data
-
-Returns: TRUE or FALSE
-*/
-
-static BOOL
-check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd)
-{
-int terminator; /* Don't combine these lines; the Solaris cc */
-terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */
-if (*(++ptr) == '^') ptr++;
-while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;
-if (*ptr == terminator && ptr[1] == ']')
- {
- *endptr = ptr;
- return TRUE;
- }
-return FALSE;
-}
-
-
-
-
-/*************************************************
-* Check POSIX class name *
-*************************************************/
-
-/* This function is called to check the name given in a POSIX-style class entry
-such as [:alnum:].
-
-Arguments:
- ptr points to the first letter
- len the length of the name
-
-Returns: a value representing the name, or -1 if unknown
-*/
-
-static int
-check_posix_name(const uschar *ptr, int len)
-{
-register int yield = 0;
-while (posix_name_lengths[yield] != 0)
- {
- if (len == posix_name_lengths[yield] &&
- strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield;
- yield++;
- }
-return -1;
-}
-
-
-
-
-/*************************************************
-* Compile one branch *
-*************************************************/
-
-/* Scan the pattern, compiling it into the code vector.
-
-Arguments:
- options the option bits
- brackets points to number of brackets used
- code points to the pointer to the current code point
- ptrptr points to the current pattern pointer
- errorptr points to pointer to error message
- optchanged set to the value of the last OP_OPT item compiled
- reqchar set to the last literal character required, else -1
- countlits set to count of mandatory literal characters
- cd contains pointers to tables
-
-Returns: TRUE on success
- FALSE, with *errorptr set on error
-*/
-
-static BOOL
-compile_branch(int options, int *brackets, uschar **codeptr,
- const uschar **ptrptr, const char **errorptr, int *optchanged,
- int *reqchar, int *countlits, compile_data *cd)
-{
-int repeat_type, op_type;
-int repeat_min, repeat_max;
-int bravalue, length;
-int greedy_default, greedy_non_default;
-int prevreqchar;
-int condcount = 0;
-int subcountlits = 0;
-register int c;
-register uschar *code = *codeptr;
-uschar *tempcode;
-const uschar *ptr = *ptrptr;
-const uschar *tempptr;
-uschar *previous = NULL;
-uschar class[32];
-
-/* Set up the default and non-default settings for greediness */
-
-greedy_default = ((options & PCRE_UNGREEDY) != 0);
-greedy_non_default = greedy_default ^ 1;
-
-/* Initialize no required char, and count of literals */
-
-*reqchar = prevreqchar = -1;
-*countlits = 0;
-
-/* Switch on next character until the end of the branch */
-
-for (;; ptr++)
- {
- BOOL negate_class;
- int class_charcount;
- int class_lastchar;
- int newoptions;
- int condref;
- int subreqchar;
-
- c = *ptr;
- if ((options & PCRE_EXTENDED) != 0)
- {
- if ((cd->ctypes[c] & ctype_space) != 0) continue;
- if (c == '#')
- {
- /* The space before the ; is to avoid a warning on a silly compiler
- on the Macintosh. */
- while ((c = *(++ptr)) != 0 && c != '\n') ;
- continue;
- }
- }
-
- switch(c)
- {
- /* The branch terminates at end of string, |, or ). */
-
- case 0:
- case '|':
- case ')':
- *codeptr = code;
- *ptrptr = ptr;
- return TRUE;
-
- /* Handle single-character metacharacters */
-
- case '^':
- previous = NULL;
- *code++ = OP_CIRC;
- break;
-
- case '$':
- previous = NULL;
- *code++ = OP_DOLL;
- break;
-
- case '.':
- previous = code;
- *code++ = OP_ANY;
- break;
-
- /* Character classes. These always build a 32-byte bitmap of the permitted
- characters, except in the special case where there is only one character.
- For negated classes, we build the map as usual, then invert it at the end.
- */
-
- case '[':
- previous = code;
- *code++ = OP_CLASS;
-
- /* If the first character is '^', set the negation flag and skip it. */
-
- if ((c = *(++ptr)) == '^')
- {
- negate_class = TRUE;
- c = *(++ptr);
- }
- else negate_class = FALSE;
-
- /* Keep a count of chars so that we can optimize the case of just a single
- character. */
-
- class_charcount = 0;
- class_lastchar = -1;
-
- /* Initialize the 32-char bit map to all zeros. We have to build the
- map in a temporary bit of store, in case the class contains only 1
- character, because in that case the compiled code doesn't use the
- bit map. */
-
- memset(class, 0, 32 * sizeof(uschar));
-
- /* Process characters until ] is reached. By writing this as a "do" it
- means that an initial ] is taken as a data character. */
-
- do
- {
- if (c == 0)
- {
- *errorptr = ERR6;
- goto FAILED;
- }
-
- /* Handle POSIX class names. Perl allows a negation extension of the
- form [:^name]. A square bracket that doesn't match the syntax is
- treated as a literal. We also recognize the POSIX constructions
- [.ch.] and [=ch=] ("collating elements") and fault them, as Perl
- 5.6 does. */
-
- if (c == '[' &&
- (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
- check_posix_syntax(ptr, &tempptr, cd))
- {
- BOOL local_negate = FALSE;
- int posix_class, i;
- register const uschar *cbits = cd->cbits;
-
- if (ptr[1] != ':')
- {
- *errorptr = ERR31;
- goto FAILED;
- }
-
- ptr += 2;
- if (*ptr == '^')
- {
- local_negate = TRUE;
- ptr++;
- }
-
- posix_class = check_posix_name(ptr, tempptr - ptr);
- if (posix_class < 0)
- {
- *errorptr = ERR30;
- goto FAILED;
- }
-
- /* If matching is caseless, upper and lower are converted to
- alpha. This relies on the fact that the class table starts with
- alpha, lower, upper as the first 3 entries. */
-
- if ((options & PCRE_CASELESS) != 0 && posix_class <= 2)
- posix_class = 0;
-
- /* Or into the map we are building up to 3 of the static class
- tables, or their negations. */
-
- posix_class *= 3;
- for (i = 0; i < 3; i++)
- {
- int taboffset = posix_class_maps[posix_class + i];
- if (taboffset < 0) break;
- if (local_negate)
- for (c = 0; c < 32; c++) class[c] |= ~cbits[c+taboffset];
- else
- for (c = 0; c < 32; c++) class[c] |= cbits[c+taboffset];
- }
-
- ptr = tempptr + 1;
- class_charcount = 10; /* Set > 1; assumes more than 1 per class */
- continue;
- }
-
- /* Backslash may introduce a single character, or it may introduce one
- of the specials, which just set a flag. Escaped items are checked for
- validity in the pre-compiling pass. The sequence \b is a special case.
- Inside a class (and only there) it is treated as backspace. Elsewhere
- it marks a word boundary. Other escapes have preset maps ready to
- or into the one we are building. We assume they have more than one
- character in them, so set class_count bigger than one. */
-
- if (c == '\\')
- {
- c = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd);
- if (-c == ESC_b) c = '\b';
- else if (c < 0)
- {
- register const uschar *cbits = cd->cbits;
- class_charcount = 10;
- switch (-c)
- {
- case ESC_d:
- for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_digit];
- continue;
-
- case ESC_D:
- for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_digit];
- continue;
-
- case ESC_w:
- for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_word];
- continue;
-
- case ESC_W:
- for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_word];
- continue;
-
- case ESC_s:
- for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_space];
- continue;
-
- case ESC_S:
- for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_space];
- continue;
-
- default:
- *errorptr = ERR7;
- goto FAILED;
- }
- }
-
- /* Fall through if single character, but don't at present allow
- chars > 255 in UTF-8 mode. */
-
-#ifdef SUPPORT_UTF8
- if (c > 255)
- {
- *errorptr = ERR33;
- goto FAILED;
- }
-#endif
- }
-
- /* A single character may be followed by '-' to form a range. However,
- Perl does not permit ']' to be the end of the range. A '-' character
- here is treated as a literal. */
-
- if (ptr[1] == '-' && ptr[2] != ']')
- {
- int d;
- ptr += 2;
- d = *ptr;
-
- if (d == 0)
- {
- *errorptr = ERR6;
- goto FAILED;
- }
-
- /* The second part of a range can be a single-character escape, but
- not any of the other escapes. Perl 5.6 treats a hyphen as a literal
- in such circumstances. */
-
- if (d == '\\')
- {
- const uschar *oldptr = ptr;
- d = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd);
-
-#ifdef SUPPORT_UTF8
- if (d > 255)
- {
- *errorptr = ERR33;
- goto FAILED;
- }
-#endif
- /* \b is backslash; any other special means the '-' was literal */
-
- if (d < 0)
- {
- if (d == -ESC_b) d = '\b'; else
- {
- ptr = oldptr - 2;
- goto SINGLE_CHARACTER; /* A few lines below */
- }
- }
- }
-
- if (d < c)
- {
- *errorptr = ERR8;
- goto FAILED;
- }
-
- for (; c <= d; c++)
- {
- class[c/8] |= (1 << (c&7));
- if ((options & PCRE_CASELESS) != 0)
- {
- int uc = cd->fcc[c]; /* flip case */
- class[uc/8] |= (1 << (uc&7));
- }
- class_charcount++; /* in case a one-char range */
- class_lastchar = c;
- }
- continue; /* Go get the next char in the class */
- }
-
- /* Handle a lone single character - we can get here for a normal
- non-escape char, or after \ that introduces a single character. */
-
- SINGLE_CHARACTER:
-
- class [c/8] |= (1 << (c&7));
- if ((options & PCRE_CASELESS) != 0)
- {
- c = cd->fcc[c]; /* flip case */
- class[c/8] |= (1 << (c&7));
- }
- class_charcount++;
- class_lastchar = c;
- }
-
- /* Loop until ']' reached; the check for end of string happens inside the
- loop. This "while" is the end of the "do" above. */
-
- while ((c = *(++ptr)) != ']');
-
- /* If class_charcount is 1 and class_lastchar is not negative, we saw
- precisely one character. This doesn't need the whole 32-byte bit map.
- We turn it into a 1-character OP_CHAR if it's positive, or OP_NOT if
- it's negative. */
-
- if (class_charcount == 1 && class_lastchar >= 0)
- {
- if (negate_class)
- {
- code[-1] = OP_NOT;
- }
- else
- {
- code[-1] = OP_CHARS;
- *code++ = 1;
- }
- *code++ = class_lastchar;
- }
-
- /* Otherwise, negate the 32-byte map if necessary, and copy it into
- the code vector. */
-
- else
- {
- if (negate_class)
- for (c = 0; c < 32; c++) code[c] = ~class[c];
- else
- memcpy(code, class, 32);
- code += 32;
- }
- break;
-
- /* Various kinds of repeat */
-
- case '{':
- if (!is_counted_repeat(ptr+1, cd)) goto NORMAL_CHAR;
- ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr, cd);
- if (*errorptr != NULL) goto FAILED;
- goto REPEAT;
-
- case '*':
- repeat_min = 0;
- repeat_max = -1;
- goto REPEAT;
-
- case '+':
- repeat_min = 1;
- repeat_max = -1;
- goto REPEAT;
-
- case '?':
- repeat_min = 0;
- repeat_max = 1;
-
- REPEAT:
- if (previous == NULL)
- {
- *errorptr = ERR9;
- goto FAILED;
- }
-
- /* If the next character is '?' this is a minimizing repeat, by default,
- but if PCRE_UNGREEDY is set, it works the other way round. Advance to the
- next character. */
-
- if (ptr[1] == '?')
- { repeat_type = greedy_non_default; ptr++; }
- else repeat_type = greedy_default;
-
- /* If previous was a string of characters, chop off the last one and use it
- as the subject of the repeat. If there was only one character, we can
- abolish the previous item altogether. A repeat with a zero minimum wipes
- out any reqchar setting, backing up to the previous value. We must also
- adjust the countlits value. */
-
- if (*previous == OP_CHARS)
- {
- int len = previous[1];
-
- if (repeat_min == 0) *reqchar = prevreqchar;
- *countlits += repeat_min - 1;
-
- if (len == 1)
- {
- c = previous[2];
- code = previous;
- }
- else
- {
- c = previous[len+1];
- previous[1]--;
- code--;
- }
- op_type = 0; /* Use single-char op codes */
- goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */
- }
-
- /* If previous was a single negated character ([^a] or similar), we use
- one of the special opcodes, replacing it. The code is shared with single-
- character repeats by adding a suitable offset into repeat_type. */
-
- else if ((int)*previous == OP_NOT)
- {
- op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */
- c = previous[1];
- code = previous;
- goto OUTPUT_SINGLE_REPEAT;
- }
-
- /* If previous was a character type match (\d or similar), abolish it and
- create a suitable repeat item. The code is shared with single-character
- repeats by adding a suitable offset into repeat_type. */
-
- else if ((int)*previous < OP_EODN || *previous == OP_ANY)
- {
- op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */
- c = *previous;
- code = previous;
-
- OUTPUT_SINGLE_REPEAT:
-
- /* If the maximum is zero then the minimum must also be zero; Perl allows
- this case, so we do too - by simply omitting the item altogether. */
-
- if (repeat_max == 0) goto END_REPEAT;
-
- /* Combine the op_type with the repeat_type */
-
- repeat_type += op_type;
-
- /* A minimum of zero is handled either as the special case * or ?, or as
- an UPTO, with the maximum given. */
-
- if (repeat_min == 0)
- {
- if (repeat_max == -1) *code++ = OP_STAR + repeat_type;
- else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type;
- else
- {
- *code++ = OP_UPTO + repeat_type;
- *code++ = repeat_max >> 8;
- *code++ = (repeat_max & 255);
- }
- }
-
- /* The case {1,} is handled as the special case + */
-
- else if (repeat_min == 1 && repeat_max == -1)
- *code++ = OP_PLUS + repeat_type;
-
- /* The case {n,n} is just an EXACT, while the general case {n,m} is
- handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */
-
- else
- {
- if (repeat_min != 1)
- {
- *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */
- *code++ = repeat_min >> 8;
- *code++ = (repeat_min & 255);
- }
-
- /* If the mininum is 1 and the previous item was a character string,
- we either have to put back the item that got cancelled if the string
- length was 1, or add the character back onto the end of a longer
- string. For a character type nothing need be done; it will just get
- put back naturally. Note that the final character is always going to
- get added below. */
-
- else if (*previous == OP_CHARS)
- {
- if (code == previous) code += 2; else previous[1]++;
- }
-
- /* For a single negated character we also have to put back the
- item that got cancelled. */
-
- else if (*previous == OP_NOT) code++;
-
- /* If the maximum is unlimited, insert an OP_STAR. */
-
- if (repeat_max < 0)
- {
- *code++ = c;
- *code++ = OP_STAR + repeat_type;
- }
-
- /* Else insert an UPTO if the max is greater than the min. */
-
- else if (repeat_max != repeat_min)
- {
- *code++ = c;
- repeat_max -= repeat_min;
- *code++ = OP_UPTO + repeat_type;
- *code++ = repeat_max >> 8;
- *code++ = (repeat_max & 255);
- }
- }
-
- /* The character or character type itself comes last in all cases. */
-
- *code++ = c;
- }
-
- /* If previous was a character class or a back reference, we put the repeat
- stuff after it, but just skip the item if the repeat was {0,0}. */
-
- else if (*previous == OP_CLASS || *previous == OP_REF)
- {
- if (repeat_max == 0)
- {
- code = previous;
- goto END_REPEAT;
- }
- if (repeat_min == 0 && repeat_max == -1)
- *code++ = OP_CRSTAR + repeat_type;
- else if (repeat_min == 1 && repeat_max == -1)
- *code++ = OP_CRPLUS + repeat_type;
- else if (repeat_min == 0 && repeat_max == 1)
- *code++ = OP_CRQUERY + repeat_type;
- else
- {
- *code++ = OP_CRRANGE + repeat_type;
- *code++ = repeat_min >> 8;
- *code++ = repeat_min & 255;
- if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */
- *code++ = repeat_max >> 8;
- *code++ = repeat_max & 255;
- }
- }
-
- /* If previous was a bracket group, we may have to replicate it in certain
- cases. */
-
- else if ((int)*previous >= OP_BRA || (int)*previous == OP_ONCE ||
- (int)*previous == OP_COND)
- {
- register int i;
- int ketoffset = 0;
- int len = code - previous;
- uschar *bralink = NULL;
-
- /* If the maximum repeat count is unlimited, find the end of the bracket
- by scanning through from the start, and compute the offset back to it
- from the current code pointer. There may be an OP_OPT setting following
- the final KET, so we can't find the end just by going back from the code
- pointer. */
-
- if (repeat_max == -1)
- {
- register uschar *ket = previous;
- do ket += (ket[1] << 8) + ket[2]; while (*ket != OP_KET);
- ketoffset = code - ket;
- }
-
- /* The case of a zero minimum is special because of the need to stick
- OP_BRAZERO in front of it, and because the group appears once in the
- data, whereas in other cases it appears the minimum number of times. For
- this reason, it is simplest to treat this case separately, as otherwise
- the code gets far too mess. There are several special subcases when the
- minimum is zero. */
-
- if (repeat_min == 0)
- {
- /* If we set up a required char from the bracket, we must back off
- to the previous value and reset the countlits value too. */
-
- if (subcountlits > 0)
- {
- *reqchar = prevreqchar;
- *countlits -= subcountlits;
- }
-
- /* If the maximum is also zero, we just omit the group from the output
- altogether. */
-
- if (repeat_max == 0)
- {
- code = previous;
- goto END_REPEAT;
- }
-
- /* If the maximum is 1 or unlimited, we just have to stick in the
- BRAZERO and do no more at this point. */
-
- if (repeat_max <= 1)
- {
- memmove(previous+1, previous, len);
- code++;
- *previous++ = OP_BRAZERO + repeat_type;
- }
-
- /* If the maximum is greater than 1 and limited, we have to replicate
- in a nested fashion, sticking OP_BRAZERO before each set of brackets.
- The first one has to be handled carefully because it's the original
- copy, which has to be moved up. The remainder can be handled by code
- that is common with the non-zero minimum case below. We just have to
- adjust the value or repeat_max, since one less copy is required. */
-
- else
- {
- int offset;
- memmove(previous+4, previous, len);
- code += 4;
- *previous++ = OP_BRAZERO + repeat_type;
- *previous++ = OP_BRA;
-
- /* We chain together the bracket offset fields that have to be
- filled in later when the ends of the brackets are reached. */
-
- offset = (bralink == NULL)? 0 : previous - bralink;
- bralink = previous;
- *previous++ = offset >> 8;
- *previous++ = offset & 255;
- }
-
- repeat_max--;
- }
-
- /* If the minimum is greater than zero, replicate the group as many
- times as necessary, and adjust the maximum to the number of subsequent
- copies that we need. */
-
- else
- {
- for (i = 1; i < repeat_min; i++)
- {
- memcpy(code, previous, len);
- code += len;
- }
- if (repeat_max > 0) repeat_max -= repeat_min;
- }
-
- /* This code is common to both the zero and non-zero minimum cases. If
- the maximum is limited, it replicates the group in a nested fashion,
- remembering the bracket starts on a stack. In the case of a zero minimum,
- the first one was set up above. In all cases the repeat_max now specifies
- the number of additional copies needed. */
-
- if (repeat_max >= 0)
- {
- for (i = repeat_max - 1; i >= 0; i--)
- {
- *code++ = OP_BRAZERO + repeat_type;
-
- /* All but the final copy start a new nesting, maintaining the
- chain of brackets outstanding. */
-
- if (i != 0)
- {
- int offset;
- *code++ = OP_BRA;
- offset = (bralink == NULL)? 0 : code - bralink;
- bralink = code;
- *code++ = offset >> 8;
- *code++ = offset & 255;
- }
-
- memcpy(code, previous, len);
- code += len;
- }
-
- /* Now chain through the pending brackets, and fill in their length
- fields (which are holding the chain links pro tem). */
-
- while (bralink != NULL)
- {
- int oldlinkoffset;
- int offset = code - bralink + 1;
- uschar *bra = code - offset;
- oldlinkoffset = (bra[1] << 8) + bra[2];
- bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;
- *code++ = OP_KET;
- *code++ = bra[1] = offset >> 8;
- *code++ = bra[2] = (offset & 255);
- }
- }
-
- /* If the maximum is unlimited, set a repeater in the final copy. We
- can't just offset backwards from the current code point, because we
- don't know if there's been an options resetting after the ket. The
- correct offset was computed above. */
-
- else code[-ketoffset] = OP_KETRMAX + repeat_type;
- }
-
- /* Else there's some kind of shambles */
-
- else
- {
- *errorptr = ERR11;
- goto FAILED;
- }
-
- /* In all case we no longer have a previous item. */
-
- END_REPEAT:
- previous = NULL;
- break;
-
-
- /* Start of nested bracket sub-expression, or comment or lookahead or
- lookbehind or option setting or condition. First deal with special things
- that can come after a bracket; all are introduced by ?, and the appearance
- of any of them means that this is not a referencing group. They were
- checked for validity in the first pass over the string, so we don't have to
- check for syntax errors here. */
-
- case '(':
- newoptions = options;
- condref = -1;
-
- if (*(++ptr) == '?')
- {
- int set, unset;
- int *optset;
-
- switch (*(++ptr))
- {
- case '#': /* Comment; skip to ket */
- ptr++;
- while (*ptr != ')') ptr++;
- continue;
-
- case ':': /* Non-extracting bracket */
- bravalue = OP_BRA;
- ptr++;
- break;
-
- case '(':
- bravalue = OP_COND; /* Conditional group */
- if ((cd->ctypes[*(++ptr)] & ctype_digit) != 0)
- {
- condref = *ptr - '0';
- while (*(++ptr) != ')') condref = condref*10 + *ptr - '0';
- if (condref == 0)
- {
- *errorptr = ERR35;
- goto FAILED;
- }
- ptr++;
- }
- else ptr--;
- break;
-
- case '=': /* Positive lookahead */
- bravalue = OP_ASSERT;
- ptr++;
- break;
-
- case '!': /* Negative lookahead */
- bravalue = OP_ASSERT_NOT;
- ptr++;
- break;
-
- case '<': /* Lookbehinds */
- switch (*(++ptr))
- {
- case '=': /* Positive lookbehind */
- bravalue = OP_ASSERTBACK;
- ptr++;
- break;
-
- case '!': /* Negative lookbehind */
- bravalue = OP_ASSERTBACK_NOT;
- ptr++;
- break;
-
- default: /* Syntax error */
- *errorptr = ERR24;
- goto FAILED;
- }
- break;
-
- case '>': /* One-time brackets */
- bravalue = OP_ONCE;
- ptr++;
- break;
-
- case 'R': /* Pattern recursion */
- *code++ = OP_RECURSE;
- ptr++;
- continue;
-
- default: /* Option setting */
- set = unset = 0;
- optset = &set;
-
- while (*ptr != ')' && *ptr != ':')
- {
- switch (*ptr++)
- {
- case '-': optset = &unset; break;
-
- case 'i': *optset |= PCRE_CASELESS; break;
- case 'm': *optset |= PCRE_MULTILINE; break;
- case 's': *optset |= PCRE_DOTALL; break;
- case 'x': *optset |= PCRE_EXTENDED; break;
- case 'U': *optset |= PCRE_UNGREEDY; break;
- case 'X': *optset |= PCRE_EXTRA; break;
-
- default:
- *errorptr = ERR12;
- goto FAILED;
- }
- }
-
- /* Set up the changed option bits, but don't change anything yet. */
-
- newoptions = (options | set) & (~unset);
-
- /* If the options ended with ')' this is not the start of a nested
- group with option changes, so the options change at this level. At top
- level there is nothing else to be done (the options will in fact have
- been set from the start of compiling as a result of the first pass) but
- at an inner level we must compile code to change the ims options if
- necessary, and pass the new setting back so that it can be put at the
- start of any following branches, and when this group ends, a resetting
- item can be compiled. */
-
- if (*ptr == ')')
- {
- if ((options & PCRE_INGROUP) != 0 &&
- (options & PCRE_IMS) != (newoptions & PCRE_IMS))
- {
- *code++ = OP_OPT;
- *code++ = *optchanged = newoptions & PCRE_IMS;
- }
- options = newoptions; /* Change options at this level */
- previous = NULL; /* This item can't be repeated */
- continue; /* It is complete */
- }
-
- /* If the options ended with ':' we are heading into a nested group
- with possible change of options. Such groups are non-capturing and are
- not assertions of any kind. All we need to do is skip over the ':';
- the newoptions value is handled below. */
-
- bravalue = OP_BRA;
- ptr++;
- }
- }
-
- /* Else we have a referencing group; adjust the opcode. */
-
- else
- {
- if (++(*brackets) > EXTRACT_MAX)
- {
- *errorptr = ERR13;
- goto FAILED;
- }
- bravalue = OP_BRA + *brackets;
- }
-
- /* Process nested bracketed re. Assertions may not be repeated, but other
- kinds can be. We copy code into a non-register variable in order to be able
- to pass its address because some compilers complain otherwise. Pass in a
- new setting for the ims options if they have changed. */
-
- previous = (bravalue >= OP_ONCE)? code : NULL;
- *code = bravalue;
- tempcode = code;
-
- if (!compile_regex(
- options | PCRE_INGROUP, /* Set for all nested groups */
- ((options & PCRE_IMS) != (newoptions & PCRE_IMS))?
- newoptions & PCRE_IMS : -1, /* Pass ims options if changed */
- brackets, /* Bracket level */
- &tempcode, /* Where to put code (updated) */
- &ptr, /* Input pointer (updated) */
- errorptr, /* Where to put an error message */
- (bravalue == OP_ASSERTBACK ||
- bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
- condref, /* Condition reference number */
- &subreqchar, /* For possible last char */
- &subcountlits, /* For literal count */
- cd)) /* Tables block */
- goto FAILED;
-
- /* At the end of compiling, code is still pointing to the start of the
- group, while tempcode has been updated to point past the end of the group
- and any option resetting that may follow it. The pattern pointer (ptr)
- is on the bracket. */
-
- /* If this is a conditional bracket, check that there are no more than
- two branches in the group. */
-
- if (bravalue == OP_COND)
- {
- uschar *tc = code;
- condcount = 0;
-
- do {
- condcount++;
- tc += (tc[1] << 8) | tc[2];
- }
- while (*tc != OP_KET);
-
- if (condcount > 2)
- {
- *errorptr = ERR27;
- goto FAILED;
- }
- }
-
- /* Handle updating of the required character. If the subpattern didn't
- set one, leave it as it was. Otherwise, update it for normal brackets of
- all kinds, forward assertions, and conditions with two branches. Don't
- update the literal count for forward assertions, however. If the bracket
- is followed by a quantifier with zero repeat, we have to back off. Hence
- the definition of prevreqchar and subcountlits outside the main loop so
- that they can be accessed for the back off. */
-
- if (subreqchar > 0 &&
- (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_ASSERT ||
- (bravalue == OP_COND && condcount == 2)))
- {
- prevreqchar = *reqchar;
- *reqchar = subreqchar;
- if (bravalue != OP_ASSERT) *countlits += subcountlits;
- }
-
- /* Now update the main code pointer to the end of the group. */
-
- code = tempcode;
-
- /* Error if hit end of pattern */
-
- if (*ptr != ')')
- {
- *errorptr = ERR14;
- goto FAILED;
- }
- break;
-
- /* Check \ for being a real metacharacter; if not, fall through and handle
- it as a data character at the start of a string. Escape items are checked
- for validity in the pre-compiling pass. */
-
- case '\\':
- tempptr = ptr;
- c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd);
-
- /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values
- are arranged to be the negation of the corresponding OP_values. For the
- back references, the values are ESC_REF plus the reference number. Only
- back references and those types that consume a character may be repeated.
- We can test for values between ESC_b and ESC_Z for the latter; this may
- have to change if any new ones are ever created. */
-
- if (c < 0)
- {
- if (-c >= ESC_REF)
- {
- previous = code;
- *code++ = OP_REF;
- *code++ = -c - ESC_REF;
- }
- else
- {
- previous = (-c > ESC_b && -c < ESC_Z)? code : NULL;
- *code++ = -c;
- }
- continue;
- }
-
- /* Data character: reset and fall through */
-
- ptr = tempptr;
- c = '\\';
-
- /* Handle a run of data characters until a metacharacter is encountered.
- The first character is guaranteed not to be whitespace or # when the
- extended flag is set. */
-
- NORMAL_CHAR:
- default:
- previous = code;
- *code = OP_CHARS;
- code += 2;
- length = 0;
-
- do
- {
- if ((options & PCRE_EXTENDED) != 0)
- {
- if ((cd->ctypes[c] & ctype_space) != 0) continue;
- if (c == '#')
- {
- /* The space before the ; is to avoid a warning on a silly compiler
- on the Macintosh. */
- while ((c = *(++ptr)) != 0 && c != '\n') ;
- if (c == 0) break;
- continue;
- }
- }
-
- /* Backslash may introduce a data char or a metacharacter. Escaped items
- are checked for validity in the pre-compiling pass. Stop the string
- before a metaitem. */
-
- if (c == '\\')
- {
- tempptr = ptr;
- c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd);
- if (c < 0) { ptr = tempptr; break; }
-
- /* If a character is > 127 in UTF-8 mode, we have to turn it into
- two or more characters in the UTF-8 encoding. */
-
-#ifdef SUPPORT_UTF8
- if (c > 127 && (options & PCRE_UTF8) != 0)
- {
- uschar buffer[8];
- int len = ord2utf8(c, buffer);
- for (c = 0; c < len; c++) *code++ = buffer[c];
- length += len;
- continue;
- }
-#endif
- }
-
- /* Ordinary character or single-char escape */
-
- *code++ = c;
- length++;
- }
-
- /* This "while" is the end of the "do" above. */
-
- while (length < MAXLIT && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0);
-
- /* Update the last character and the count of literals */
-
- prevreqchar = (length > 1)? code[-2] : *reqchar;
- *reqchar = code[-1];
- *countlits += length;
-
- /* Compute the length and set it in the data vector, and advance to
- the next state. */
-
- previous[1] = length;
- if (length < MAXLIT) ptr--;
- break;
- }
- } /* end of big loop */
-
-/* Control never reaches here by falling through, only by a goto for all the
-error states. Pass back the position in the pattern so that it can be displayed
-to the user for diagnosing the error. */
-
-FAILED:
-*ptrptr = ptr;
-return FALSE;
-}
-
-
-
-
-/*************************************************
-* Compile sequence of alternatives *
-*************************************************/
-
-/* On entry, ptr is pointing past the bracket character, but on return
-it points to the closing bracket, or vertical bar, or end of string.
-The code variable is pointing at the byte into which the BRA operator has been
-stored. If the ims options are changed at the start (for a (?ims: group) or
-during any branch, we need to insert an OP_OPT item at the start of every
-following branch to ensure they get set correctly at run time, and also pass
-the new options into every subsequent branch compile.
-
-Argument:
- options the option bits
- optchanged new ims options to set as if (?ims) were at the start, or -1
- for no change
- brackets -> int containing the number of extracting brackets used
- codeptr -> the address of the current code pointer
- ptrptr -> the address of the current pattern pointer
- errorptr -> pointer to error message
- lookbehind TRUE if this is a lookbehind assertion
- condref >= 0 for OPT_CREF setting at start of conditional group
- reqchar -> place to put the last required character, or a negative number
- countlits -> place to put the shortest literal count of any branch
- cd points to the data block with tables pointers
-
-Returns: TRUE on success
-*/
-
-static BOOL
-compile_regex(int options, int optchanged, int *brackets, uschar **codeptr,
- const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int condref,
- int *reqchar, int *countlits, compile_data *cd)
-{
-const uschar *ptr = *ptrptr;
-uschar *code = *codeptr;
-uschar *last_branch = code;
-uschar *start_bracket = code;
-uschar *reverse_count = NULL;
-int oldoptions = options & PCRE_IMS;
-int branchreqchar, branchcountlits;
-
-*reqchar = -1;
-*countlits = INT_MAX;
-code += 3;
-
-/* At the start of a reference-based conditional group, insert the reference
-number as an OP_CREF item. */
-
-if (condref >= 0)
- {
- *code++ = OP_CREF;
- *code++ = condref;
- }
-
-/* Loop for each alternative branch */
-
-for (;;)
- {
- int length;
-
- /* Handle change of options */
-
- if (optchanged >= 0)
- {
- *code++ = OP_OPT;
- *code++ = optchanged;
- options = (options & ~PCRE_IMS) | optchanged;
- }
-
- /* Set up dummy OP_REVERSE if lookbehind assertion */
-
- if (lookbehind)
- {
- *code++ = OP_REVERSE;
- reverse_count = code;
- *code++ = 0;
- *code++ = 0;
- }
-
- /* Now compile the branch */
-
- if (!compile_branch(options, brackets, &code, &ptr, errorptr, &optchanged,
- &branchreqchar, &branchcountlits, cd))
- {
- *ptrptr = ptr;
- return FALSE;
- }
-
- /* Fill in the length of the last branch */
-
- length = code - last_branch;
- last_branch[1] = length >> 8;
- last_branch[2] = length & 255;
-
- /* Save the last required character if all branches have the same; a current
- value of -1 means unset, while -2 means "previous branch had no last required
- char". */
-
- if (*reqchar != -2)
- {
- if (branchreqchar >= 0)
- {
- if (*reqchar == -1) *reqchar = branchreqchar;
- else if (*reqchar != branchreqchar) *reqchar = -2;
- }
- else *reqchar = -2;
- }
-
- /* Keep the shortest literal count */
-
- if (branchcountlits < *countlits) *countlits = branchcountlits;
- DPRINTF(("literal count = %d min=%d\n", branchcountlits, *countlits));
-
- /* If lookbehind, check that this branch matches a fixed-length string,
- and put the length into the OP_REVERSE item. Temporarily mark the end of
- the branch with OP_END. */
-
- if (lookbehind)
- {
- *code = OP_END;
- length = find_fixedlength(last_branch, options);
- DPRINTF(("fixed length = %d\n", length));
- if (length < 0)
- {
- *errorptr = ERR25;
- *ptrptr = ptr;
- return FALSE;
- }
- reverse_count[0] = (length >> 8);
- reverse_count[1] = length & 255;
- }
-
- /* Reached end of expression, either ')' or end of pattern. Insert a
- terminating ket and the length of the whole bracketed item, and return,
- leaving the pointer at the terminating char. If any of the ims options
- were changed inside the group, compile a resetting op-code following. */
-
- if (*ptr != '|')
- {
- length = code - start_bracket;
- *code++ = OP_KET;
- *code++ = length >> 8;
- *code++ = length & 255;
- if (optchanged >= 0)
- {
- *code++ = OP_OPT;
- *code++ = oldoptions;
- }
- *codeptr = code;
- *ptrptr = ptr;
- return TRUE;
- }
-
- /* Another branch follows; insert an "or" node and advance the pointer. */
-
- *code = OP_ALT;
- last_branch = code;
- code += 3;
- ptr++;
- }
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-* Find first significant op code *
-*************************************************/
-
-/* This is called by several functions that scan a compiled expression looking
-for a fixed first character, or an anchoring op code etc. It skips over things
-that do not influence this. For one application, a change of caseless option is
-important.
-
-Arguments:
- code pointer to the start of the group
- options pointer to external options
- optbit the option bit whose changing is significant, or
- zero if none are
- optstop TRUE to return on option change, otherwise change the options
- value and continue
-
-Returns: pointer to the first significant opcode
-*/
-
-static const uschar*
-first_significant_code(const uschar *code, int *options, int optbit,
- BOOL optstop)
-{
-for (;;)
- {
- switch ((int)*code)
- {
- case OP_OPT:
- if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit))
- {
- if (optstop) return code;
- *options = (int)code[1];
- }
- code += 2;
- break;
-
- case OP_CREF:
- code += 2;
- break;
-
- case OP_WORD_BOUNDARY:
- case OP_NOT_WORD_BOUNDARY:
- code++;
- break;
-
- case OP_ASSERT_NOT:
- case OP_ASSERTBACK:
- case OP_ASSERTBACK_NOT:
- do code += (code[1] << 8) + code[2]; while (*code == OP_ALT);
- code += 3;
- break;
-
- default:
- return code;
- }
- }
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-* Check for anchored expression *
-*************************************************/
-
-/* Try to find out if this is an anchored regular expression. Consider each
-alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket
-all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then
-it's anchored. However, if this is a multiline pattern, then only OP_SOD
-counts, since OP_CIRC can match in the middle.
-
-A branch is also implicitly anchored if it starts with .* and DOTALL is set,
-because that will try the rest of the pattern at all possible matching points,
-so there is no point trying them again.
-
-Arguments:
- code points to start of expression (the bracket)
- options points to the options setting
-
-Returns: TRUE or FALSE
-*/
-
-static BOOL
-is_anchored(register const uschar *code, int *options)
-{
-do {
- const uschar *scode = first_significant_code(code + 3, options,
- PCRE_MULTILINE, FALSE);
- register int op = *scode;
- if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
- { if (!is_anchored(scode, options)) return FALSE; }
- else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) &&
- (*options & PCRE_DOTALL) != 0)
- { if (scode[1] != OP_ANY) return FALSE; }
- else if (op != OP_SOD &&
- ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))
- return FALSE;
- code += (code[1] << 8) + code[2];
- }
-while (*code == OP_ALT);
-return TRUE;
-}
-
-
-
-/*************************************************
-* Check for starting with ^ or .* *
-*************************************************/
-
-/* This is called to find out if every branch starts with ^ or .* so that
-"first char" processing can be done to speed things up in multiline
-matching and for non-DOTALL patterns that start with .* (which must start at
-the beginning or after \n).
-
-Argument: points to start of expression (the bracket)
-Returns: TRUE or FALSE
-*/
-
-static BOOL
-is_startline(const uschar *code)
-{
-do {
- const uschar *scode = first_significant_code(code + 3, NULL, 0, FALSE);
- register int op = *scode;
- if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
- { if (!is_startline(scode)) return FALSE; }
- else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR)
- { if (scode[1] != OP_ANY) return FALSE; }
- else if (op != OP_CIRC) return FALSE;
- code += (code[1] << 8) + code[2];
- }
-while (*code == OP_ALT);
-return TRUE;
-}
-
-
-
-/*************************************************
-* Check for fixed first char *
-*************************************************/
-
-/* Try to find out if there is a fixed first character. This is called for
-unanchored expressions, as it speeds up their processing quite considerably.
-Consider each alternative branch. If they all start with the same char, or with
-a bracket all of whose alternatives start with the same char (recurse ad lib),
-then we return that char, otherwise -1.
-
-Arguments:
- code points to start of expression (the bracket)
- options pointer to the options (used to check casing changes)
-
-Returns: -1 or the fixed first char
-*/
-
-static int
-find_firstchar(const uschar *code, int *options)
-{
-register int c = -1;
-do {
- int d;
- const uschar *scode = first_significant_code(code + 3, options,
- PCRE_CASELESS, TRUE);
- register int op = *scode;
-
- if (op >= OP_BRA) op = OP_BRA;
-
- switch(op)
- {
- default:
- return -1;
-
- case OP_BRA:
- case OP_ASSERT:
- case OP_ONCE:
- case OP_COND:
- if ((d = find_firstchar(scode, options)) < 0) return -1;
- if (c < 0) c = d; else if (c != d) return -1;
- break;
-
- case OP_EXACT: /* Fall through */
- scode++;
-
- case OP_CHARS: /* Fall through */
- scode++;
-
- case OP_PLUS:
- case OP_MINPLUS:
- if (c < 0) c = scode[1]; else if (c != scode[1]) return -1;
- break;
- }
-
- code += (code[1] << 8) + code[2];
- }
-while (*code == OP_ALT);
-return c;
-}
-
-
-
-
-
-/*************************************************
-* Compile a Regular Expression *
-*************************************************/
-
-/* This function takes a string and returns a pointer to a block of store
-holding a compiled version of the expression.
-
-Arguments:
- pattern the regular expression
- options various option bits
- errorptr pointer to pointer to error text
- erroroffset ptr offset in pattern where error was detected
- tables pointer to character tables or NULL
-
-Returns: pointer to compiled data block, or NULL on error,
- with errorptr and erroroffset set
-*/
-
-pcre *
-pcre_compile(const char *pattern, int options, const char **errorptr,
- int *erroroffset, const unsigned char *tables)
-{
-real_pcre *re;
-int length = 3; /* For initial BRA plus length */
-int runlength;
-int c, reqchar, countlits;
-int bracount = 0;
-int top_backref = 0;
-int branch_extra = 0;
-int branch_newextra;
-unsigned int brastackptr = 0;
-size_t size;
-uschar *code;
-const uschar *ptr;
-compile_data compile_block;
-int brastack[BRASTACK_SIZE];
-uschar bralenstack[BRASTACK_SIZE];
-
-#ifdef DEBUG
-uschar *code_base, *code_end;
-#endif
-
-/* Can't support UTF8 unless PCRE has been compiled to include the code. */
-
-#ifndef SUPPORT_UTF8
-if ((options & PCRE_UTF8) != 0)
- {
- *errorptr = ERR32;
- return NULL;
- }
-#endif
-
-/* We can't pass back an error message if errorptr is NULL; I guess the best we
-can do is just return NULL. */
-
-if (errorptr == NULL) return NULL;
-*errorptr = NULL;
-
-/* However, we can give a message for this error */
-
-if (erroroffset == NULL)
- {
- *errorptr = ERR16;
- return NULL;
- }
-*erroroffset = 0;
-
-if ((options & ~PUBLIC_OPTIONS) != 0)
- {
- *errorptr = ERR17;
- return NULL;
- }
-
-/* Set up pointers to the individual character tables */
-
-if (tables == NULL) tables = pcre_default_tables;
-compile_block.lcc = tables + lcc_offset;
-compile_block.fcc = tables + fcc_offset;
-compile_block.cbits = tables + cbits_offset;
-compile_block.ctypes = tables + ctypes_offset;
-
-/* Reflect pattern for debugging output */
-
-DPRINTF(("------------------------------------------------------------------\n"));
-DPRINTF(("%s\n", pattern));
-
-/* The first thing to do is to make a pass over the pattern to compute the
-amount of store required to hold the compiled code. This does not have to be
-perfect as long as errors are overestimates. At the same time we can detect any
-internal flag settings. Make an attempt to correct for any counted white space
-if an "extended" flag setting appears late in the pattern. We can't be so
-clever for #-comments. */
-
-ptr = (const uschar *)(pattern - 1);
-while ((c = *(++ptr)) != 0)
- {
- int min, max;
- int class_charcount;
-
- if ((options & PCRE_EXTENDED) != 0)
- {
- if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
- if (c == '#')
- {
- /* The space before the ; is to avoid a warning on a silly compiler
- on the Macintosh. */
- while ((c = *(++ptr)) != 0 && c != '\n') ;
- continue;
- }
- }
-
- switch(c)
- {
- /* A backslashed item may be an escaped "normal" character or a
- character type. For a "normal" character, put the pointers and
- character back so that tests for whitespace etc. in the input
- are done correctly. */
-
- case '\\':
- {
- const uschar *save_ptr = ptr;
- c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block);
- if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
- if (c >= 0)
- {
- ptr = save_ptr;
- c = '\\';
- goto NORMAL_CHAR;
- }
- }
- length++;
-
- /* A back reference needs an additional char, plus either one or 5
- bytes for a repeat. We also need to keep the value of the highest
- back reference. */
-
- if (c <= -ESC_REF)
- {
- int refnum = -c - ESC_REF;
- if (refnum > top_backref) top_backref = refnum;
- length++; /* For single back reference */
- if (ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
- {
- ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
- if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
- if ((min == 0 && (max == 1 || max == -1)) ||
- (min == 1 && max == -1))
- length++;
- else length += 5;
- if (ptr[1] == '?') ptr++;
- }
- }
- continue;
-
- case '^':
- case '.':
- case '$':
- case '*': /* These repeats won't be after brackets; */
- case '+': /* those are handled separately */
- case '?':
- length++;
- continue;
-
- /* This covers the cases of repeats after a single char, metachar, class,
- or back reference. */
-
- case '{':
- if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR;
- ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block);
- if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
- if ((min == 0 && (max == 1 || max == -1)) ||
- (min == 1 && max == -1))
- length++;
- else
- {
- length--; /* Uncount the original char or metachar */
- if (min == 1) length++; else if (min > 0) length += 4;
- if (max > 0) length += 4; else length += 2;
- }
- if (ptr[1] == '?') ptr++;
- continue;
-
- /* An alternation contains an offset to the next branch or ket. If any ims
- options changed in the previous branch(es), and/or if we are in a
- lookbehind assertion, extra space will be needed at the start of the
- branch. This is handled by branch_extra. */
-
- case '|':
- length += 3 + branch_extra;
- continue;
-
- /* A character class uses 33 characters. Don't worry about character types
- that aren't allowed in classes - they'll get picked up during the compile.
- A character class that contains only one character uses 2 or 3 bytes,
- depending on whether it is negated or not. Notice this where we can. */
-
- case '[':
- class_charcount = 0;
- if (*(++ptr) == '^') ptr++;
- do
- {
- if (*ptr == '\\')
- {
- int ch = check_escape(&ptr, errorptr, bracount, options, TRUE,
- &compile_block);
- if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
- if (-ch == ESC_b) class_charcount++; else class_charcount = 10;
- }
- else class_charcount++;
- ptr++;
- }
- while (*ptr != 0 && *ptr != ']');
-
- /* Repeats for negated single chars are handled by the general code */
-
- if (class_charcount == 1) length += 3; else
- {
- length += 33;
-
- /* A repeat needs either 1 or 5 bytes. */
-
- if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
- {
- ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
- if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
- if ((min == 0 && (max == 1 || max == -1)) ||
- (min == 1 && max == -1))
- length++;
- else length += 5;
- if (ptr[1] == '?') ptr++;
- }
- }
- continue;
-
- /* Brackets may be genuine groups or special things */
-
- case '(':
- branch_newextra = 0;
-
- /* Handle special forms of bracket, which all start (? */
-
- if (ptr[1] == '?')
- {
- int set, unset;
- int *optset;
-
- switch (c = ptr[2])
- {
- /* Skip over comments entirely */
- case '#':
- ptr += 3;
- while (*ptr != 0 && *ptr != ')') ptr++;
- if (*ptr == 0)
- {
- *errorptr = ERR18;
- goto PCRE_ERROR_RETURN;
- }
- continue;
-
- /* Non-referencing groups and lookaheads just move the pointer on, and
- then behave like a non-special bracket, except that they don't increment
- the count of extracting brackets. Ditto for the "once only" bracket,
- which is in Perl from version 5.005. */
-
- case ':':
- case '=':
- case '!':
- case '>':
- ptr += 2;
- break;
-
- /* A recursive call to the regex is an extension, to provide the
- facility which can be obtained by $(?p{perl-code}) in Perl 5.6. */
-
- case 'R':
- if (ptr[3] != ')')
- {
- *errorptr = ERR29;
- goto PCRE_ERROR_RETURN;
- }
- ptr += 3;
- length += 1;
- break;
-
- /* Lookbehinds are in Perl from version 5.005 */
-
- case '<':
- if (ptr[3] == '=' || ptr[3] == '!')
- {
- ptr += 3;
- branch_newextra = 3;
- length += 3; /* For the first branch */
- break;
- }
- *errorptr = ERR24;
- goto PCRE_ERROR_RETURN;
-
- /* Conditionals are in Perl from version 5.005. The bracket must either
- be followed by a number (for bracket reference) or by an assertion
- group. */
-
- case '(':
- if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0)
- {
- ptr += 4;
- length += 2;
- while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++;
- if (*ptr != ')')
- {
- *errorptr = ERR26;
- goto PCRE_ERROR_RETURN;
- }
- }
- else /* An assertion must follow */
- {
- ptr++; /* Can treat like ':' as far as spacing is concerned */
- if (ptr[2] != '?' ||
- (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') )
- {
- ptr += 2; /* To get right offset in message */
- *errorptr = ERR28;
- goto PCRE_ERROR_RETURN;
- }
- }
- break;
-
- /* Else loop checking valid options until ) is met. Anything else is an
- error. If we are without any brackets, i.e. at top level, the settings
- act as if specified in the options, so massage the options immediately.
- This is for backward compatibility with Perl 5.004. */
-
- default:
- set = unset = 0;
- optset = &set;
- ptr += 2;
-
- for (;; ptr++)
- {
- c = *ptr;
- switch (c)
- {
- case 'i':
- *optset |= PCRE_CASELESS;
- continue;
-
- case 'm':
- *optset |= PCRE_MULTILINE;
- continue;
-
- case 's':
- *optset |= PCRE_DOTALL;
- continue;
-
- case 'x':
- *optset |= PCRE_EXTENDED;
- continue;
-
- case 'X':
- *optset |= PCRE_EXTRA;
- continue;
-
- case 'U':
- *optset |= PCRE_UNGREEDY;
- continue;
-
- case '-':
- optset = &unset;
- continue;
-
- /* A termination by ')' indicates an options-setting-only item;
- this is global at top level; otherwise nothing is done here and
- it is handled during the compiling process on a per-bracket-group
- basis. */
-
- case ')':
- if (brastackptr == 0)
- {
- options = (options | set) & (~unset);
- set = unset = 0; /* To save length */
- }
- /* Fall through */
-
- /* A termination by ':' indicates the start of a nested group with
- the given options set. This is again handled at compile time, but
- we must allow for compiled space if any of the ims options are
- set. We also have to allow for resetting space at the end of
- the group, which is why 4 is added to the length and not just 2.
- If there are several changes of options within the same group, this
- will lead to an over-estimate on the length, but this shouldn't
- matter very much. We also have to allow for resetting options at
- the start of any alternations, which we do by setting
- branch_newextra to 2. Finally, we record whether the case-dependent
- flag ever changes within the regex. This is used by the "required
- character" code. */
-
- case ':':
- if (((set|unset) & PCRE_IMS) != 0)
- {
- length += 4;
- branch_newextra = 2;
- if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;
- }
- goto END_OPTIONS;
-
- /* Unrecognized option character */
-
- default:
- *errorptr = ERR12;
- goto PCRE_ERROR_RETURN;
- }
- }
-
- /* If we hit a closing bracket, that's it - this is a freestanding
- option-setting. We need to ensure that branch_extra is updated if
- necessary. The only values branch_newextra can have here are 0 or 2.
- If the value is 2, then branch_extra must either be 2 or 5, depending
- on whether this is a lookbehind group or not. */
-
- END_OPTIONS:
- if (c == ')')
- {
- if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3))
- branch_extra += branch_newextra;
- continue;
- }
-
- /* If options were terminated by ':' control comes here. Fall through
- to handle the group below. */
- }
- }
-
- /* Extracting brackets must be counted so we can process escapes in a
- Perlish way. */
-
- else bracount++;
-
- /* Non-special forms of bracket. Save length for computing whole length
- at end if there's a repeat that requires duplication of the group. Also
- save the current value of branch_extra, and start the new group with
- the new value. If non-zero, this will either be 2 for a (?imsx: group, or 3
- for a lookbehind assertion. */
-
- if (brastackptr >= sizeof(brastack)/sizeof(int))
- {
- *errorptr = ERR19;
- goto PCRE_ERROR_RETURN;
- }
-
- bralenstack[brastackptr] = branch_extra;
- branch_extra = branch_newextra;
-
- brastack[brastackptr++] = length;
- length += 3;
- continue;
-
- /* Handle ket. Look for subsequent max/min; for certain sets of values we
- have to replicate this bracket up to that many times. If brastackptr is
- 0 this is an unmatched bracket which will generate an error, but take care
- not to try to access brastack[-1] when computing the length and restoring
- the branch_extra value. */
-
- case ')':
- length += 3;
- {
- int minval = 1;
- int maxval = 1;
- int duplength;
-
- if (brastackptr > 0)
- {
- duplength = length - brastack[--brastackptr];
- branch_extra = bralenstack[brastackptr];
- }
- else duplength = 0;
-
- /* Leave ptr at the final char; for read_repeat_counts this happens
- automatically; for the others we need an increment. */
-
- if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2, &compile_block))
- {
- ptr = read_repeat_counts(ptr+2, &minval, &maxval, errorptr,
- &compile_block);
- if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
- }
- else if (c == '*') { minval = 0; maxval = -1; ptr++; }
- else if (c == '+') { maxval = -1; ptr++; }
- else if (c == '?') { minval = 0; ptr++; }
-
- /* If the minimum is zero, we have to allow for an OP_BRAZERO before the
- group, and if the maximum is greater than zero, we have to replicate
- maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting
- bracket set - hence the 7. */
-
- if (minval == 0)
- {
- length++;
- if (maxval > 0) length += (maxval - 1) * (duplength + 7);
- }
-
- /* When the minimum is greater than zero, 1 we have to replicate up to
- minval-1 times, with no additions required in the copies. Then, if
- there is a limited maximum we have to replicate up to maxval-1 times
- allowing for a BRAZERO item before each optional copy and nesting
- brackets for all but one of the optional copies. */
-
- else
- {
- length += (minval - 1) * duplength;
- if (maxval > minval) /* Need this test as maxval=-1 means no limit */
- length += (maxval - minval) * (duplength + 7) - 6;
- }
- }
- continue;
-
- /* Non-special character. For a run of such characters the length required
- is the number of characters + 2, except that the maximum run length is 255.
- We won't get a skipped space or a non-data escape or the start of a #
- comment as the first character, so the length can't be zero. */
-
- NORMAL_CHAR:
- default:
- length += 2;
- runlength = 0;
- do
- {
- if ((options & PCRE_EXTENDED) != 0)
- {
- if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
- if (c == '#')
- {
- /* The space before the ; is to avoid a warning on a silly compiler
- on the Macintosh. */
- while ((c = *(++ptr)) != 0 && c != '\n') ;
- continue;
- }
- }
-
- /* Backslash may introduce a data char or a metacharacter; stop the
- string before the latter. */
-
- if (c == '\\')
- {
- const uschar *saveptr = ptr;
- c = check_escape(&ptr, errorptr, bracount, options, FALSE,
- &compile_block);
- if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
- if (c < 0) { ptr = saveptr; break; }
-
-#ifdef SUPPORT_UTF8
- if (c > 127 && (options & PCRE_UTF8) != 0)
- {
- int i;
- for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
- if (c <= utf8_table1[i]) break;
- runlength += i;
- }
-#endif
- }
-
- /* Ordinary character or single-char escape */
-
- runlength++;
- }
-
- /* This "while" is the end of the "do" above. */
-
- while (runlength < MAXLIT &&
- (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0);
-
- ptr--;
- length += runlength;
- continue;
- }
- }
-
-length += 4; /* For final KET and END */
-
-if (length > 65539)
- {
- *errorptr = ERR20;
- return NULL;
- }
-
-/* Compute the size of data block needed and get it, either from malloc or
-externally provided function. We specify "code[0]" in the offsetof() expression
-rather than just "code", because it has been reported that one broken compiler
-fails on "code" because it is also an independent variable. It should make no
-difference to the value of the offsetof(). */
-
-size = length + offsetof(real_pcre, code[0]);
-re = (real_pcre *)(pcre_malloc)(size);
-
-if (re == NULL)
- {
- *errorptr = ERR21;
- return NULL;
- }
-
-/* Put in the magic number, and save the size, options, and table pointer */
-
-re->magic_number = MAGIC_NUMBER;
-re->size = size;
-re->options = options;
-re->tables = tables;
-
-/* Set up a starting, non-extracting bracket, then compile the expression. On
-error, *errorptr will be set non-NULL, so we don't need to look at the result
-of the function here. */
-
-ptr = (const uschar *)pattern;
-code = re->code;
-*code = OP_BRA;
-bracount = 0;
-(void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, -1,
- &reqchar, &countlits, &compile_block);
-re->top_bracket = bracount;
-re->top_backref = top_backref;
-
-/* If not reached end of pattern on success, there's an excess bracket. */
-
-if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22;
-
-/* Fill in the terminating state and check for disastrous overflow, but
-if debugging, leave the test till after things are printed out. */
-
-*code++ = OP_END;
-
-#ifndef DEBUG
-if (code - re->code > length) *errorptr = ERR23;
-#endif
-
-/* Give an error if there's back reference to a non-existent capturing
-subpattern. */
-
-if (top_backref > re->top_bracket) *errorptr = ERR15;
-
-/* Failed to compile */
-
-if (*errorptr != NULL)
- {
- (pcre_free)(re);
- PCRE_ERROR_RETURN:
- *erroroffset = ptr - (const uschar *)pattern;
- return NULL;
- }
-
-/* If the anchored option was not passed, set flag if we can determine that the
-pattern is anchored by virtue of ^ characters or \A or anything else (such as
-starting with .* when DOTALL is set).
-
-Otherwise, see if we can determine what the first character has to be, because
-that speeds up unanchored matches no end. If not, see if we can set the
-PCRE_STARTLINE flag. This is helpful for multiline matches when all branches
-start with ^. and also when all branches start with .* for non-DOTALL matches.
-*/
-
-if ((options & PCRE_ANCHORED) == 0)
- {
- int temp_options = options;
- if (is_anchored(re->code, &temp_options))
- re->options |= PCRE_ANCHORED;
- else
- {
- int ch = find_firstchar(re->code, &temp_options);
- if (ch >= 0)
- {
- re->first_char = ch;
- re->options |= PCRE_FIRSTSET;
- }
- else if (is_startline(re->code))
- re->options |= PCRE_STARTLINE;
- }
- }
-
-/* Save the last required character if there are at least two literal
-characters on all paths, or if there is no first character setting. */
-
-if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0))
- {
- re->req_char = reqchar;
- re->options |= PCRE_REQCHSET;
- }
-
-/* Print out the compiled data for debugging */
-
-#ifdef DEBUG
-
-printf("Length = %d top_bracket = %d top_backref = %d\n",
- length, re->top_bracket, re->top_backref);
-
-if (re->options != 0)
- {
- printf("%s%s%s%s%s%s%s%s%s\n",
- ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
- ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
- ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",
- ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
- ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
- ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
- ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",
- ((re->options & PCRE_EXTRA) != 0)? "extra " : "",
- ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");
- }
-
-if ((re->options & PCRE_FIRSTSET) != 0)
- {
- if (isprint(re->first_char)) printf("First char = %c\n", re->first_char);
- else printf("First char = \\x%02x\n", re->first_char);
- }
-
-if ((re->options & PCRE_REQCHSET) != 0)
- {
- if (isprint(re->req_char)) printf("Req char = %c\n", re->req_char);
- else printf("Req char = \\x%02x\n", re->req_char);
- }
-
-code_end = code;
-code_base = code = re->code;
-
-while (code < code_end)
- {
- int charlength;
-
- printf("%3d ", code - code_base);
-
- if (*code >= OP_BRA)
- {
- printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);
- code += 2;
- }
-
- else switch(*code)
- {
- case OP_OPT:
- printf(" %.2x %s", code[1], OP_names[*code]);
- code++;
- break;
-
- case OP_COND:
- printf("%3d Cond", (code[1] << 8) + code[2]);
- code += 2;
- break;
-
- case OP_CREF:
- printf(" %.2d %s", code[1], OP_names[*code]);
- code++;
- break;
-
- case OP_CHARS:
- charlength = *(++code);
- printf("%3d ", charlength);
- while (charlength-- > 0)
- if (isprint(c = *(++code))) printf("%c", c); else printf("\\x%02x", c);
- break;
-
- case OP_KETRMAX:
- case OP_KETRMIN:
- case OP_ALT:
- case OP_KET:
- case OP_ASSERT:
- case OP_ASSERT_NOT:
- case OP_ASSERTBACK:
- case OP_ASSERTBACK_NOT:
- case OP_ONCE:
- printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
- code += 2;
- break;
-
- case OP_REVERSE:
- printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
- code += 2;
- break;
-
- case OP_STAR:
- case OP_MINSTAR:
- case OP_PLUS:
- case OP_MINPLUS:
- case OP_QUERY:
- case OP_MINQUERY:
- case OP_TYPESTAR:
- case OP_TYPEMINSTAR:
- case OP_TYPEPLUS:
- case OP_TYPEMINPLUS:
- case OP_TYPEQUERY:
- case OP_TYPEMINQUERY:
- if (*code >= OP_TYPESTAR)
- printf(" %s", OP_names[code[1]]);
- else if (isprint(c = code[1])) printf(" %c", c);
- else printf(" \\x%02x", c);
- printf("%s", OP_names[*code++]);
- break;
-
- case OP_EXACT:
- case OP_UPTO:
- case OP_MINUPTO:
- if (isprint(c = code[3])) printf(" %c{", c);
- else printf(" \\x%02x{", c);
- if (*code != OP_EXACT) printf("0,");
- printf("%d}", (code[1] << 8) + code[2]);
- if (*code == OP_MINUPTO) printf("?");
- code += 3;
- break;
-
- case OP_TYPEEXACT:
- case OP_TYPEUPTO:
- case OP_TYPEMINUPTO:
- printf(" %s{", OP_names[code[3]]);
- if (*code != OP_TYPEEXACT) printf(",");
- printf("%d}", (code[1] << 8) + code[2]);
- if (*code == OP_TYPEMINUPTO) printf("?");
- code += 3;
- break;
-
- case OP_NOT:
- if (isprint(c = *(++code))) printf(" [^%c]", c);
- else printf(" [^\\x%02x]", c);
- break;
-
- case OP_NOTSTAR:
- case OP_NOTMINSTAR:
- case OP_NOTPLUS:
- case OP_NOTMINPLUS:
- case OP_NOTQUERY:
- case OP_NOTMINQUERY:
- if (isprint(c = code[1])) printf(" [^%c]", c);
- else printf(" [^\\x%02x]", c);
- printf("%s", OP_names[*code++]);
- break;
-
- case OP_NOTEXACT:
- case OP_NOTUPTO:
- case OP_NOTMINUPTO:
- if (isprint(c = code[3])) printf(" [^%c]{", c);
- else printf(" [^\\x%02x]{", c);
- if (*code != OP_NOTEXACT) printf(",");
- printf("%d}", (code[1] << 8) + code[2]);
- if (*code == OP_NOTMINUPTO) printf("?");
- code += 3;
- break;
-
- case OP_REF:
- printf(" \\%d", *(++code));
- code ++;
- goto CLASS_REF_REPEAT;
-
- case OP_CLASS:
- {
- int i, min, max;
- code++;
- printf(" [");
-
- for (i = 0; i < 256; i++)
- {
- if ((code[i/8] & (1 << (i&7))) != 0)
- {
- int j;
- for (j = i+1; j < 256; j++)
- if ((code[j/8] & (1 << (j&7))) == 0) break;
- if (i == '-' || i == ']') printf("\\");
- if (isprint(i)) printf("%c", i); else printf("\\x%02x", i);
- if (--j > i)
- {
- printf("-");
- if (j == '-' || j == ']') printf("\\");
- if (isprint(j)) printf("%c", j); else printf("\\x%02x", j);
- }
- i = j;
- }
- }
- printf("]");
- code += 32;
-
- CLASS_REF_REPEAT:
-
- switch(*code)
- {
- case OP_CRSTAR:
- case OP_CRMINSTAR:
- case OP_CRPLUS:
- case OP_CRMINPLUS:
- case OP_CRQUERY:
- case OP_CRMINQUERY:
- printf("%s", OP_names[*code]);
- break;
-
- case OP_CRRANGE:
- case OP_CRMINRANGE:
- min = (code[1] << 8) + code[2];
- max = (code[3] << 8) + code[4];
- if (max == 0) printf("{%d,}", min);
- else printf("{%d,%d}", min, max);
- if (*code == OP_CRMINRANGE) printf("?");
- code += 4;
- break;
-
- default:
- code--;
- }
- }
- break;
-
- /* Anything else is just a one-node item */
-
- default:
- printf(" %s", OP_names[*code]);
- break;
- }
-
- code++;
- printf("\n");
- }
-printf("------------------------------------------------------------------\n");
-
-/* This check is done here in the debugging case so that the code that
-was compiled can be seen. */
-
-if (code - re->code > length)
- {
- *errorptr = ERR23;
- (pcre_free)(re);
- *erroroffset = ptr - (uschar *)pattern;
- return NULL;
- }
-#endif
-
-return (pcre *)re;
-}
-
-
-
-/*************************************************
-* Match a back-reference *
-*************************************************/
-
-/* If a back reference hasn't been set, the length that is passed is greater
-than the number of characters left in the string, so the match fails.
-
-Arguments:
- offset index into the offset vector
- eptr points into the subject
- length length to be matched
- md points to match data block
- ims the ims flags
-
-Returns: TRUE if matched
-*/
-
-static BOOL
-match_ref(int offset, register const uschar *eptr, int length, match_data *md,
- unsigned long int ims)
-{
-const uschar *p = md->start_subject + md->offset_vector[offset];
-
-#ifdef DEBUG
-if (eptr >= md->end_subject)
- printf("matching subject <null>");
-else
- {
- printf("matching subject ");
- pchars(eptr, length, TRUE, md);
- }
-printf(" against backref ");
-pchars(p, length, FALSE, md);
-printf("\n");
-#endif
-
-/* Always fail if not enough characters left */
-
-if (length > md->end_subject - eptr) return FALSE;
-
-/* Separate the caselesss case for speed */
-
-if ((ims & PCRE_CASELESS) != 0)
- {
- while (length-- > 0)
- if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE;
- }
-else
- { while (length-- > 0) if (*p++ != *eptr++) return FALSE; }
-
-return TRUE;
-}
-
-
-
-/*************************************************
-* Match from current position *
-*************************************************/
-
-/* On entry ecode points to the first opcode, and eptr to the first character
-in the subject string, while eptrb holds the value of eptr at the start of the
-last bracketed group - used for breaking infinite loops matching zero-length
-strings.
-
-Arguments:
- eptr pointer in subject
- ecode position in code
- offset_top current top pointer
- md pointer to "static" info for the match
- ims current /i, /m, and /s options
- eptrb pointer to chain of blocks containing eptr at start of
- brackets - for testing for empty matches
- flags can contain
- match_condassert - this is an assertion condition
- match_isgroup - this is the start of a bracketed group
-
-Returns: TRUE if matched
-*/
-
-static BOOL
-match(register const uschar *eptr, register const uschar *ecode,
- int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb,
- int flags)
-{
-unsigned long int original_ims = ims; /* Save for resetting on ')' */
-eptrblock newptrb;
-
-/* At the start of a bracketed group, add the current subject pointer to the
-stack of such pointers, to be re-instated at the end of the group when we hit
-the closing ket. When match() is called in other circumstances, we don't add to
-the stack. */
-
-if ((flags & match_isgroup) != 0)
- {
- newptrb.prev = eptrb;
- newptrb.saved_eptr = eptr;
- eptrb = &newptrb;
- }
-
-/* Now start processing the operations. */
-
-for (;;)
- {
- int op = (int)*ecode;
- int min, max, ctype;
- register int i;
- register int c;
- BOOL minimize = FALSE;
-
- /* Opening capturing bracket. If there is space in the offset vector, save
- the current subject position in the working slot at the top of the vector. We
- mustn't change the current values of the data slot, because they may be set
- from a previous iteration of this group, and be referred to by a reference
- inside the group.
-
- If the bracket fails to match, we need to restore this value and also the
- values of the final offsets, in case they were set by a previous iteration of
- the same bracket.
-
- If there isn't enough space in the offset vector, treat this as if it were a
- non-capturing bracket. Don't worry about setting the flag for the error case
- here; that is handled in the code for KET. */
-
- if (op > OP_BRA)
- {
- int number = op - OP_BRA;
- int offset = number << 1;
-
-#ifdef DEBUG
- printf("start bracket %d subject=", number);
- pchars(eptr, 16, TRUE, md);
- printf("\n");
-#endif
-
- if (offset < md->offset_max)
- {
- int save_offset1 = md->offset_vector[offset];
- int save_offset2 = md->offset_vector[offset+1];
- int save_offset3 = md->offset_vector[md->offset_end - number];
-
- DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
- md->offset_vector[md->offset_end - number] = eptr - md->start_subject;
-
- do
- {
- if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
- return TRUE;
- ecode += (ecode[1] << 8) + ecode[2];
- }
- while (*ecode == OP_ALT);
-
- DPRINTF(("bracket %d failed\n", number));
-
- md->offset_vector[offset] = save_offset1;
- md->offset_vector[offset+1] = save_offset2;
- md->offset_vector[md->offset_end - number] = save_offset3;
- return FALSE;
- }
-
- /* Insufficient room for saving captured contents */
-
- else op = OP_BRA;
- }
-
- /* Other types of node can be handled by a switch */
-
- switch(op)
- {
- case OP_BRA: /* Non-capturing bracket: optimized */
- DPRINTF(("start bracket 0\n"));
- do
- {
- if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
- return TRUE;
- ecode += (ecode[1] << 8) + ecode[2];
- }
- while (*ecode == OP_ALT);
- DPRINTF(("bracket 0 failed\n"));
- return FALSE;
-
- /* Conditional group: compilation checked that there are no more than
- two branches. If the condition is false, skipping the first branch takes us
- past the end if there is only one branch, but that's OK because that is
- exactly what going to the ket would do. */
-
- case OP_COND:
- if (ecode[3] == OP_CREF) /* Condition is extraction test */
- {
- int offset = ecode[4] << 1; /* Doubled reference number */
- return match(eptr,
- ecode + ((offset < offset_top && md->offset_vector[offset] >= 0)?
- 5 : 3 + (ecode[1] << 8) + ecode[2]),
- offset_top, md, ims, eptrb, match_isgroup);
- }
-
- /* The condition is an assertion. Call match() to evaluate it - setting
- the final argument TRUE causes it to stop at the end of an assertion. */
-
- else
- {
- if (match(eptr, ecode+3, offset_top, md, ims, NULL,
- match_condassert | match_isgroup))
- {
- ecode += 3 + (ecode[4] << 8) + ecode[5];
- while (*ecode == OP_ALT) ecode += (ecode[1] << 8) + ecode[2];
- }
- else ecode += (ecode[1] << 8) + ecode[2];
- return match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup);
- }
- /* Control never reaches here */
-
- /* Skip over conditional reference data if encountered (should not be) */
-
- case OP_CREF:
- ecode += 2;
- break;
-
- /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched
- an empty string - recursion will then try other alternatives, if any. */
-
- case OP_END:
- if (md->notempty && eptr == md->start_match) return FALSE;
- md->end_match_ptr = eptr; /* Record where we ended */
- md->end_offset_top = offset_top; /* and how many extracts were taken */
- return TRUE;
-
- /* Change option settings */
-
- case OP_OPT:
- ims = ecode[1];
- ecode += 2;
- DPRINTF(("ims set to %02lx\n", ims));
- break;
-
- /* Assertion brackets. Check the alternative branches in turn - the
- matching won't pass the KET for an assertion. If any one branch matches,
- the assertion is true. Lookbehind assertions have an OP_REVERSE item at the
- start of each branch to move the current point backwards, so the code at
- this level is identical to the lookahead case. */
-
- case OP_ASSERT:
- case OP_ASSERTBACK:
- do
- {
- if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) break;
- ecode += (ecode[1] << 8) + ecode[2];
- }
- while (*ecode == OP_ALT);
- if (*ecode == OP_KET) return FALSE;
-
- /* If checking an assertion for a condition, return TRUE. */
-
- if ((flags & match_condassert) != 0) return TRUE;
-
- /* Continue from after the assertion, updating the offsets high water
- mark, since extracts may have been taken during the assertion. */
-
- do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT);
- ecode += 3;
- offset_top = md->end_offset_top;
- continue;
-
- /* Negative assertion: all branches must fail to match */
-
- case OP_ASSERT_NOT:
- case OP_ASSERTBACK_NOT:
- do
- {
- if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup))
- return FALSE;
- ecode += (ecode[1] << 8) + ecode[2];
- }
- while (*ecode == OP_ALT);
-
- if ((flags & match_condassert) != 0) return TRUE;
-
- ecode += 3;
- continue;
-
- /* Move the subject pointer back. This occurs only at the start of
- each branch of a lookbehind assertion. If we are too close to the start to
- move back, this match function fails. When working with UTF-8 we move
- back a number of characters, not bytes. */
-
- case OP_REVERSE:
-#ifdef SUPPORT_UTF8
- c = (ecode[1] << 8) + ecode[2];
- for (i = 0; i < c; i++)
- {
- eptr--;
- BACKCHAR(eptr)
- }
-#else
- eptr -= (ecode[1] << 8) + ecode[2];
-#endif
-
- if (eptr < md->start_subject) return FALSE;
- ecode += 3;
- break;
-
- /* Recursion matches the current regex, nested. If there are any capturing
- brackets started but not finished, we have to save their starting points
- and reinstate them after the recursion. However, we don't know how many
- such there are (offset_top records the completed total) so we just have
- to save all the potential data. There may be up to 99 such values, which
- is a bit large to put on the stack, but using malloc for small numbers
- seems expensive. As a compromise, the stack is used when there are fewer
- than 16 values to store; otherwise malloc is used. A problem is what to do
- if the malloc fails ... there is no way of returning to the top level with
- an error. Save the top 15 values on the stack, and accept that the rest
- may be wrong. */
-
- case OP_RECURSE:
- {
- BOOL rc;
- int *save;
- int stacksave[15];
-
- c = md->offset_max;
-
- if (c < 16) save = stacksave; else
- {
- save = (int *)(pcre_malloc)((c+1) * sizeof(int));
- if (save == NULL)
- {
- save = stacksave;
- c = 15;
- }
- }
-
- for (i = 1; i <= c; i++)
- save[i] = md->offset_vector[md->offset_end - i];
- rc = match(eptr, md->start_pattern, offset_top, md, ims, eptrb,
- match_isgroup);
- for (i = 1; i <= c; i++)
- md->offset_vector[md->offset_end - i] = save[i];
- if (save != stacksave) (pcre_free)(save);
- if (!rc) return FALSE;
-
- /* In case the recursion has set more capturing values, save the final
- number, then move along the subject till after the recursive match,
- and advance one byte in the pattern code. */
-
- offset_top = md->end_offset_top;
- eptr = md->end_match_ptr;
- ecode++;
- }
- break;
-
- /* "Once" brackets are like assertion brackets except that after a match,
- the point in the subject string is not moved back. Thus there can never be
- a move back into the brackets. Check the alternative branches in turn - the
- matching won't pass the KET for this kind of subpattern. If any one branch
- matches, we carry on as at the end of a normal bracket, leaving the subject
- pointer. */
-
- case OP_ONCE:
- {
- const uschar *prev = ecode;
- const uschar *saved_eptr = eptr;
-
- do
- {
- if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
- break;
- ecode += (ecode[1] << 8) + ecode[2];
- }
- while (*ecode == OP_ALT);
-
- /* If hit the end of the group (which could be repeated), fail */
-
- if (*ecode != OP_ONCE && *ecode != OP_ALT) return FALSE;
-
- /* Continue as from after the assertion, updating the offsets high water
- mark, since extracts may have been taken. */
-
- do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT);
-
- offset_top = md->end_offset_top;
- eptr = md->end_match_ptr;
-
- /* For a non-repeating ket, just continue at this level. This also
- happens for a repeating ket if no characters were matched in the group.
- This is the forcible breaking of infinite loops as implemented in Perl
- 5.005. If there is an options reset, it will get obeyed in the normal
- course of events. */
-
- if (*ecode == OP_KET || eptr == saved_eptr)
- {
- ecode += 3;
- break;
- }
-
- /* The repeating kets try the rest of the pattern or restart from the
- preceding bracket, in the appropriate order. We need to reset any options
- that changed within the bracket before re-running it, so check the next
- opcode. */
-
- if (ecode[3] == OP_OPT)
- {
- ims = (ims & ~PCRE_IMS) | ecode[4];
- DPRINTF(("ims set to %02lx at group repeat\n", ims));
- }
-
- if (*ecode == OP_KETRMIN)
- {
- if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) ||
- match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup))
- return TRUE;
- }
- else /* OP_KETRMAX */
- {
- if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) ||
- match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE;
- }
- }
- return FALSE;
-
- /* An alternation is the end of a branch; scan along to find the end of the
- bracketed group and go to there. */
-
- case OP_ALT:
- do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT);
- break;
-
- /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating
- that it may occur zero times. It may repeat infinitely, or not at all -
- i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper
- repeat limits are compiled as a number of copies, with the optional ones
- preceded by BRAZERO or BRAMINZERO. */
-
- case OP_BRAZERO:
- {
- const uschar *next = ecode+1;
- if (match(eptr, next, offset_top, md, ims, eptrb, match_isgroup))
- return TRUE;
- do next += (next[1] << 8) + next[2]; while (*next == OP_ALT);
- ecode = next + 3;
- }
- break;
-
- case OP_BRAMINZERO:
- {
- const uschar *next = ecode+1;
- do next += (next[1] << 8) + next[2]; while (*next == OP_ALT);
- if (match(eptr, next+3, offset_top, md, ims, eptrb, match_isgroup))
- return TRUE;
- ecode++;
- }
- break;
-
- /* End of a group, repeated or non-repeating. If we are at the end of
- an assertion "group", stop matching and return TRUE, but record the
- current high water mark for use by positive assertions. Do this also
- for the "once" (not-backup up) groups. */
-
- case OP_KET:
- case OP_KETRMIN:
- case OP_KETRMAX:
- {
- const uschar *prev = ecode - (ecode[1] << 8) - ecode[2];
- const uschar *saved_eptr = eptrb->saved_eptr;
-
- eptrb = eptrb->prev; /* Back up the stack of bracket start pointers */
-
- if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT ||
- *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT ||
- *prev == OP_ONCE)
- {
- md->end_match_ptr = eptr; /* For ONCE */
- md->end_offset_top = offset_top;
- return TRUE;
- }
-
- /* In all other cases except a conditional group we have to check the
- group number back at the start and if necessary complete handling an
- extraction by setting the offsets and bumping the high water mark. */
-
- if (*prev != OP_COND)
- {
- int number = *prev - OP_BRA;
- int offset = number << 1;
-
-#ifdef DEBUG
- printf("end bracket %d", number);
- printf("\n");
-#endif
-
- if (number > 0)
- {
- if (offset >= md->offset_max) md->offset_overflow = TRUE; else
- {
- md->offset_vector[offset] =
- md->offset_vector[md->offset_end - number];
- md->offset_vector[offset+1] = eptr - md->start_subject;
- if (offset_top <= offset) offset_top = offset + 2;
- }
- }
- }
-
- /* Reset the value of the ims flags, in case they got changed during
- the group. */
-
- ims = original_ims;
- DPRINTF(("ims reset to %02lx\n", ims));
-
- /* For a non-repeating ket, just continue at this level. This also
- happens for a repeating ket if no characters were matched in the group.
- This is the forcible breaking of infinite loops as implemented in Perl
- 5.005. If there is an options reset, it will get obeyed in the normal
- course of events. */
-
- if (*ecode == OP_KET || eptr == saved_eptr)
- {
- ecode += 3;
- break;
- }
-
- /* The repeating kets try the rest of the pattern or restart from the
- preceding bracket, in the appropriate order. */
-
- if (*ecode == OP_KETRMIN)
- {
- if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) ||
- match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup))
- return TRUE;
- }
- else /* OP_KETRMAX */
- {
- if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) ||
- match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE;
- }
- }
- return FALSE;
-
- /* Start of subject unless notbol, or after internal newline if multiline */
-
- case OP_CIRC:
- if (md->notbol && eptr == md->start_subject) return FALSE;
- if ((ims & PCRE_MULTILINE) != 0)
- {
- if (eptr != md->start_subject && eptr[-1] != '\n') return FALSE;
- ecode++;
- break;
- }
- /* ... else fall through */
-
- /* Start of subject assertion */
-
- case OP_SOD:
- if (eptr != md->start_subject) return FALSE;
- ecode++;
- break;
-
- /* Assert before internal newline if multiline, or before a terminating
- newline unless endonly is set, else end of subject unless noteol is set. */
-
- case OP_DOLL:
- if ((ims & PCRE_MULTILINE) != 0)
- {
- if (eptr < md->end_subject) { if (*eptr != '\n') return FALSE; }
- else { if (md->noteol) return FALSE; }
- ecode++;
- break;
- }
- else
- {
- if (md->noteol) return FALSE;
- if (!md->endonly)
- {
- if (eptr < md->end_subject - 1 ||
- (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE;
-
- ecode++;
- break;
- }
- }
- /* ... else fall through */
-
- /* End of subject assertion (\z) */
-
- case OP_EOD:
- if (eptr < md->end_subject) return FALSE;
- ecode++;
- break;
-
- /* End of subject or ending \n assertion (\Z) */
-
- case OP_EODN:
- if (eptr < md->end_subject - 1 ||
- (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE;
- ecode++;
- break;
-
- /* Word boundary assertions */
-
- case OP_NOT_WORD_BOUNDARY:
- case OP_WORD_BOUNDARY:
- {
- BOOL prev_is_word = (eptr != md->start_subject) &&
- ((md->ctypes[eptr[-1]] & ctype_word) != 0);
- BOOL cur_is_word = (eptr < md->end_subject) &&
- ((md->ctypes[*eptr] & ctype_word) != 0);
- if ((*ecode++ == OP_WORD_BOUNDARY)?
- cur_is_word == prev_is_word : cur_is_word != prev_is_word)
- return FALSE;
- }
- break;
-
- /* Match a single character type; inline for speed */
-
- case OP_ANY:
- if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == '\n')
- return FALSE;
- if (eptr++ >= md->end_subject) return FALSE;
-#ifdef SUPPORT_UTF8
- if (md->utf8)
- while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-#endif
- ecode++;
- break;
-
- case OP_NOT_DIGIT:
- if (eptr >= md->end_subject ||
- (md->ctypes[*eptr++] & ctype_digit) != 0)
- return FALSE;
- ecode++;
- break;
-
- case OP_DIGIT:
- if (eptr >= md->end_subject ||
- (md->ctypes[*eptr++] & ctype_digit) == 0)
- return FALSE;
- ecode++;
- break;
-
- case OP_NOT_WHITESPACE:
- if (eptr >= md->end_subject ||
- (md->ctypes[*eptr++] & ctype_space) != 0)
- return FALSE;
- ecode++;
- break;
-
- case OP_WHITESPACE:
- if (eptr >= md->end_subject ||
- (md->ctypes[*eptr++] & ctype_space) == 0)
- return FALSE;
- ecode++;
- break;
-
- case OP_NOT_WORDCHAR:
- if (eptr >= md->end_subject ||
- (md->ctypes[*eptr++] & ctype_word) != 0)
- return FALSE;
- ecode++;
- break;
-
- case OP_WORDCHAR:
- if (eptr >= md->end_subject ||
- (md->ctypes[*eptr++] & ctype_word) == 0)
- return FALSE;
- ecode++;
- break;
-
- /* Match a back reference, possibly repeatedly. Look past the end of the
- item to see if there is repeat information following. The code is similar
- to that for character classes, but repeated for efficiency. Then obey
- similar code to character type repeats - written out again for speed.
- However, if the referenced string is the empty string, always treat
- it as matched, any number of times (otherwise there could be infinite
- loops). */
-
- case OP_REF:
- {
- int length;
- int offset = ecode[1] << 1; /* Doubled reference number */
- ecode += 2; /* Advance past the item */
-
- /* If the reference is unset, set the length to be longer than the amount
- of subject left; this ensures that every attempt at a match fails. We
- can't just fail here, because of the possibility of quantifiers with zero
- minima. */
-
- length = (offset >= offset_top || md->offset_vector[offset] < 0)?
- md->end_subject - eptr + 1 :
- md->offset_vector[offset+1] - md->offset_vector[offset];
-
- /* Set up for repetition, or handle the non-repeated case */
-
- switch (*ecode)
- {
- case OP_CRSTAR:
- case OP_CRMINSTAR:
- case OP_CRPLUS:
- case OP_CRMINPLUS:
- case OP_CRQUERY:
- case OP_CRMINQUERY:
- c = *ecode++ - OP_CRSTAR;
- minimize = (c & 1) != 0;
- min = rep_min[c]; /* Pick up values from tables; */
- max = rep_max[c]; /* zero for max => infinity */
- if (max == 0) max = INT_MAX;
- break;
-
- case OP_CRRANGE:
- case OP_CRMINRANGE:
- minimize = (*ecode == OP_CRMINRANGE);
- min = (ecode[1] << 8) + ecode[2];
- max = (ecode[3] << 8) + ecode[4];
- if (max == 0) max = INT_MAX;
- ecode += 5;
- break;
-
- default: /* No repeat follows */
- if (!match_ref(offset, eptr, length, md, ims)) return FALSE;
- eptr += length;
- continue; /* With the main loop */
- }
-
- /* If the length of the reference is zero, just continue with the
- main loop. */
-
- if (length == 0) continue;
-
- /* First, ensure the minimum number of matches are present. We get back
- the length of the reference string explicitly rather than passing the
- address of eptr, so that eptr can be a register variable. */
-
- for (i = 1; i <= min; i++)
- {
- if (!match_ref(offset, eptr, length, md, ims)) return FALSE;
- eptr += length;
- }
-
- /* If min = max, continue at the same level without recursion.
- They are not both allowed to be zero. */
-
- if (min == max) continue;
-
- /* If minimizing, keep trying and advancing the pointer */
-
- if (minimize)
- {
- for (i = min;; i++)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- if (i >= max || !match_ref(offset, eptr, length, md, ims))
- return FALSE;
- eptr += length;
- }
- /* Control never gets here */
- }
-
- /* If maximizing, find the longest string and work backwards */
-
- else
- {
- const uschar *pp = eptr;
- for (i = min; i < max; i++)
- {
- if (!match_ref(offset, eptr, length, md, ims)) break;
- eptr += length;
- }
- while (eptr >= pp)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- eptr -= length;
- }
- return FALSE;
- }
- }
- /* Control never gets here */
-
-
-
- /* Match a character class, possibly repeatedly. Look past the end of the
- item to see if there is repeat information following. Then obey similar
- code to character type repeats - written out again for speed. */
-
- case OP_CLASS:
- {
- const uschar *data = ecode + 1; /* Save for matching */
- ecode += 33; /* Advance past the item */
-
- switch (*ecode)
- {
- case OP_CRSTAR:
- case OP_CRMINSTAR:
- case OP_CRPLUS:
- case OP_CRMINPLUS:
- case OP_CRQUERY:
- case OP_CRMINQUERY:
- c = *ecode++ - OP_CRSTAR;
- minimize = (c & 1) != 0;
- min = rep_min[c]; /* Pick up values from tables; */
- max = rep_max[c]; /* zero for max => infinity */
- if (max == 0) max = INT_MAX;
- break;
-
- case OP_CRRANGE:
- case OP_CRMINRANGE:
- minimize = (*ecode == OP_CRMINRANGE);
- min = (ecode[1] << 8) + ecode[2];
- max = (ecode[3] << 8) + ecode[4];
- if (max == 0) max = INT_MAX;
- ecode += 5;
- break;
-
- default: /* No repeat follows */
- min = max = 1;
- break;
- }
-
- /* First, ensure the minimum number of matches are present. */
-
- for (i = 1; i <= min; i++)
- {
- if (eptr >= md->end_subject) return FALSE;
- GETCHARINC(c, eptr) /* Get character; increment eptr */
-
-#ifdef SUPPORT_UTF8
- /* We do not yet support class members > 255 */
- if (c > 255) return FALSE;
-#endif
-
- if ((data[c/8] & (1 << (c&7))) != 0) continue;
- return FALSE;
- }
-
- /* If max == min we can continue with the main loop without the
- need to recurse. */
-
- if (min == max) continue;
-
- /* If minimizing, keep testing the rest of the expression and advancing
- the pointer while it matches the class. */
-
- if (minimize)
- {
- for (i = min;; i++)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- if (i >= max || eptr >= md->end_subject) return FALSE;
- GETCHARINC(c, eptr) /* Get character; increment eptr */
-
-#ifdef SUPPORT_UTF8
- /* We do not yet support class members > 255 */
- if (c > 255) return FALSE;
-#endif
- if ((data[c/8] & (1 << (c&7))) != 0) continue;
- return FALSE;
- }
- /* Control never gets here */
- }
-
- /* If maximizing, find the longest possible run, then work backwards. */
-
- else
- {
- const uschar *pp = eptr;
- int len = 1;
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject) break;
- GETCHARLEN(c, eptr, len) /* Get character, set length if UTF-8 */
-
-#ifdef SUPPORT_UTF8
- /* We do not yet support class members > 255 */
- if (c > 255) break;
-#endif
- if ((data[c/8] & (1 << (c&7))) == 0) break;
- eptr += len;
- }
-
- while (eptr >= pp)
- {
- if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
-
-#ifdef SUPPORT_UTF8
- BACKCHAR(eptr)
-#endif
- }
- return FALSE;
- }
- }
- /* Control never gets here */
-
- /* Match a run of characters */
-
- case OP_CHARS:
- {
- register int length = ecode[1];
- ecode += 2;
-
-#ifdef DEBUG /* Sigh. Some compilers never learn. */
- if (eptr >= md->end_subject)
- printf("matching subject <null> against pattern ");
- else
- {
- printf("matching subject ");
- pchars(eptr, length, TRUE, md);
- printf(" against pattern ");
- }
- pchars(ecode, length, FALSE, md);
- printf("\n");
-#endif
-
- if (length > md->end_subject - eptr) return FALSE;
- if ((ims & PCRE_CASELESS) != 0)
- {
- while (length-- > 0)
- if (md->lcc[*ecode++] != md->lcc[*eptr++])
- return FALSE;
- }
- else
- {
- while (length-- > 0) if (*ecode++ != *eptr++) return FALSE;
- }
- }
- break;
-
- /* Match a single character repeatedly; different opcodes share code. */
-
- case OP_EXACT:
- min = max = (ecode[1] << 8) + ecode[2];
- ecode += 3;
- goto REPEATCHAR;
-
- case OP_UPTO:
- case OP_MINUPTO:
- min = 0;
- max = (ecode[1] << 8) + ecode[2];
- minimize = *ecode == OP_MINUPTO;
- ecode += 3;
- goto REPEATCHAR;
-
- case OP_STAR:
- case OP_MINSTAR:
- case OP_PLUS:
- case OP_MINPLUS:
- case OP_QUERY:
- case OP_MINQUERY:
- c = *ecode++ - OP_STAR;
- minimize = (c & 1) != 0;
- min = rep_min[c]; /* Pick up values from tables; */
- max = rep_max[c]; /* zero for max => infinity */
- if (max == 0) max = INT_MAX;
-
- /* Common code for all repeated single-character matches. We can give
- up quickly if there are fewer than the minimum number of characters left in
- the subject. */
-
- REPEATCHAR:
- if (min > md->end_subject - eptr) return FALSE;
- c = *ecode++;
-
- /* The code is duplicated for the caseless and caseful cases, for speed,
- since matching characters is likely to be quite common. First, ensure the
- minimum number of matches are present. If min = max, continue at the same
- level without recursing. Otherwise, if minimizing, keep trying the rest of
- the expression and advancing one matching character if failing, up to the
- maximum. Alternatively, if maximizing, find the maximum number of
- characters and work backwards. */
-
- DPRINTF(("matching %c{%d,%d} against subject %.*s\n", c, min, max,
- max, eptr));
-
- if ((ims & PCRE_CASELESS) != 0)
- {
- c = md->lcc[c];
- for (i = 1; i <= min; i++)
- if (c != md->lcc[*eptr++]) return FALSE;
- if (min == max) continue;
- if (minimize)
- {
- for (i = min;; i++)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- if (i >= max || eptr >= md->end_subject ||
- c != md->lcc[*eptr++])
- return FALSE;
- }
- /* Control never gets here */
- }
- else
- {
- const uschar *pp = eptr;
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || c != md->lcc[*eptr]) break;
- eptr++;
- }
- while (eptr >= pp)
- if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- return FALSE;
- }
- /* Control never gets here */
- }
-
- /* Caseful comparisons */
-
- else
- {
- for (i = 1; i <= min; i++) if (c != *eptr++) return FALSE;
- if (min == max) continue;
- if (minimize)
- {
- for (i = min;; i++)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- if (i >= max || eptr >= md->end_subject || c != *eptr++) return FALSE;
- }
- /* Control never gets here */
- }
- else
- {
- const uschar *pp = eptr;
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || c != *eptr) break;
- eptr++;
- }
- while (eptr >= pp)
- if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- return FALSE;
- }
- }
- /* Control never gets here */
-
- /* Match a negated single character */
-
- case OP_NOT:
- if (eptr >= md->end_subject) return FALSE;
- ecode++;
- if ((ims & PCRE_CASELESS) != 0)
- {
- if (md->lcc[*ecode++] == md->lcc[*eptr++]) return FALSE;
- }
- else
- {
- if (*ecode++ == *eptr++) return FALSE;
- }
- break;
-
- /* Match a negated single character repeatedly. This is almost a repeat of
- the code for a repeated single character, but I haven't found a nice way of
- commoning these up that doesn't require a test of the positive/negative
- option for each character match. Maybe that wouldn't add very much to the
- time taken, but character matching *is* what this is all about... */
-
- case OP_NOTEXACT:
- min = max = (ecode[1] << 8) + ecode[2];
- ecode += 3;
- goto REPEATNOTCHAR;
-
- case OP_NOTUPTO:
- case OP_NOTMINUPTO:
- min = 0;
- max = (ecode[1] << 8) + ecode[2];
- minimize = *ecode == OP_NOTMINUPTO;
- ecode += 3;
- goto REPEATNOTCHAR;
-
- case OP_NOTSTAR:
- case OP_NOTMINSTAR:
- case OP_NOTPLUS:
- case OP_NOTMINPLUS:
- case OP_NOTQUERY:
- case OP_NOTMINQUERY:
- c = *ecode++ - OP_NOTSTAR;
- minimize = (c & 1) != 0;
- min = rep_min[c]; /* Pick up values from tables; */
- max = rep_max[c]; /* zero for max => infinity */
- if (max == 0) max = INT_MAX;
-
- /* Common code for all repeated single-character matches. We can give
- up quickly if there are fewer than the minimum number of characters left in
- the subject. */
-
- REPEATNOTCHAR:
- if (min > md->end_subject - eptr) return FALSE;
- c = *ecode++;
-
- /* The code is duplicated for the caseless and caseful cases, for speed,
- since matching characters is likely to be quite common. First, ensure the
- minimum number of matches are present. If min = max, continue at the same
- level without recursing. Otherwise, if minimizing, keep trying the rest of
- the expression and advancing one matching character if failing, up to the
- maximum. Alternatively, if maximizing, find the maximum number of
- characters and work backwards. */
-
- DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", c, min, max,
- max, eptr));
-
- if ((ims & PCRE_CASELESS) != 0)
- {
- c = md->lcc[c];
- for (i = 1; i <= min; i++)
- if (c == md->lcc[*eptr++]) return FALSE;
- if (min == max) continue;
- if (minimize)
- {
- for (i = min;; i++)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- if (i >= max || eptr >= md->end_subject ||
- c == md->lcc[*eptr++])
- return FALSE;
- }
- /* Control never gets here */
- }
- else
- {
- const uschar *pp = eptr;
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || c == md->lcc[*eptr]) break;
- eptr++;
- }
- while (eptr >= pp)
- if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- return FALSE;
- }
- /* Control never gets here */
- }
-
- /* Caseful comparisons */
-
- else
- {
- for (i = 1; i <= min; i++) if (c == *eptr++) return FALSE;
- if (min == max) continue;
- if (minimize)
- {
- for (i = min;; i++)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- if (i >= max || eptr >= md->end_subject || c == *eptr++) return FALSE;
- }
- /* Control never gets here */
- }
- else
- {
- const uschar *pp = eptr;
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || c == *eptr) break;
- eptr++;
- }
- while (eptr >= pp)
- if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
- return FALSE;
- }
- }
- /* Control never gets here */
-
- /* Match a single character type repeatedly; several different opcodes
- share code. This is very similar to the code for single characters, but we
- repeat it in the interests of efficiency. */
-
- case OP_TYPEEXACT:
- min = max = (ecode[1] << 8) + ecode[2];
- minimize = TRUE;
- ecode += 3;
- goto REPEATTYPE;
-
- case OP_TYPEUPTO:
- case OP_TYPEMINUPTO:
- min = 0;
- max = (ecode[1] << 8) + ecode[2];
- minimize = *ecode == OP_TYPEMINUPTO;
- ecode += 3;
- goto REPEATTYPE;
-
- case OP_TYPESTAR:
- case OP_TYPEMINSTAR:
- case OP_TYPEPLUS:
- case OP_TYPEMINPLUS:
- case OP_TYPEQUERY:
- case OP_TYPEMINQUERY:
- c = *ecode++ - OP_TYPESTAR;
- minimize = (c & 1) != 0;
- min = rep_min[c]; /* Pick up values from tables; */
- max = rep_max[c]; /* zero for max => infinity */
- if (max == 0) max = INT_MAX;
-
- /* Common code for all repeated single character type matches */
-
- REPEATTYPE:
- ctype = *ecode++; /* Code for the character type */
-
- /* First, ensure the minimum number of matches are present. Use inline
- code for maximizing the speed, and do the type test once at the start
- (i.e. keep it out of the loop). Also we can test that there are at least
- the minimum number of bytes before we start, except when doing '.' in
- UTF8 mode. Leave the test in in all cases; in the special case we have
- to test after each character. */
-
- if (min > md->end_subject - eptr) return FALSE;
- if (min > 0) switch(ctype)
- {
- case OP_ANY:
-#ifdef SUPPORT_UTF8
- if (md->utf8)
- {
- for (i = 1; i <= min; i++)
- {
- if (eptr >= md->end_subject ||
- (*eptr++ == '\n' && (ims & PCRE_DOTALL) == 0))
- return FALSE;
- while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
- }
- break;
- }
-#endif
- /* Non-UTF8 can be faster */
- if ((ims & PCRE_DOTALL) == 0)
- { for (i = 1; i <= min; i++) if (*eptr++ == '\n') return FALSE; }
- else eptr += min;
- break;
-
- case OP_NOT_DIGIT:
- for (i = 1; i <= min; i++)
- if ((md->ctypes[*eptr++] & ctype_digit) != 0) return FALSE;
- break;
-
- case OP_DIGIT:
- for (i = 1; i <= min; i++)
- if ((md->ctypes[*eptr++] & ctype_digit) == 0) return FALSE;
- break;
-
- case OP_NOT_WHITESPACE:
- for (i = 1; i <= min; i++)
- if ((md->ctypes[*eptr++] & ctype_space) != 0) return FALSE;
- break;
-
- case OP_WHITESPACE:
- for (i = 1; i <= min; i++)
- if ((md->ctypes[*eptr++] & ctype_space) == 0) return FALSE;
- break;
-
- case OP_NOT_WORDCHAR:
- for (i = 1; i <= min; i++)
- if ((md->ctypes[*eptr++] & ctype_word) != 0)
- return FALSE;
- break;
-
- case OP_WORDCHAR:
- for (i = 1; i <= min; i++)
- if ((md->ctypes[*eptr++] & ctype_word) == 0)
- return FALSE;
- break;
- }
-
- /* If min = max, continue at the same level without recursing */
-
- if (min == max) continue;
-
- /* If minimizing, we have to test the rest of the pattern before each
- subsequent match. */
-
- if (minimize)
- {
- for (i = min;; i++)
- {
- if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE;
- if (i >= max || eptr >= md->end_subject) return FALSE;
-
- c = *eptr++;
- switch(ctype)
- {
- case OP_ANY:
- if ((ims & PCRE_DOTALL) == 0 && c == '\n') return FALSE;
-#ifdef SUPPORT_UTF8
- if (md->utf8)
- while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-#endif
- break;
-
- case OP_NOT_DIGIT:
- if ((md->ctypes[c] & ctype_digit) != 0) return FALSE;
- break;
-
- case OP_DIGIT:
- if ((md->ctypes[c] & ctype_digit) == 0) return FALSE;
- break;
-
- case OP_NOT_WHITESPACE:
- if ((md->ctypes[c] & ctype_space) != 0) return FALSE;
- break;
-
- case OP_WHITESPACE:
- if ((md->ctypes[c] & ctype_space) == 0) return FALSE;
- break;
-
- case OP_NOT_WORDCHAR:
- if ((md->ctypes[c] & ctype_word) != 0) return FALSE;
- break;
-
- case OP_WORDCHAR:
- if ((md->ctypes[c] & ctype_word) == 0) return FALSE;
- break;
- }
- }
- /* Control never gets here */
- }
-
- /* If maximizing it is worth using inline code for speed, doing the type
- test once at the start (i.e. keep it out of the loop). */
-
- else
- {
- const uschar *pp = eptr;
- switch(ctype)
- {
- case OP_ANY:
-
- /* Special code is required for UTF8, but when the maximum is unlimited
- we don't need it. */
-
-#ifdef SUPPORT_UTF8
- if (md->utf8 && max < INT_MAX)
- {
- if ((ims & PCRE_DOTALL) == 0)
- {
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || *eptr++ == '\n') break;
- while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
- }
- }
- else
- {
- for (i = min; i < max; i++)
- {
- eptr++;
- while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
- }
- }
- break;
- }
-#endif
- /* Non-UTF8 can be faster */
- if ((ims & PCRE_DOTALL) == 0)
- {
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || *eptr == '\n') break;
- eptr++;
- }
- }
- else
- {
- c = max - min;
- if (c > md->end_subject - eptr) c = md->end_subject - eptr;
- eptr += c;
- }
- break;
-
- case OP_NOT_DIGIT:
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0)
- break;
- eptr++;
- }
- break;
-
- case OP_DIGIT:
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0)
- break;
- eptr++;
- }
- break;
-
- case OP_NOT_WHITESPACE:
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0)
- break;
- eptr++;
- }
- break;
-
- case OP_WHITESPACE:
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0)
- break;
- eptr++;
- }
- break;
-
- case OP_NOT_WORDCHAR:
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0)
- break;
- eptr++;
- }
- break;
-
- case OP_WORDCHAR:
- for (i = min; i < max; i++)
- {
- if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0)
- break;
- eptr++;
- }
- break;
- }
-
- while (eptr >= pp)
- {
- if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
- return TRUE;
-#ifdef SUPPORT_UTF8
- if (md->utf8)
- while (eptr > pp && (*eptr & 0xc0) == 0x80) eptr--;
-#endif
- }
- return FALSE;
- }
- /* Control never gets here */
-
- /* There's been some horrible disaster. */
-
- default:
- DPRINTF(("Unknown opcode %d\n", *ecode));
- md->errorcode = PCRE_ERROR_UNKNOWN_NODE;
- return FALSE;
- }
-
- /* Do not stick any code in here without much thought; it is assumed
- that "continue" in the code above comes out to here to repeat the main
- loop. */
-
- } /* End of main loop */
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-* Execute a Regular Expression *
-*************************************************/
-
-/* This function applies a compiled re to a subject string and picks out
-portions of the string if it matches. Two elements in the vector are set for
-each substring: the offsets to the start and end of the substring.
-
-Arguments:
- external_re points to the compiled expression
- external_extra points to "hints" from pcre_study() or is NULL
- subject points to the subject string
- length length of subject string (may contain binary zeros)
- start_offset where to start in the subject string
- options option bits
- offsets points to a vector of ints to be filled in with offsets
- offsetcount the number of elements in the vector
-
-Returns: > 0 => success; value is the number of elements filled in
- = 0 => success, but offsets is not big enough
- -1 => failed to match
- < -1 => some kind of unexpected problem
-*/
-
-int
-pcre_exec(const pcre *external_re, const pcre_extra *external_extra,
- const char *subject, int length, int start_offset, int options, int *offsets,
- int offsetcount)
-{
-int resetcount, ocount;
-int first_char = -1;
-int req_char = -1;
-int req_char2 = -1;
-unsigned long int ims = 0;
-match_data match_block;
-const uschar *start_bits = NULL;
-const uschar *start_match = (const uschar *)subject + start_offset;
-const uschar *end_subject;
-const uschar *req_char_ptr = start_match - 1;
-const real_pcre *re = (const real_pcre *)external_re;
-const real_pcre_extra *extra = (const real_pcre_extra *)external_extra;
-BOOL using_temporary_offsets = FALSE;
-BOOL anchored = ((re->options | options) & PCRE_ANCHORED) != 0;
-BOOL startline = (re->options & PCRE_STARTLINE) != 0;
-
-if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
-
-if (re == NULL || subject == NULL ||
- (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-
-match_block.start_pattern = re->code;
-match_block.start_subject = (const uschar *)subject;
-match_block.end_subject = match_block.start_subject + length;
-end_subject = match_block.end_subject;
-
-match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
-match_block.utf8 = (re->options & PCRE_UTF8) != 0;
-
-match_block.notbol = (options & PCRE_NOTBOL) != 0;
-match_block.noteol = (options & PCRE_NOTEOL) != 0;
-match_block.notempty = (options & PCRE_NOTEMPTY) != 0;
-
-match_block.errorcode = PCRE_ERROR_NOMATCH; /* Default error */
-
-match_block.lcc = re->tables + lcc_offset;
-match_block.ctypes = re->tables + ctypes_offset;
-
-/* The ims options can vary during the matching as a result of the presence
-of (?ims) items in the pattern. They are kept in a local variable so that
-restoring at the exit of a group is easy. */
-
-ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL);
-
-/* If the expression has got more back references than the offsets supplied can
-hold, we get a temporary bit of working store to use during the matching.
-Otherwise, we can use the vector supplied, rounding down its size to a multiple
-of 3. */
-
-ocount = offsetcount - (offsetcount % 3);
-
-if (re->top_backref > 0 && re->top_backref >= ocount/3)
- {
- ocount = re->top_backref * 3 + 3;
- match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int));
- if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
- using_temporary_offsets = TRUE;
- DPRINTF(("Got memory to hold back references\n"));
- }
-else match_block.offset_vector = offsets;
-
-match_block.offset_end = ocount;
-match_block.offset_max = (2*ocount)/3;
-match_block.offset_overflow = FALSE;
-
-/* Compute the minimum number of offsets that we need to reset each time. Doing
-this makes a huge difference to execution time when there aren't many brackets
-in the pattern. */
-
-resetcount = 2 + re->top_bracket * 2;
-if (resetcount > offsetcount) resetcount = ocount;
-
-/* Reset the working variable associated with each extraction. These should
-never be used unless previously set, but they get saved and restored, and so we
-initialize them to avoid reading uninitialized locations. */
-
-if (match_block.offset_vector != NULL)
- {
- register int *iptr = match_block.offset_vector + ocount;
- register int *iend = iptr - resetcount/2 + 1;
- while (--iptr >= iend) *iptr = -1;
- }
-
-/* Set up the first character to match, if available. The first_char value is
-never set for an anchored regular expression, but the anchoring may be forced
-at run time, so we have to test for anchoring. The first char may be unset for
-an unanchored pattern, of course. If there's no first char and the pattern was
-studied, there may be a bitmap of possible first characters. */
-
-if (!anchored)
- {
- if ((re->options & PCRE_FIRSTSET) != 0)
- {
- first_char = re->first_char;
- if ((ims & PCRE_CASELESS) != 0) first_char = match_block.lcc[first_char];
- }
- else
- if (!startline && extra != NULL &&
- (extra->options & PCRE_STUDY_MAPPED) != 0)
- start_bits = extra->start_bits;
- }
-
-/* For anchored or unanchored matches, there may be a "last known required
-character" set. If the PCRE_CASELESS is set, implying that the match starts
-caselessly, or if there are any changes of this flag within the regex, set up
-both cases of the character. Otherwise set the two values the same, which will
-avoid duplicate testing (which takes significant time). This covers the vast
-majority of cases. It will be suboptimal when the case flag changes in a regex
-and the required character in fact is caseful. */
-
-if ((re->options & PCRE_REQCHSET) != 0)
- {
- req_char = re->req_char;
- req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0)?
- (re->tables + fcc_offset)[req_char] : req_char;
- }
-
-/* Loop for handling unanchored repeated matching attempts; for anchored regexs
-the loop runs just once. */
-
-do
- {
- int rc;
- register int *iptr = match_block.offset_vector;
- register int *iend = iptr + resetcount;
-
- /* Reset the maximum number of extractions we might see. */
-
- while (iptr < iend) *iptr++ = -1;
-
- /* Advance to a unique first char if possible */
-
- if (first_char >= 0)
- {
- if ((ims & PCRE_CASELESS) != 0)
- while (start_match < end_subject &&
- match_block.lcc[*start_match] != first_char)
- start_match++;
- else
- while (start_match < end_subject && *start_match != first_char)
- start_match++;
- }
-
- /* Or to just after \n for a multiline match if possible */
-
- else if (startline)
- {
- if (start_match > match_block.start_subject + start_offset)
- {
- while (start_match < end_subject && start_match[-1] != '\n')
- start_match++;
- }
- }
-
- /* Or to a non-unique first char after study */
-
- else if (start_bits != NULL)
- {
- while (start_match < end_subject)
- {
- register int c = *start_match;
- if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break;
- }
- }
-
-#ifdef DEBUG /* Sigh. Some compilers never learn. */
- printf(">>>> Match against: ");
- pchars(start_match, end_subject - start_match, TRUE, &match_block);
- printf("\n");
-#endif
-
- /* If req_char is set, we know that that character must appear in the subject
- for the match to succeed. If the first character is set, req_char must be
- later in the subject; otherwise the test starts at the match point. This
- optimization can save a huge amount of backtracking in patterns with nested
- unlimited repeats that aren't going to match. We don't know what the state of
- case matching may be when this character is hit, so test for it in both its
- cases if necessary. However, the different cased versions will not be set up
- unless PCRE_CASELESS was given or the casing state changes within the regex.
- Writing separate code makes it go faster, as does using an autoincrement and
- backing off on a match. */
-
- if (req_char >= 0)
- {
- register const uschar *p = start_match + ((first_char >= 0)? 1 : 0);
-
- /* We don't need to repeat the search if we haven't yet reached the
- place we found it at last time. */
-
- if (p > req_char_ptr)
- {
- /* Do a single test if no case difference is set up */
-
- if (req_char == req_char2)
- {
- while (p < end_subject)
- {
- if (*p++ == req_char) { p--; break; }
- }
- }
-
- /* Otherwise test for either case */
-
- else
- {
- while (p < end_subject)
- {
- register int pp = *p++;
- if (pp == req_char || pp == req_char2) { p--; break; }
- }
- }
-
- /* If we can't find the required character, break the matching loop */
-
- if (p >= end_subject) break;
-
- /* If we have found the required character, save the point where we
- found it, so that we don't search again next time round the loop if
- the start hasn't passed this character yet. */
-
- req_char_ptr = p;
- }
- }
-
- /* When a match occurs, substrings will be set for all internal extractions;
- we just need to set up the whole thing as substring 0 before returning. If
- there were too many extractions, set the return code to zero. In the case
- where we had to get some local store to hold offsets for backreferences, copy
- those back references that we can. In this case there need not be overflow
- if certain parts of the pattern were not used. */
-
- match_block.start_match = start_match;
- if (!match(start_match, re->code, 2, &match_block, ims, NULL, match_isgroup))
- continue;
-
- /* Copy the offset information from temporary store if necessary */
-
- if (using_temporary_offsets)
- {
- if (offsetcount >= 4)
- {
- memcpy(offsets + 2, match_block.offset_vector + 2,
- (offsetcount - 2) * sizeof(int));
- DPRINTF(("Copied offsets from temporary memory\n"));
- }
- if (match_block.end_offset_top > offsetcount)
- match_block.offset_overflow = TRUE;
-
- DPRINTF(("Freeing temporary memory\n"));
- (pcre_free)(match_block.offset_vector);
- }
-
- rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2;
-
- if (match_block.offset_end < 2) rc = 0; else
- {
- offsets[0] = start_match - match_block.start_subject;
- offsets[1] = match_block.end_match_ptr - match_block.start_subject;
- }
-
- DPRINTF((">>>> returning %d\n", rc));
- return rc;
- }
-
-/* This "while" is the end of the "do" above */
-
-while (!anchored &&
- match_block.errorcode == PCRE_ERROR_NOMATCH &&
- start_match++ < end_subject);
-
-if (using_temporary_offsets)
- {
- DPRINTF(("Freeing temporary memory\n"));
- (pcre_free)(match_block.offset_vector);
- }
-
-DPRINTF((">>>> returning %d\n", match_block.errorcode));
-
-return match_block.errorcode;
-}
-
-/* End of pcre.c */
+++ /dev/null
-EXPORTS
-
-pcre_malloc DATA
-pcre_free DATA
-
-pcre_compile
-pcre_copy_substring
-pcre_exec
-pcre_get_substring
-pcre_get_substring_list
-pcre_info
-pcre_maketables
-pcre_study
-pcre_version
-
-regcomp
-regexec
-regerror
-regfree
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/* Copyright (c) 1997-2000 University of Cambridge */
-
-#ifndef _PCRE_H
-#define _PCRE_H
-
-/* The file pcre.h is build by "configure". Do not edit it; instead
-make changes to pcre.in. */
-
-#define PCRE_MAJOR 3
-#define PCRE_MINOR 4
-#define PCRE_DATE 22-Aug-2000
-
-/* Win32 uses DLL by default */
-
-#ifdef _WIN32
-# ifdef STATIC_PCRE
-# define PCRE_DL_IMPORT
-# else
-# define PCRE_DL_IMPORT __declspec(dllimport)
-# endif
-#else
-# define PCRE_DL_IMPORT
-#endif
-
-/* Have to include stdlib.h in order to ensure that size_t is defined;
-it is needed here for malloc. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options */
-
-#define PCRE_CASELESS 0x0001
-#define PCRE_MULTILINE 0x0002
-#define PCRE_DOTALL 0x0004
-#define PCRE_EXTENDED 0x0008
-#define PCRE_ANCHORED 0x0010
-#define PCRE_DOLLAR_ENDONLY 0x0020
-#define PCRE_EXTRA 0x0040
-#define PCRE_NOTBOL 0x0080
-#define PCRE_NOTEOL 0x0100
-#define PCRE_UNGREEDY 0x0200
-#define PCRE_NOTEMPTY 0x0400
-#define PCRE_UTF8 0x0800
-
-/* Exec-time and get-time error codes */
-
-#define PCRE_ERROR_NOMATCH (-1)
-#define PCRE_ERROR_NULL (-2)
-#define PCRE_ERROR_BADOPTION (-3)
-#define PCRE_ERROR_BADMAGIC (-4)
-#define PCRE_ERROR_UNKNOWN_NODE (-5)
-#define PCRE_ERROR_NOMEMORY (-6)
-#define PCRE_ERROR_NOSUBSTRING (-7)
-
-/* Request types for pcre_fullinfo() */
-
-#define PCRE_INFO_OPTIONS 0
-#define PCRE_INFO_SIZE 1
-#define PCRE_INFO_CAPTURECOUNT 2
-#define PCRE_INFO_BACKREFMAX 3
-#define PCRE_INFO_FIRSTCHAR 4
-#define PCRE_INFO_FIRSTTABLE 5
-#define PCRE_INFO_LASTLITERAL 6
-
-/* Types */
-
-typedef void pcre;
-typedef void pcre_extra;
-
-/* Store get and free functions. These can be set to alternative malloc/free
-functions if required. Some magic is required for Win32 DLL; it is null on
-other OS. */
-
-PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t);
-PCRE_DL_IMPORT extern void (*pcre_free)(void *);
-
-#undef PCRE_DL_IMPORT
-
-/* Functions */
-
-extern pcre *pcre_compile(const char *, int, const char **, int *,
- const unsigned char *);
-extern int pcre_copy_substring(const char *, int *, int, int, char *, int);
-extern int pcre_exec(const pcre *, const pcre_extra *, const char *,
- int, int, int, int *, int);
-extern void pcre_free_substring(const char *);
-extern void pcre_free_substring_list(const char **);
-extern int pcre_get_substring(const char *, int *, int, int, const char **);
-extern int pcre_get_substring_list(const char *, int *, int, const char ***);
-extern int pcre_info(const pcre *, int *, int *);
-extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *);
-extern unsigned const char *pcre_maketables(void);
-extern pcre_extra *pcre_study(const pcre *, int, const char **);
-extern const char *pcre_version(void);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/* Copyright (c) 1997-2000 University of Cambridge */
-
-#ifndef _PCRE_H
-#define _PCRE_H
-
-/* The file pcre.h is build by "configure". Do not edit it; instead
-make changes to pcre.in. */
-
-#define PCRE_MAJOR @PCRE_MAJOR@
-#define PCRE_MINOR @PCRE_MINOR@
-#define PCRE_DATE @PCRE_DATE@
-
-/* Win32 uses DLL by default */
-
-#ifdef _WIN32
-# ifdef STATIC_PCRE
-# define PCRE_DL_IMPORT
-# else
-# define PCRE_DL_IMPORT __declspec(dllimport)
-# endif
-#else
-# define PCRE_DL_IMPORT
-#endif
-
-/* Have to include stdlib.h in order to ensure that size_t is defined;
-it is needed here for malloc. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options */
-
-#define PCRE_CASELESS 0x0001
-#define PCRE_MULTILINE 0x0002
-#define PCRE_DOTALL 0x0004
-#define PCRE_EXTENDED 0x0008
-#define PCRE_ANCHORED 0x0010
-#define PCRE_DOLLAR_ENDONLY 0x0020
-#define PCRE_EXTRA 0x0040
-#define PCRE_NOTBOL 0x0080
-#define PCRE_NOTEOL 0x0100
-#define PCRE_UNGREEDY 0x0200
-#define PCRE_NOTEMPTY 0x0400
-#define PCRE_UTF8 0x0800
-
-/* Exec-time and get-time error codes */
-
-#define PCRE_ERROR_NOMATCH (-1)
-#define PCRE_ERROR_NULL (-2)
-#define PCRE_ERROR_BADOPTION (-3)
-#define PCRE_ERROR_BADMAGIC (-4)
-#define PCRE_ERROR_UNKNOWN_NODE (-5)
-#define PCRE_ERROR_NOMEMORY (-6)
-#define PCRE_ERROR_NOSUBSTRING (-7)
-
-/* Request types for pcre_fullinfo() */
-
-#define PCRE_INFO_OPTIONS 0
-#define PCRE_INFO_SIZE 1
-#define PCRE_INFO_CAPTURECOUNT 2
-#define PCRE_INFO_BACKREFMAX 3
-#define PCRE_INFO_FIRSTCHAR 4
-#define PCRE_INFO_FIRSTTABLE 5
-#define PCRE_INFO_LASTLITERAL 6
-
-/* Types */
-
-typedef void pcre;
-typedef void pcre_extra;
-
-/* Store get and free functions. These can be set to alternative malloc/free
-functions if required. Some magic is required for Win32 DLL; it is null on
-other OS. */
-
-PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t);
-PCRE_DL_IMPORT extern void (*pcre_free)(void *);
-
-#undef PCRE_DL_IMPORT
-
-/* Functions */
-
-extern pcre *pcre_compile(const char *, int, const char **, int *,
- const unsigned char *);
-extern int pcre_copy_substring(const char *, int *, int, int, char *, int);
-extern int pcre_exec(const pcre *, const pcre_extra *, const char *,
- int, int, int, int *, int);
-extern void pcre_free_substring(const char *);
-extern void pcre_free_substring_list(const char **);
-extern int pcre_get_substring(const char *, int *, int, int, const char **);
-extern int pcre_get_substring_list(const char *, int *, int, const char ***);
-extern int pcre_info(const pcre *, int *, int *);
-extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *);
-extern unsigned const char *pcre_maketables(void);
-extern pcre_extra *pcre_study(const pcre *, int, const char **);
-extern const char *pcre_version(void);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
+++ /dev/null
-/*************************************************
-* pcregrep program *
-*************************************************/
-
-/* This is a grep program that uses the PCRE regular expression library to do
-its pattern matching. */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "config.h"
-#include "pcre.h"
-
-#define FALSE 0
-#define TRUE 1
-
-typedef int BOOL;
-
-
-
-/*************************************************
-* Global variables *
-*************************************************/
-
-static pcre *pattern;
-static pcre_extra *hints;
-
-static BOOL count_only = FALSE;
-static BOOL filenames_only = FALSE;
-static BOOL invert = FALSE;
-static BOOL number = FALSE;
-static BOOL silent = FALSE;
-static BOOL whole_lines = FALSE;
-
-
-
-#if ! HAVE_STRERROR
-/*************************************************
-* Provide strerror() for non-ANSI libraries *
-*************************************************/
-
-/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()
-in their libraries, but can provide the same facility by this simple
-alternative function. */
-
-extern int sys_nerr;
-extern char *sys_errlist[];
-
-char *
-strerror(int n)
-{
-if (n < 0 || n >= sys_nerr) return "unknown error number";
-return sys_errlist[n];
-}
-#endif /* HAVE_STRERROR */
-
-
-
-/*************************************************
-* Grep an individual file *
-*************************************************/
-
-static int
-pcregrep(FILE *in, char *name)
-{
-int rc = 1;
-int linenumber = 0;
-int count = 0;
-int offsets[99];
-char buffer[BUFSIZ];
-
-while (fgets(buffer, sizeof(buffer), in) != NULL)
- {
- BOOL match;
- int length = (int)strlen(buffer);
- if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0;
- linenumber++;
-
- match = pcre_exec(pattern, hints, buffer, length, 0, 0, offsets, 99) >= 0;
- if (match && whole_lines && offsets[1] != length) match = FALSE;
-
- if (match != invert)
- {
- if (count_only) count++;
-
- else if (filenames_only)
- {
- fprintf(stdout, "%s\n", (name == NULL)? "<stdin>" : name);
- return 0;
- }
-
- else if (silent) return 0;
-
- else
- {
- if (name != NULL) fprintf(stdout, "%s:", name);
- if (number) fprintf(stdout, "%d:", linenumber);
- fprintf(stdout, "%s\n", buffer);
- }
-
- rc = 0;
- }
- }
-
-if (count_only)
- {
- if (name != NULL) fprintf(stdout, "%s:", name);
- fprintf(stdout, "%d\n", count);
- }
-
-return rc;
-}
-
-
-
-
-/*************************************************
-* Usage function *
-*************************************************/
-
-static int
-usage(int rc)
-{
-fprintf(stderr, "Usage: pcregrep [-Vchilnsvx] pattern [file] ...\n");
-return rc;
-}
-
-
-
-
-/*************************************************
-* Main program *
-*************************************************/
-
-int
-main(int argc, char **argv)
-{
-int i;
-int rc = 1;
-int options = 0;
-int errptr;
-const char *error;
-BOOL filenames = TRUE;
-
-/* Process the options */
-
-for (i = 1; i < argc; i++)
- {
- char *s;
- if (argv[i][0] != '-') break;
- s = argv[i] + 1;
- while (*s != 0)
- {
- switch (*s++)
- {
- case 'c': count_only = TRUE; break;
- case 'h': filenames = FALSE; break;
- case 'i': options |= PCRE_CASELESS; break;
- case 'l': filenames_only = TRUE;
- case 'n': number = TRUE; break;
- case 's': silent = TRUE; break;
- case 'v': invert = TRUE; break;
- case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break;
-
- case 'V':
- fprintf(stderr, "PCRE version %s\n", pcre_version());
- break;
-
- default:
- fprintf(stderr, "pcregrep: unknown option %c\n", s[-1]);
- return usage(2);
- }
- }
- }
-
-/* There must be at least a regexp argument */
-
-if (i >= argc) return usage(0);
-
-/* Compile the regular expression. */
-
-pattern = pcre_compile(argv[i++], options, &error, &errptr, NULL);
-if (pattern == NULL)
- {
- fprintf(stderr, "pcregrep: error in regex at offset %d: %s\n", errptr, error);
- return 2;
- }
-
-/* Study the regular expression, as we will be running it may times */
-
-hints = pcre_study(pattern, 0, &error);
-if (error != NULL)
- {
- fprintf(stderr, "pcregrep: error while studing regex: %s\n", error);
- return 2;
- }
-
-/* If there are no further arguments, do the business on stdin and exit */
-
-if (i >= argc) return pcregrep(stdin, NULL);
-
-/* Otherwise, work through the remaining arguments as files. If there is only
-one, don't give its name on the output. */
-
-if (i == argc - 1) filenames = FALSE;
-if (filenames_only) filenames = TRUE;
-
-for (; i < argc; i++)
- {
- FILE *in = fopen(argv[i], "r");
- if (in == NULL)
- {
- fprintf(stderr, "%s: failed to open: %s\n", argv[i], strerror(errno));
- rc = 2;
- }
- else
- {
- int frc = pcregrep(in, filenames? argv[i] : NULL);
- if (frc == 0 && rc == 1) rc = 0;
- fclose(in);
- }
- }
-
-return rc;
-}
-
-/* End */
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-This module is a wrapper that provides a POSIX API to the underlying PCRE
-functions.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
- Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-#include "internal.h"
-#include "pcreposix.h"
-#include "stdlib.h"
-
-
-
-/* Corresponding tables of PCRE error messages and POSIX error codes. */
-
-static const char *estring[] = {
- ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10,
- ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20,
- ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30,
- ERR31 };
-
-static int eint[] = {
- REG_EESCAPE, /* "\\ at end of pattern" */
- REG_EESCAPE, /* "\\c at end of pattern" */
- REG_EESCAPE, /* "unrecognized character follows \\" */
- REG_BADBR, /* "numbers out of order in {} quantifier" */
- REG_BADBR, /* "number too big in {} quantifier" */
- REG_EBRACK, /* "missing terminating ] for character class" */
- REG_ECTYPE, /* "invalid escape sequence in character class" */
- REG_ERANGE, /* "range out of order in character class" */
- REG_BADRPT, /* "nothing to repeat" */
- REG_BADRPT, /* "operand of unlimited repeat could match the empty string" */
- REG_ASSERT, /* "internal error: unexpected repeat" */
- REG_BADPAT, /* "unrecognized character after (?" */
- REG_ESIZE, /* "too many capturing parenthesized sub-patterns" */
- REG_EPAREN, /* "missing )" */
- REG_ESUBREG, /* "back reference to non-existent subpattern" */
- REG_INVARG, /* "erroffset passed as NULL" */
- REG_INVARG, /* "unknown option bit(s) set" */
- REG_EPAREN, /* "missing ) after comment" */
- REG_ESIZE, /* "too many sets of parentheses" */
- REG_ESIZE, /* "regular expression too large" */
- REG_ESPACE, /* "failed to get memory" */
- REG_EPAREN, /* "unmatched brackets" */
- REG_ASSERT, /* "internal error: code overflow" */
- REG_BADPAT, /* "unrecognized character after (?<" */
- REG_BADPAT, /* "lookbehind assertion is not fixed length" */
- REG_BADPAT, /* "malformed number after (?(" */
- REG_BADPAT, /* "conditional group containe more than two branches" */
- REG_BADPAT, /* "assertion expected after (?(" */
- REG_BADPAT, /* "(?p must be followed by )" */
- REG_ECTYPE, /* "unknown POSIX class name" */
- REG_BADPAT, /* "POSIX collating elements are not supported" */
- REG_INVARG, /* "this version of PCRE is not compiled with PCRE_UTF8 support" */
- REG_BADPAT, /* "characters with values > 255 are not yet supported in classes" */
- REG_BADPAT, /* "character value in \x{...} sequence is too large" */
- REG_BADPAT /* "invalid condition (?(0)" */
-};
-
-/* Table of texts corresponding to POSIX error codes */
-
-static const char *pstring[] = {
- "", /* Dummy for value 0 */
- "internal error", /* REG_ASSERT */
- "invalid repeat counts in {}", /* BADBR */
- "pattern error", /* BADPAT */
- "? * + invalid", /* BADRPT */
- "unbalanced {}", /* EBRACE */
- "unbalanced []", /* EBRACK */
- "collation error - not relevant", /* ECOLLATE */
- "bad class", /* ECTYPE */
- "bad escape sequence", /* EESCAPE */
- "empty expression", /* EMPTY */
- "unbalanced ()", /* EPAREN */
- "bad range inside []", /* ERANGE */
- "expression too big", /* ESIZE */
- "failed to get memory", /* ESPACE */
- "bad back reference", /* ESUBREG */
- "bad argument", /* INVARG */
- "match failed" /* NOMATCH */
-};
-
-
-
-
-/*************************************************
-* Translate PCRE text code to int *
-*************************************************/
-
-/* PCRE compile-time errors are given as strings defined as macros. We can just
-look them up in a table to turn them into POSIX-style error codes. */
-
-static int
-pcre_posix_error_code(const char *s)
-{
-size_t i;
-for (i = 0; i < sizeof(estring)/sizeof(char *); i++)
- if (strcmp(s, estring[i]) == 0) return eint[i];
-return REG_ASSERT;
-}
-
-
-
-/*************************************************
-* Translate error code to string *
-*************************************************/
-
-size_t
-regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
-{
-const char *message, *addmessage;
-size_t length, addlength;
-
-message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
- "unknown error code" : pstring[errcode];
-length = strlen(message) + 1;
-
-addmessage = " at offset ";
-addlength = (preg != NULL && (int)preg->re_erroffset != -1)?
- strlen(addmessage) + 6 : 0;
-
-if (errbuf_size > 0)
- {
- if (addlength > 0 && errbuf_size >= length + addlength)
- sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset);
- else
- {
- strncpy(errbuf, message, errbuf_size - 1);
- errbuf[errbuf_size-1] = 0;
- }
- }
-
-return length + addlength;
-}
-
-
-
-
-/*************************************************
-* Free store held by a regex *
-*************************************************/
-
-void
-regfree(regex_t *preg)
-{
-(pcre_free)(preg->re_pcre);
-}
-
-
-
-
-/*************************************************
-* Compile a regular expression *
-*************************************************/
-
-/*
-Arguments:
- preg points to a structure for recording the compiled expression
- pattern the pattern to compile
- cflags compilation flags
-
-Returns: 0 on success
- various non-zero codes on failure
-*/
-
-int
-regcomp(regex_t *preg, const char *pattern, int cflags)
-{
-const char *errorptr;
-int erroffset;
-int options = 0;
-
-if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
-if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
-
-preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
-preg->re_erroffset = erroffset;
-
-if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr);
-
-preg->re_nsub = pcre_info(preg->re_pcre, NULL, NULL);
-return 0;
-}
-
-
-
-
-/*************************************************
-* Match a regular expression *
-*************************************************/
-
-/* Unfortunately, PCRE requires 3 ints of working space for each captured
-substring, so we have to get and release working store instead of just using
-the POSIX structures as was done in earlier releases when PCRE needed only 2
-ints. */
-
-int
-regexec(regex_t *preg, const char *string, size_t nmatch,
- regmatch_t pmatch[], int eflags)
-{
-int rc;
-int options = 0;
-int *ovector = NULL;
-
-if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
-if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
-
-preg->re_erroffset = (size_t)(-1); /* Only has meaning after compile */
-
-if (nmatch > 0)
- {
- ovector = (int *)malloc(sizeof(int) * nmatch * 3);
- if (ovector == NULL) return REG_ESPACE;
- }
-
-rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string), 0, options,
- ovector, nmatch * 3);
-
-if (rc == 0) rc = nmatch; /* All captured slots were filled in */
-
-if (rc >= 0)
- {
- size_t i;
- for (i = 0; i < (size_t)rc; i++)
- {
- pmatch[i].rm_so = ovector[i*2];
- pmatch[i].rm_eo = ovector[i*2+1];
- }
- if (ovector != NULL) free(ovector);
- for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
- return 0;
- }
-
-else
- {
- if (ovector != NULL) free(ovector);
- switch(rc)
- {
- case PCRE_ERROR_NOMATCH: return REG_NOMATCH;
- case PCRE_ERROR_NULL: return REG_INVARG;
- case PCRE_ERROR_BADOPTION: return REG_INVARG;
- case PCRE_ERROR_BADMAGIC: return REG_INVARG;
- case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
- case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
- default: return REG_ASSERT;
- }
- }
-}
-
-/* End of pcreposix.c */
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/* Copyright (c) 1997-2000 University of Cambridge */
-
-#ifndef _PCREPOSIX_H
-#define _PCREPOSIX_H
-
-/* This is the header for the POSIX wrapper interface to the PCRE Perl-
-Compatible Regular Expression library. It defines the things POSIX says should
-be there. I hope. */
-
-/* Have to include stdlib.h in order to ensure that size_t is defined. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options defined by POSIX. */
-
-#define REG_ICASE 0x01
-#define REG_NEWLINE 0x02
-#define REG_NOTBOL 0x04
-#define REG_NOTEOL 0x08
-
-/* These are not used by PCRE, but by defining them we make it easier
-to slot PCRE into existing programs that make POSIX calls. */
-
-#define REG_EXTENDED 0
-#define REG_NOSUB 0
-
-/* Error values. Not all these are relevant or used by the wrapper. */
-
-enum {
- REG_ASSERT = 1, /* internal error ? */
- REG_BADBR, /* invalid repeat counts in {} */
- REG_BADPAT, /* pattern error */
- REG_BADRPT, /* ? * + invalid */
- REG_EBRACE, /* unbalanced {} */
- REG_EBRACK, /* unbalanced [] */
- REG_ECOLLATE, /* collation error - not relevant */
- REG_ECTYPE, /* bad class */
- REG_EESCAPE, /* bad escape sequence */
- REG_EMPTY, /* empty expression */
- REG_EPAREN, /* unbalanced () */
- REG_ERANGE, /* bad range inside [] */
- REG_ESIZE, /* expression too big */
- REG_ESPACE, /* failed to get memory */
- REG_ESUBREG, /* bad back reference */
- REG_INVARG, /* bad argument */
- REG_NOMATCH /* match failed */
-};
-
-
-/* The structure representing a compiled regular expression. */
-
-typedef struct {
- void *re_pcre;
- size_t re_nsub;
- size_t re_erroffset;
-} regex_t;
-
-/* The structure in which a captured offset is returned. */
-
-typedef int regoff_t;
-
-typedef struct {
- regoff_t rm_so;
- regoff_t rm_eo;
-} regmatch_t;
-
-/* The functions */
-
-extern int regcomp(regex_t *, const char *, int);
-extern int regexec(regex_t *, const char *, size_t, regmatch_t *, int);
-extern size_t regerror(int, const regex_t *, char *, size_t);
-extern void regfree(regex_t *);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* End of pcreposix.h */
+++ /dev/null
-/*************************************************
-* PCRE testing program *
-*************************************************/
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-#include <locale.h>
-
-/* Use the internal info for displaying the results of pcre_study(). */
-
-#include "internal.h"
-
-/* It is possible to compile this test program without including support for
-testing the POSIX interface, though this is not available via the standard
-Makefile. */
-
-#if !defined NOPOSIX
-#include "pcreposix.h"
-#endif
-
-#ifndef CLOCKS_PER_SEC
-#ifdef CLK_TCK
-#define CLOCKS_PER_SEC CLK_TCK
-#else
-#define CLOCKS_PER_SEC 100
-#endif
-#endif
-
-#define LOOPREPEAT 20000
-
-
-static FILE *outfile;
-static int log_store = 0;
-static size_t gotten_store;
-
-
-
-static int utf8_table1[] = {
- 0x0000007f, 0x000007ff, 0x0000ffff, 0x001fffff, 0x03ffffff, 0x7fffffff};
-
-static int utf8_table2[] = {
- 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
-
-static int utf8_table3[] = {
- 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
-
-
-/*************************************************
-* Convert character value to UTF-8 *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x7fffffff
-and encodes it as a UTF-8 character in 0 to 6 bytes.
-
-Arguments:
- cvalue the character value
- buffer pointer to buffer for result - at least 6 bytes long
-
-Returns: number of characters placed in the buffer
- -1 if input character is negative
- 0 if input character is positive but too big (only when
- int is longer than 32 bits)
-*/
-
-static int
-ord2utf8(int cvalue, unsigned char *buffer)
-{
-register int i, j;
-for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
- if (cvalue <= utf8_table1[i]) break;
-if (i >= sizeof(utf8_table1)/sizeof(int)) return 0;
-if (cvalue < 0) return -1;
-*buffer++ = utf8_table2[i] | (cvalue & utf8_table3[i]);
-cvalue >>= 6 - i;
-for (j = 0; j < i; j++)
- {
- *buffer++ = 0x80 | (cvalue & 0x3f);
- cvalue >>= 6;
- }
-return i + 1;
-}
-
-
-/*************************************************
-* Convert UTF-8 string to value *
-*************************************************/
-
-/* This function takes one or more bytes that represents a UTF-8 character,
-and returns the value of the character.
-
-Argument:
- buffer a pointer to the byte vector
- vptr a pointer to an int to receive the value
-
-Returns: > 0 => the number of bytes consumed
- -6 to 0 => malformed UTF-8 character at offset = (-return)
-*/
-
-int
-utf82ord(unsigned char *buffer, int *vptr)
-{
-int c = *buffer++;
-int d = c;
-int i, j, s;
-
-for (i = -1; i < 6; i++) /* i is number of additional bytes */
- {
- if ((d & 0x80) == 0) break;
- d <<= 1;
- }
-
-if (i == -1) { *vptr = c; return 1; } /* ascii character */
-if (i == 0 || i == 6) return 0; /* invalid UTF-8 */
-
-/* i now has a value in the range 1-5 */
-
-d = c & utf8_table3[i];
-s = 6 - i;
-
-for (j = 0; j < i; j++)
- {
- c = *buffer++;
- if ((c & 0xc0) != 0x80) return -(j+1);
- d |= (c & 0x3f) << s;
- s += 6;
- }
-
-/* Check that encoding was the correct unique one */
-
-for (j = 0; j < sizeof(utf8_table1)/sizeof(int); j++)
- if (d <= utf8_table1[j]) break;
-if (j != i) return -(i+1);
-
-/* Valid value */
-
-*vptr = d;
-return i+1;
-}
-
-
-
-
-
-
-/* Debugging function to print the internal form of the regex. This is the same
-code as contained in pcre.c under the DEBUG macro. */
-
-static const char *OP_names[] = {
- "End", "\\A", "\\B", "\\b", "\\D", "\\d",
- "\\S", "\\s", "\\W", "\\w", "\\Z", "\\z",
- "Opt", "^", "$", "Any", "chars", "not",
- "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
- "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
- "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
- "*", "*?", "+", "+?", "?", "??", "{", "{",
- "class", "Ref", "Recurse",
- "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",
- "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref",
- "Brazero", "Braminzero", "Bra"
-};
-
-
-static void print_internals(pcre *re)
-{
-unsigned char *code = ((real_pcre *)re)->code;
-
-fprintf(outfile, "------------------------------------------------------------------\n");
-
-for(;;)
- {
- int c;
- int charlength;
-
- fprintf(outfile, "%3d ", (int)(code - ((real_pcre *)re)->code));
-
- if (*code >= OP_BRA)
- {
- fprintf(outfile, "%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);
- code += 2;
- }
-
- else switch(*code)
- {
- case OP_END:
- fprintf(outfile, " %s\n", OP_names[*code]);
- fprintf(outfile, "------------------------------------------------------------------\n");
- return;
-
- case OP_OPT:
- fprintf(outfile, " %.2x %s", code[1], OP_names[*code]);
- code++;
- break;
-
- case OP_COND:
- fprintf(outfile, "%3d Cond", (code[1] << 8) + code[2]);
- code += 2;
- break;
-
- case OP_CREF:
- fprintf(outfile, " %.2d %s", code[1], OP_names[*code]);
- code++;
- break;
-
- case OP_CHARS:
- charlength = *(++code);
- fprintf(outfile, "%3d ", charlength);
- while (charlength-- > 0)
- if (isprint(c = *(++code))) fprintf(outfile, "%c", c);
- else fprintf(outfile, "\\x%02x", c);
- break;
-
- case OP_KETRMAX:
- case OP_KETRMIN:
- case OP_ALT:
- case OP_KET:
- case OP_ASSERT:
- case OP_ASSERT_NOT:
- case OP_ASSERTBACK:
- case OP_ASSERTBACK_NOT:
- case OP_ONCE:
- fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
- code += 2;
- break;
-
- case OP_REVERSE:
- fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
- code += 2;
- break;
-
- case OP_STAR:
- case OP_MINSTAR:
- case OP_PLUS:
- case OP_MINPLUS:
- case OP_QUERY:
- case OP_MINQUERY:
- case OP_TYPESTAR:
- case OP_TYPEMINSTAR:
- case OP_TYPEPLUS:
- case OP_TYPEMINPLUS:
- case OP_TYPEQUERY:
- case OP_TYPEMINQUERY:
- if (*code >= OP_TYPESTAR)
- fprintf(outfile, " %s", OP_names[code[1]]);
- else if (isprint(c = code[1])) fprintf(outfile, " %c", c);
- else fprintf(outfile, " \\x%02x", c);
- fprintf(outfile, "%s", OP_names[*code++]);
- break;
-
- case OP_EXACT:
- case OP_UPTO:
- case OP_MINUPTO:
- if (isprint(c = code[3])) fprintf(outfile, " %c{", c);
- else fprintf(outfile, " \\x%02x{", c);
- if (*code != OP_EXACT) fprintf(outfile, ",");
- fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
- if (*code == OP_MINUPTO) fprintf(outfile, "?");
- code += 3;
- break;
-
- case OP_TYPEEXACT:
- case OP_TYPEUPTO:
- case OP_TYPEMINUPTO:
- fprintf(outfile, " %s{", OP_names[code[3]]);
- if (*code != OP_TYPEEXACT) fprintf(outfile, "0,");
- fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
- if (*code == OP_TYPEMINUPTO) fprintf(outfile, "?");
- code += 3;
- break;
-
- case OP_NOT:
- if (isprint(c = *(++code))) fprintf(outfile, " [^%c]", c);
- else fprintf(outfile, " [^\\x%02x]", c);
- break;
-
- case OP_NOTSTAR:
- case OP_NOTMINSTAR:
- case OP_NOTPLUS:
- case OP_NOTMINPLUS:
- case OP_NOTQUERY:
- case OP_NOTMINQUERY:
- if (isprint(c = code[1])) fprintf(outfile, " [^%c]", c);
- else fprintf(outfile, " [^\\x%02x]", c);
- fprintf(outfile, "%s", OP_names[*code++]);
- break;
-
- case OP_NOTEXACT:
- case OP_NOTUPTO:
- case OP_NOTMINUPTO:
- if (isprint(c = code[3])) fprintf(outfile, " [^%c]{", c);
- else fprintf(outfile, " [^\\x%02x]{", c);
- if (*code != OP_NOTEXACT) fprintf(outfile, ",");
- fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
- if (*code == OP_NOTMINUPTO) fprintf(outfile, "?");
- code += 3;
- break;
-
- case OP_REF:
- fprintf(outfile, " \\%d", *(++code));
- code++;
- goto CLASS_REF_REPEAT;
-
- case OP_CLASS:
- {
- int i, min, max;
- code++;
- fprintf(outfile, " [");
-
- for (i = 0; i < 256; i++)
- {
- if ((code[i/8] & (1 << (i&7))) != 0)
- {
- int j;
- for (j = i+1; j < 256; j++)
- if ((code[j/8] & (1 << (j&7))) == 0) break;
- if (i == '-' || i == ']') fprintf(outfile, "\\");
- if (isprint(i)) fprintf(outfile, "%c", i); else fprintf(outfile, "\\x%02x", i);
- if (--j > i)
- {
- fprintf(outfile, "-");
- if (j == '-' || j == ']') fprintf(outfile, "\\");
- if (isprint(j)) fprintf(outfile, "%c", j); else fprintf(outfile, "\\x%02x", j);
- }
- i = j;
- }
- }
- fprintf(outfile, "]");
- code += 32;
-
- CLASS_REF_REPEAT:
-
- switch(*code)
- {
- case OP_CRSTAR:
- case OP_CRMINSTAR:
- case OP_CRPLUS:
- case OP_CRMINPLUS:
- case OP_CRQUERY:
- case OP_CRMINQUERY:
- fprintf(outfile, "%s", OP_names[*code]);
- break;
-
- case OP_CRRANGE:
- case OP_CRMINRANGE:
- min = (code[1] << 8) + code[2];
- max = (code[3] << 8) + code[4];
- if (max == 0) fprintf(outfile, "{%d,}", min);
- else fprintf(outfile, "{%d,%d}", min, max);
- if (*code == OP_CRMINRANGE) fprintf(outfile, "?");
- code += 4;
- break;
-
- default:
- code--;
- }
- }
- break;
-
- /* Anything else is just a one-node item */
-
- default:
- fprintf(outfile, " %s", OP_names[*code]);
- break;
- }
-
- code++;
- fprintf(outfile, "\n");
- }
-}
-
-
-
-/* Character string printing function. A "normal" and a UTF-8 version. */
-
-static void pchars(unsigned char *p, int length, int utf8)
-{
-int c;
-while (length-- > 0)
- {
- if (utf8)
- {
- int rc = utf82ord(p, &c);
- if (rc > 0)
- {
- length -= rc - 1;
- p += rc;
- if (c < 256 && isprint(c)) fprintf(outfile, "%c", c);
- else fprintf(outfile, "\\x{%02x}", c);
- continue;
- }
- }
-
- /* Not UTF-8, or malformed UTF-8 */
-
- if (isprint(c = *(p++))) fprintf(outfile, "%c", c);
- else fprintf(outfile, "\\x%02x", c);
- }
-}
-
-
-
-/* Alternative malloc function, to test functionality and show the size of the
-compiled re. */
-
-static void *new_malloc(size_t size)
-{
-gotten_store = size;
-if (log_store)
- fprintf(outfile, "Memory allocation (code space): %d\n",
- (int)((int)size - offsetof(real_pcre, code[0])));
-return malloc(size);
-}
-
-
-
-
-/* Get one piece of information from the pcre_fullinfo() function */
-
-static void new_info(pcre *re, pcre_extra *study, int option, void *ptr)
-{
-int rc;
-if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0)
- fprintf(outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option);
-}
-
-
-
-
-/* Read lines from named file or stdin and write to named file or stdout; lines
-consist of a regular expression, in delimiters and optionally followed by
-options, followed by a set of test data, terminated by an empty line. */
-
-int main(int argc, char **argv)
-{
-FILE *infile = stdin;
-int options = 0;
-int study_options = 0;
-int op = 1;
-int timeit = 0;
-int showinfo = 0;
-int showstore = 0;
-int posix = 0;
-int debug = 0;
-int done = 0;
-unsigned char buffer[30000];
-unsigned char dbuffer[1024];
-
-/* Static so that new_malloc can use it. */
-
-outfile = stdout;
-
-/* Scan options */
-
-while (argc > 1 && argv[op][0] == '-')
- {
- if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0)
- showstore = 1;
- else if (strcmp(argv[op], "-t") == 0) timeit = 1;
- else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
- else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
- else if (strcmp(argv[op], "-p") == 0) posix = 1;
- else
- {
- printf("*** Unknown option %s\n", argv[op]);
- printf("Usage: pcretest [-d] [-i] [-p] [-s] [-t] [<input> [<output>]]\n");
- printf(" -d debug: show compiled code; implies -i\n"
- " -i show information about compiled pattern\n"
- " -p use POSIX interface\n"
- " -s output store information\n"
- " -t time compilation and execution\n");
- return 1;
- }
- op++;
- argc--;
- }
-
-/* Sort out the input and output files */
-
-if (argc > 1)
- {
- infile = fopen(argv[op], "r");
- if (infile == NULL)
- {
- printf("** Failed to open %s\n", argv[op]);
- return 1;
- }
- }
-
-if (argc > 2)
- {
- outfile = fopen(argv[op+1], "w");
- if (outfile == NULL)
- {
- printf("** Failed to open %s\n", argv[op+1]);
- return 1;
- }
- }
-
-/* Set alternative malloc function */
-
-pcre_malloc = new_malloc;
-
-/* Heading line, then prompt for first regex if stdin */
-
-fprintf(outfile, "PCRE version %s\n\n", pcre_version());
-
-/* Main loop */
-
-while (!done)
- {
- pcre *re = NULL;
- pcre_extra *extra = NULL;
-
-#if !defined NOPOSIX /* There are still compilers that require no indent */
- regex_t preg;
- int do_posix = 0;
-#endif
-
- const char *error;
- unsigned char *p, *pp, *ppp;
- unsigned const char *tables = NULL;
- int do_study = 0;
- int do_debug = debug;
- int do_G = 0;
- int do_g = 0;
- int do_showinfo = showinfo;
- int do_showrest = 0;
- int utf8 = 0;
- int erroroffset, len, delimiter;
-
- if (infile == stdin) printf(" re> ");
- if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) break;
- if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
-
- p = buffer;
- while (isspace(*p)) p++;
- if (*p == 0) continue;
-
- /* Get the delimiter and seek the end of the pattern; if is isn't
- complete, read more. */
-
- delimiter = *p++;
-
- if (isalnum(delimiter) || delimiter == '\\')
- {
- fprintf(outfile, "** Delimiter must not be alphameric or \\\n");
- goto SKIP_DATA;
- }
-
- pp = p;
-
- for(;;)
- {
- while (*pp != 0)
- {
- if (*pp == '\\' && pp[1] != 0) pp++;
- else if (*pp == delimiter) break;
- pp++;
- }
- if (*pp != 0) break;
-
- len = sizeof(buffer) - (pp - buffer);
- if (len < 256)
- {
- fprintf(outfile, "** Expression too long - missing delimiter?\n");
- goto SKIP_DATA;
- }
-
- if (infile == stdin) printf(" > ");
- if (fgets((char *)pp, len, infile) == NULL)
- {
- fprintf(outfile, "** Unexpected EOF\n");
- done = 1;
- goto CONTINUE;
- }
- if (infile != stdin) fprintf(outfile, "%s", (char *)pp);
- }
-
- /* If the first character after the delimiter is backslash, make
- the pattern end with backslash. This is purely to provide a way
- of testing for the error message when a pattern ends with backslash. */
-
- if (pp[1] == '\\') *pp++ = '\\';
-
- /* Terminate the pattern at the delimiter */
-
- *pp++ = 0;
-
- /* Look for options after final delimiter */
-
- options = 0;
- study_options = 0;
- log_store = showstore; /* default from command line */
-
- while (*pp != 0)
- {
- switch (*pp++)
- {
- case 'g': do_g = 1; break;
- case 'i': options |= PCRE_CASELESS; break;
- case 'm': options |= PCRE_MULTILINE; break;
- case 's': options |= PCRE_DOTALL; break;
- case 'x': options |= PCRE_EXTENDED; break;
-
- case '+': do_showrest = 1; break;
- case 'A': options |= PCRE_ANCHORED; break;
- case 'D': do_debug = do_showinfo = 1; break;
- case 'E': options |= PCRE_DOLLAR_ENDONLY; break;
- case 'G': do_G = 1; break;
- case 'I': do_showinfo = 1; break;
- case 'M': log_store = 1; break;
-
-#if !defined NOPOSIX
- case 'P': do_posix = 1; break;
-#endif
-
- case 'S': do_study = 1; break;
- case 'U': options |= PCRE_UNGREEDY; break;
- case 'X': options |= PCRE_EXTRA; break;
- case '8': options |= PCRE_UTF8; utf8 = 1; break;
-
- case 'L':
- ppp = pp;
- while (*ppp != '\n' && *ppp != ' ') ppp++;
- *ppp = 0;
- if (setlocale(LC_CTYPE, (const char *)pp) == NULL)
- {
- fprintf(outfile, "** Failed to set locale \"%s\"\n", pp);
- goto SKIP_DATA;
- }
- tables = pcre_maketables();
- pp = ppp;
- break;
-
- case '\n': case ' ': break;
- default:
- fprintf(outfile, "** Unknown option '%c'\n", pp[-1]);
- goto SKIP_DATA;
- }
- }
-
- /* Handle compiling via the POSIX interface, which doesn't support the
- timing, showing, or debugging options, nor the ability to pass over
- local character tables. */
-
-#if !defined NOPOSIX
- if (posix || do_posix)
- {
- int rc;
- int cflags = 0;
- if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE;
- if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE;
- rc = regcomp(&preg, (char *)p, cflags);
-
- /* Compilation failed; go back for another re, skipping to blank line
- if non-interactive. */
-
- if (rc != 0)
- {
- (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer));
- fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer);
- goto SKIP_DATA;
- }
- }
-
- /* Handle compiling via the native interface */
-
- else
-#endif /* !defined NOPOSIX */
-
- {
- if (timeit)
- {
- register int i;
- clock_t time_taken;
- clock_t start_time = clock();
- for (i = 0; i < LOOPREPEAT; i++)
- {
- re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
- if (re != NULL) free(re);
- }
- time_taken = clock() - start_time;
- fprintf(outfile, "Compile time %.3f milliseconds\n",
- ((double)time_taken * 1000.0) /
- ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));
- }
-
- re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
-
- /* Compilation failed; go back for another re, skipping to blank line
- if non-interactive. */
-
- if (re == NULL)
- {
- fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset);
- SKIP_DATA:
- if (infile != stdin)
- {
- for (;;)
- {
- if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)
- {
- done = 1;
- goto CONTINUE;
- }
- len = (int)strlen((char *)buffer);
- while (len > 0 && isspace(buffer[len-1])) len--;
- if (len == 0) break;
- }
- fprintf(outfile, "\n");
- }
- goto CONTINUE;
- }
-
- /* Compilation succeeded; print data if required. There are now two
- info-returning functions. The old one has a limited interface and
- returns only limited data. Check that it agrees with the newer one. */
-
- if (do_showinfo)
- {
- int old_first_char, old_options, old_count;
- int count, backrefmax, first_char, need_char;
- size_t size;
-
- if (do_debug) print_internals(re);
-
- new_info(re, NULL, PCRE_INFO_OPTIONS, &options);
- new_info(re, NULL, PCRE_INFO_SIZE, &size);
- new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count);
- new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax);
- new_info(re, NULL, PCRE_INFO_FIRSTCHAR, &first_char);
- new_info(re, NULL, PCRE_INFO_LASTLITERAL, &need_char);
-
- old_count = pcre_info(re, &old_options, &old_first_char);
- if (count < 0) fprintf(outfile,
- "Error %d from pcre_info()\n", count);
- else
- {
- if (old_count != count) fprintf(outfile,
- "Count disagreement: pcre_fullinfo=%d pcre_info=%d\n", count,
- old_count);
-
- if (old_first_char != first_char) fprintf(outfile,
- "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n",
- first_char, old_first_char);
-
- if (old_options != options) fprintf(outfile,
- "Options disagreement: pcre_fullinfo=%d pcre_info=%d\n", options,
- old_options);
- }
-
- if (size != gotten_store) fprintf(outfile,
- "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n",
- size, gotten_store);
-
- fprintf(outfile, "Capturing subpattern count = %d\n", count);
- if (backrefmax > 0)
- fprintf(outfile, "Max back reference = %d\n", backrefmax);
- if (options == 0) fprintf(outfile, "No options\n");
- else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s\n",
- ((options & PCRE_ANCHORED) != 0)? " anchored" : "",
- ((options & PCRE_CASELESS) != 0)? " caseless" : "",
- ((options & PCRE_EXTENDED) != 0)? " extended" : "",
- ((options & PCRE_MULTILINE) != 0)? " multiline" : "",
- ((options & PCRE_DOTALL) != 0)? " dotall" : "",
- ((options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
- ((options & PCRE_EXTRA) != 0)? " extra" : "",
- ((options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
- ((options & PCRE_UTF8) != 0)? " utf8" : "");
-
- if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0)
- fprintf(outfile, "Case state changes\n");
-
- if (first_char == -1)
- {
- fprintf(outfile, "First char at start or follows \\n\n");
- }
- else if (first_char < 0)
- {
- fprintf(outfile, "No first char\n");
- }
- else
- {
- if (isprint(first_char))
- fprintf(outfile, "First char = \'%c\'\n", first_char);
- else
- fprintf(outfile, "First char = %d\n", first_char);
- }
-
- if (need_char < 0)
- {
- fprintf(outfile, "No need char\n");
- }
- else
- {
- if (isprint(need_char))
- fprintf(outfile, "Need char = \'%c\'\n", need_char);
- else
- fprintf(outfile, "Need char = %d\n", need_char);
- }
- }
-
- /* If /S was present, study the regexp to generate additional info to
- help with the matching. */
-
- if (do_study)
- {
- if (timeit)
- {
- register int i;
- clock_t time_taken;
- clock_t start_time = clock();
- for (i = 0; i < LOOPREPEAT; i++)
- extra = pcre_study(re, study_options, &error);
- time_taken = clock() - start_time;
- if (extra != NULL) free(extra);
- fprintf(outfile, " Study time %.3f milliseconds\n",
- ((double)time_taken * 1000.0)/
- ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));
- }
-
- extra = pcre_study(re, study_options, &error);
- if (error != NULL)
- fprintf(outfile, "Failed to study: %s\n", error);
- else if (extra == NULL)
- fprintf(outfile, "Study returned NULL\n");
-
- else if (do_showinfo)
- {
- uschar *start_bits = NULL;
- new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);
- if (start_bits == NULL)
- fprintf(outfile, "No starting character set\n");
- else
- {
- int i;
- int c = 24;
- fprintf(outfile, "Starting character set: ");
- for (i = 0; i < 256; i++)
- {
- if ((start_bits[i/8] & (1<<(i%8))) != 0)
- {
- if (c > 75)
- {
- fprintf(outfile, "\n ");
- c = 2;
- }
- if (isprint(i) && i != ' ')
- {
- fprintf(outfile, "%c ", i);
- c += 2;
- }
- else
- {
- fprintf(outfile, "\\x%02x ", i);
- c += 5;
- }
- }
- }
- fprintf(outfile, "\n");
- }
- }
- }
- }
-
- /* Read data lines and test them */
-
- for (;;)
- {
- unsigned char *q;
- unsigned char *bptr = dbuffer;
- int count, c;
- int copystrings = 0;
- int getstrings = 0;
- int getlist = 0;
- int gmatched = 0;
- int start_offset = 0;
- int g_notempty = 0;
- int offsets[45];
- int size_offsets = sizeof(offsets)/sizeof(int);
-
- options = 0;
-
- if (infile == stdin) printf("data> ");
- if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)
- {
- done = 1;
- goto CONTINUE;
- }
- if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
-
- len = (int)strlen((char *)buffer);
- while (len > 0 && isspace(buffer[len-1])) len--;
- buffer[len] = 0;
- if (len == 0) break;
-
- p = buffer;
- while (isspace(*p)) p++;
-
- q = dbuffer;
- while ((c = *p++) != 0)
- {
- int i = 0;
- int n = 0;
- if (c == '\\') switch ((c = *p++))
- {
- case 'a': c = 7; break;
- case 'b': c = '\b'; break;
- case 'e': c = 27; break;
- case 'f': c = '\f'; break;
- case 'n': c = '\n'; break;
- case 'r': c = '\r'; break;
- case 't': c = '\t'; break;
- case 'v': c = '\v'; break;
-
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- c -= '0';
- while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9')
- c = c * 8 + *p++ - '0';
- break;
-
- case 'x':
-
- /* Handle \x{..} specially - new Perl thing for utf8 */
-
- if (*p == '{')
- {
- unsigned char *pt = p;
- c = 0;
- while (isxdigit(*(++pt)))
- c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W');
- if (*pt == '}')
- {
- unsigned char buffer[8];
- int ii, utn;
- utn = ord2utf8(c, buffer);
- for (ii = 0; ii < utn - 1; ii++) *q++ = buffer[ii];
- c = buffer[ii]; /* Last byte */
- p = pt + 1;
- break;
- }
- /* Not correct form; fall through */
- }
-
- /* Ordinary \x */
-
- c = 0;
- while (i++ < 2 && isxdigit(*p))
- {
- c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W');
- p++;
- }
- break;
-
- case 0: /* Allows for an empty line */
- p--;
- continue;
-
- case 'A': /* Option setting */
- options |= PCRE_ANCHORED;
- continue;
-
- case 'B':
- options |= PCRE_NOTBOL;
- continue;
-
- case 'C':
- while(isdigit(*p)) n = n * 10 + *p++ - '0';
- copystrings |= 1 << n;
- continue;
-
- case 'G':
- while(isdigit(*p)) n = n * 10 + *p++ - '0';
- getstrings |= 1 << n;
- continue;
-
- case 'L':
- getlist = 1;
- continue;
-
- case 'N':
- options |= PCRE_NOTEMPTY;
- continue;
-
- case 'O':
- while(isdigit(*p)) n = n * 10 + *p++ - '0';
- if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n;
- continue;
-
- case 'Z':
- options |= PCRE_NOTEOL;
- continue;
- }
- *q++ = c;
- }
- *q = 0;
- len = q - dbuffer;
-
- /* Handle matching via the POSIX interface, which does not
- support timing. */
-
-#if !defined NOPOSIX
- if (posix || do_posix)
- {
- int rc;
- int eflags = 0;
- regmatch_t pmatch[sizeof(offsets)/sizeof(int)];
- if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
- if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
-
- rc = regexec(&preg, (const char *)bptr, size_offsets, pmatch, eflags);
-
- if (rc != 0)
- {
- (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer));
- fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer);
- }
- else
- {
- size_t i;
- for (i = 0; i < size_offsets; i++)
- {
- if (pmatch[i].rm_so >= 0)
- {
- fprintf(outfile, "%2d: ", (int)i);
- pchars(dbuffer + pmatch[i].rm_so,
- pmatch[i].rm_eo - pmatch[i].rm_so, utf8);
- fprintf(outfile, "\n");
- if (i == 0 && do_showrest)
- {
- fprintf(outfile, " 0+ ");
- pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, utf8);
- fprintf(outfile, "\n");
- }
- }
- }
- }
- }
-
- /* Handle matching via the native interface - repeats for /g and /G */
-
- else
-#endif /* !defined NOPOSIX */
-
- for (;; gmatched++) /* Loop for /g or /G */
- {
- if (timeit)
- {
- register int i;
- clock_t time_taken;
- clock_t start_time = clock();
- for (i = 0; i < LOOPREPEAT; i++)
- count = pcre_exec(re, extra, (char *)bptr, len,
- start_offset, options | g_notempty, offsets, size_offsets);
- time_taken = clock() - start_time;
- fprintf(outfile, "Execute time %.3f milliseconds\n",
- ((double)time_taken * 1000.0)/
- ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));
- }
-
- count = pcre_exec(re, extra, (char *)bptr, len,
- start_offset, options | g_notempty, offsets, size_offsets);
-
- if (count == 0)
- {
- fprintf(outfile, "Matched, but too many substrings\n");
- count = size_offsets/3;
- }
-
- /* Matched */
-
- if (count >= 0)
- {
- int i;
- for (i = 0; i < count * 2; i += 2)
- {
- if (offsets[i] < 0)
- fprintf(outfile, "%2d: <unset>\n", i/2);
- else
- {
- fprintf(outfile, "%2d: ", i/2);
- pchars(bptr + offsets[i], offsets[i+1] - offsets[i], utf8);
- fprintf(outfile, "\n");
- if (i == 0)
- {
- if (do_showrest)
- {
- fprintf(outfile, " 0+ ");
- pchars(bptr + offsets[i+1], len - offsets[i+1], utf8);
- fprintf(outfile, "\n");
- }
- }
- }
- }
-
- for (i = 0; i < 32; i++)
- {
- if ((copystrings & (1 << i)) != 0)
- {
- char copybuffer[16];
- int rc = pcre_copy_substring((char *)bptr, offsets, count,
- i, copybuffer, sizeof(copybuffer));
- if (rc < 0)
- fprintf(outfile, "copy substring %d failed %d\n", i, rc);
- else
- fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc);
- }
- }
-
- for (i = 0; i < 32; i++)
- {
- if ((getstrings & (1 << i)) != 0)
- {
- const char *substring;
- int rc = pcre_get_substring((char *)bptr, offsets, count,
- i, &substring);
- if (rc < 0)
- fprintf(outfile, "get substring %d failed %d\n", i, rc);
- else
- {
- fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc);
- /* free((void *)substring); */
- pcre_free_substring(substring);
- }
- }
- }
-
- if (getlist)
- {
- const char **stringlist;
- int rc = pcre_get_substring_list((char *)bptr, offsets, count,
- &stringlist);
- if (rc < 0)
- fprintf(outfile, "get substring list failed %d\n", rc);
- else
- {
- for (i = 0; i < count; i++)
- fprintf(outfile, "%2dL %s\n", i, stringlist[i]);
- if (stringlist[i] != NULL)
- fprintf(outfile, "string list not terminated by NULL\n");
- /* free((void *)stringlist); */
- pcre_free_substring_list(stringlist);
- }
- }
- }
-
- /* Failed to match. If this is a /g or /G loop and we previously set
- g_notempty after a null match, this is not necessarily the end.
- We want to advance the start offset, and continue. Fudge the offset
- values to achieve this. We won't be at the end of the string - that
- was checked before setting g_notempty. */
-
- else
- {
- if (g_notempty != 0)
- {
- offsets[0] = start_offset;
- offsets[1] = start_offset + 1;
- }
- else
- {
- if (gmatched == 0) /* Error if no previous matches */
- {
- if (count == -1) fprintf(outfile, "No match\n");
- else fprintf(outfile, "Error %d\n", count);
- }
- break; /* Out of the /g loop */
- }
- }
-
- /* If not /g or /G we are done */
-
- if (!do_g && !do_G) break;
-
- /* If we have matched an empty string, first check to see if we are at
- the end of the subject. If so, the /g loop is over. Otherwise, mimic
- what Perl's /g options does. This turns out to be rather cunning. First
- we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the
- same point. If this fails (picked up above) we advance to the next
- character. */
-
- g_notempty = 0;
- if (offsets[0] == offsets[1])
- {
- if (offsets[0] == len) break;
- g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED;
- }
-
- /* For /g, update the start offset, leaving the rest alone */
-
- if (do_g) start_offset = offsets[1];
-
- /* For /G, update the pointer and length */
-
- else
- {
- bptr += offsets[1];
- len -= offsets[1];
- }
- } /* End of loop for /g and /G */
- } /* End of loop for data lines */
-
- CONTINUE:
-
-#if !defined NOPOSIX
- if (posix || do_posix) regfree(&preg);
-#endif
-
- if (re != NULL) free(re);
- if (extra != NULL) free(extra);
- if (tables != NULL)
- {
- free((void *)tables);
- setlocale(LC_CTYPE, "C");
- }
- }
-
-fprintf(outfile, "\n");
-return 0;
-}
-
-/* End */
+++ /dev/null
-/*************************************************
-* Perl-Compatible Regular Expressions *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
- Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
- explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
- General Purpose Licence (GPL), then the terms of that licence shall
- supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-
-/*************************************************
-* Set a bit and maybe its alternate case *
-*************************************************/
-
-/* Given a character, set its bit in the table, and also the bit for the other
-version of a letter if we are caseless.
-
-Arguments:
- start_bits points to the bit map
- c is the character
- caseless the caseless flag
- cd the block with char table pointers
-
-Returns: nothing
-*/
-
-static void
-set_bit(uschar *start_bits, int c, BOOL caseless, compile_data *cd)
-{
-start_bits[c/8] |= (1 << (c&7));
-if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
- start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
-}
-
-
-
-/*************************************************
-* Create bitmap of starting chars *
-*************************************************/
-
-/* This function scans a compiled unanchored expression and attempts to build a
-bitmap of the set of initial characters. If it can't, it returns FALSE. As time
-goes by, we may be able to get more clever at doing this.
-
-Arguments:
- code points to an expression
- start_bits points to a 32-byte table, initialized to 0
- caseless the current state of the caseless flag
- cd the block with char table pointers
-
-Returns: TRUE if table built, FALSE otherwise
-*/
-
-static BOOL
-set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless,
- compile_data *cd)
-{
-register int c;
-
-/* This next statement and the later reference to dummy are here in order to
-trick the optimizer of the IBM C compiler for OS/2 into generating correct
-code. Apparently IBM isn't going to fix the problem, and we would rather not
-disable optimization (in this module it actually makes a big difference, and
-the pcre module can use all the optimization it can get). */
-
-volatile int dummy;
-
-do
- {
- const uschar *tcode = code + 3;
- BOOL try_next = TRUE;
-
- while (try_next)
- {
- try_next = FALSE;
-
- /* If a branch starts with a bracket or a positive lookahead assertion,
- recurse to set bits from within them. That's all for this branch. */
-
- if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT)
- {
- if (!set_start_bits(tcode, start_bits, caseless, cd))
- return FALSE;
- }
-
- else switch(*tcode)
- {
- default:
- return FALSE;
-
- /* Skip over lookbehind and negative lookahead assertions */
-
- case OP_ASSERT_NOT:
- case OP_ASSERTBACK:
- case OP_ASSERTBACK_NOT:
- try_next = TRUE;
- do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT);
- tcode += 3;
- break;
-
- /* Skip over an option setting, changing the caseless flag */
-
- case OP_OPT:
- caseless = (tcode[1] & PCRE_CASELESS) != 0;
- tcode += 2;
- try_next = TRUE;
- break;
-
- /* BRAZERO does the bracket, but carries on. */
-
- case OP_BRAZERO:
- case OP_BRAMINZERO:
- if (!set_start_bits(++tcode, start_bits, caseless, cd))
- return FALSE;
- dummy = 1;
- do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT);
- tcode += 3;
- try_next = TRUE;
- break;
-
- /* Single-char * or ? sets the bit and tries the next item */
-
- case OP_STAR:
- case OP_MINSTAR:
- case OP_QUERY:
- case OP_MINQUERY:
- set_bit(start_bits, tcode[1], caseless, cd);
- tcode += 2;
- try_next = TRUE;
- break;
-
- /* Single-char upto sets the bit and tries the next */
-
- case OP_UPTO:
- case OP_MINUPTO:
- set_bit(start_bits, tcode[3], caseless, cd);
- tcode += 4;
- try_next = TRUE;
- break;
-
- /* At least one single char sets the bit and stops */
-
- case OP_EXACT: /* Fall through */
- tcode++;
-
- case OP_CHARS: /* Fall through */
- tcode++;
-
- case OP_PLUS:
- case OP_MINPLUS:
- set_bit(start_bits, tcode[1], caseless, cd);
- break;
-
- /* Single character type sets the bits and stops */
-
- case OP_NOT_DIGIT:
- for (c = 0; c < 32; c++)
- start_bits[c] |= ~cd->cbits[c+cbit_digit];
- break;
-
- case OP_DIGIT:
- for (c = 0; c < 32; c++)
- start_bits[c] |= cd->cbits[c+cbit_digit];
- break;
-
- case OP_NOT_WHITESPACE:
- for (c = 0; c < 32; c++)
- start_bits[c] |= ~cd->cbits[c+cbit_space];
- break;
-
- case OP_WHITESPACE:
- for (c = 0; c < 32; c++)
- start_bits[c] |= cd->cbits[c+cbit_space];
- break;
-
- case OP_NOT_WORDCHAR:
- for (c = 0; c < 32; c++)
- start_bits[c] |= ~cd->cbits[c+cbit_word];
- break;
-
- case OP_WORDCHAR:
- for (c = 0; c < 32; c++)
- start_bits[c] |= cd->cbits[c+cbit_word];
- break;
-
- /* One or more character type fudges the pointer and restarts, knowing
- it will hit a single character type and stop there. */
-
- case OP_TYPEPLUS:
- case OP_TYPEMINPLUS:
- tcode++;
- try_next = TRUE;
- break;
-
- case OP_TYPEEXACT:
- tcode += 3;
- try_next = TRUE;
- break;
-
- /* Zero or more repeats of character types set the bits and then
- try again. */
-
- case OP_TYPEUPTO:
- case OP_TYPEMINUPTO:
- tcode += 2; /* Fall through */
-
- case OP_TYPESTAR:
- case OP_TYPEMINSTAR:
- case OP_TYPEQUERY:
- case OP_TYPEMINQUERY:
- switch(tcode[1])
- {
- case OP_NOT_DIGIT:
- for (c = 0; c < 32; c++)
- start_bits[c] |= ~cd->cbits[c+cbit_digit];
- break;
-
- case OP_DIGIT:
- for (c = 0; c < 32; c++)
- start_bits[c] |= cd->cbits[c+cbit_digit];
- break;
-
- case OP_NOT_WHITESPACE:
- for (c = 0; c < 32; c++)
- start_bits[c] |= ~cd->cbits[c+cbit_space];
- break;
-
- case OP_WHITESPACE:
- for (c = 0; c < 32; c++)
- start_bits[c] |= cd->cbits[c+cbit_space];
- break;
-
- case OP_NOT_WORDCHAR:
- for (c = 0; c < 32; c++)
- start_bits[c] |= ~cd->cbits[c+cbit_word];
- break;
-
- case OP_WORDCHAR:
- for (c = 0; c < 32; c++)
- start_bits[c] |= cd->cbits[c+cbit_word];
- break;
- }
-
- tcode += 2;
- try_next = TRUE;
- break;
-
- /* Character class: set the bits and either carry on or not,
- according to the repeat count. */
-
- case OP_CLASS:
- {
- tcode++;
- for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
- tcode += 32;
- switch (*tcode)
- {
- case OP_CRSTAR:
- case OP_CRMINSTAR:
- case OP_CRQUERY:
- case OP_CRMINQUERY:
- tcode++;
- try_next = TRUE;
- break;
-
- case OP_CRRANGE:
- case OP_CRMINRANGE:
- if (((tcode[1] << 8) + tcode[2]) == 0)
- {
- tcode += 5;
- try_next = TRUE;
- }
- break;
- }
- }
- break; /* End of class handling */
-
- } /* End of switch */
- } /* End of try_next loop */
-
- code += (code[1] << 8) + code[2]; /* Advance to next branch */
- }
-while (*code == OP_ALT);
-return TRUE;
-}
-
-
-
-/*************************************************
-* Study a compiled expression *
-*************************************************/
-
-/* This function is handed a compiled expression that it must study to produce
-information that will speed up the matching. It returns a pcre_extra block
-which then gets handed back to pcre_exec().
-
-Arguments:
- re points to the compiled expression
- options contains option bits
- errorptr points to where to place error messages;
- set NULL unless error
-
-Returns: pointer to a pcre_extra block,
- NULL on error or if no optimization possible
-*/
-
-pcre_extra *
-pcre_study(const pcre *external_re, int options, const char **errorptr)
-{
-uschar start_bits[32];
-real_pcre_extra *extra;
-const real_pcre *re = (const real_pcre *)external_re;
-compile_data compile_block;
-
-*errorptr = NULL;
-
-if (re == NULL || re->magic_number != MAGIC_NUMBER)
- {
- *errorptr = "argument is not a compiled regular expression";
- return NULL;
- }
-
-if ((options & ~PUBLIC_STUDY_OPTIONS) != 0)
- {
- *errorptr = "unknown or incorrect option bit(s) set";
- return NULL;
- }
-
-/* For an anchored pattern, or an unchored pattern that has a first char, or a
-multiline pattern that matches only at "line starts", no further processing at
-present. */
-
-if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0)
- return NULL;
-
-/* Set the character tables in the block which is passed around */
-
-compile_block.lcc = re->tables + lcc_offset;
-compile_block.fcc = re->tables + fcc_offset;
-compile_block.cbits = re->tables + cbits_offset;
-compile_block.ctypes = re->tables + ctypes_offset;
-
-/* See if we can find a fixed set of initial characters for the pattern. */
-
-memset(start_bits, 0, 32 * sizeof(uschar));
-if (!set_start_bits(re->code, start_bits, (re->options & PCRE_CASELESS) != 0,
- &compile_block)) return NULL;
-
-/* Get an "extra" block and put the information therein. */
-
-extra = (real_pcre_extra *)(pcre_malloc)(sizeof(real_pcre_extra));
-
-if (extra == NULL)
- {
- *errorptr = "failed to get memory";
- return NULL;
- }
-
-extra->options = PCRE_STUDY_MAPPED;
-memcpy(extra->start_bits, start_bits, sizeof(start_bits));
-
-return (pcre_extra *)extra;
-}
-
-/* End of study.c */
+++ /dev/null
-# Microsoft Developer Studio Project File - Name="vc_dftables" - 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_dftables - 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_dftables.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_dftables.mak"\\r
- CFG="vc_dftables - Win32 Debug with Win32 threads"\r
-!MESSAGE \r
-!MESSAGE Possible choices for configuration are:\r
-!MESSAGE \r
-!MESSAGE "vc_dftables - Win32 Release" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_dftables - Win32 Debug" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_dftables - Win32 Debug with Win32 threads" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_dftables - Win32 Release with Win32 threads" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE \r
-\r
-# Begin Project\r
-# PROP Scc_ProjName ""\r
-# PROP Scc_LocalPath ""\r
-CPP=cl.exe\r
-RSC=rc.exe\r
-\r
-!IF "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "Release"\r
-# PROP BASE Intermediate_Dir "Release"\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "vc_dftables"\r
-# PROP Intermediate_Dir "vc_dftables"\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\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 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 odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "Debug"\r
-# PROP BASE Intermediate_Dir "Debug"\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "vc_dftables_dbg"\r
-# PROP Intermediate_Dir "vc_dftables_dbg"\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 "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
-# ADD RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\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 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 odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables_dbg\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "vc_dftab"\r
-# PROP BASE Intermediate_Dir "vc_dftab"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "vc_dftables_dbg"\r
-# PROP Intermediate_Dir "vc_dftables_dbg"\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 "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
-# ADD RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\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 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 odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables_dbg\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "vc_dfta0"\r
-# PROP BASE Intermediate_Dir "vc_dfta0"\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "vc_dftables"\r
-# PROP Intermediate_Dir "vc_dftables"\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\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 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 odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ENDIF \r
-\r
-# Begin Target\r
-\r
-# Name "vc_dftables - Win32 Release"\r
-# Name "vc_dftables - Win32 Debug"\r
-# Name "vc_dftables - Win32 Debug with Win32 threads"\r
-# Name "vc_dftables - Win32 Release with Win32 threads"\r
-# Begin Group "File Copy"\r
-\r
-# PROP Default_Filter ""\r
-# Begin Source File\r
-\r
-SOURCE=..\config.h.win\r
-\r
-!IF "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win\r
-WkspDir=.\r
-InputPath=..\config.h.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
- copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win\r
-WkspDir=.\r
-InputPath=..\config.h.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
- copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ENDIF \r
-\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=..\config.h.win32threads.win\r
-\r
-!IF "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win32threads.win\r
-WkspDir=.\r
-InputPath=..\config.h.win32threads.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
- copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win32threads.win\r
-WkspDir=.\r
-InputPath=..\config.h.win32threads.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
- copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ENDIF \r
-\r
-# End Source File\r
-# End Group\r
-# Begin Source File\r
-\r
-SOURCE=..\config.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\config.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\dftables.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\internal.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\maketables.c\r
-\r
-!IF "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ENDIF \r
-\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\pcre.h\r
-# End Source File\r
-# End Target\r
-# End Project\r
-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.7 2001/06/29 13:33:04 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 : This is the alpha release of libpcrs. It is only published
+ * at this early stage of development, because it is
+ * needed for a new feature in JunkBuster.
*
+ * While no inconsistencies, memory leaks or functional bugs
+ * are known at this time, there *could* be plenty ;-). Also,
+ * Many pcre-specific options are not yet supported, and
+ * error handling needs improvement.
+ *
+ * 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 ;-)
+ *
+ * Short note: I 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
- *
* Revision 1.7 2001/06/29 13:33:04 oes
* - Cleaned up, renamed and reordered functions,
* improved comments
* - 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->block_length[l] = k - r->block_offset[l];
+ r->backref[l] = 0;
+ if (replacement[i + 1] != '&')
{
- r->backref[l] = capturecount;
- }
- else if (symbol - symbols == 3) /* $& */
- {
- r->backref[l] = 0;
- }
- else /* $' or $` */
- {
- 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
/*********************************************************************
*
- * Function : pcrs_compile_command
+ * Function : pcrs_compile
*
- * Description : Parses a string with a Perl-style s/// command,
- * calls pcrs_compile, and returns a corresponding
- * pcrs_job, or NULL if parsing or compiling the job
- * fails.
+ * Description : Main entry point. Takes a string with a Perl-style
+ * s/// command and returns a corresponding pcrs_job,
+ * or NULL if compiling the job fails at any stage.
*
* Parameters :
* 1 : command = string with perl-style s/// command
* has the reason.
*
*********************************************************************/
-pcrs_job *pcrs_compile_command(const char *command, int *errptr)
+pcrs_job *pcrs_compile(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);
+
+ newjob = pcrs_make_job(tokens[1], tokens[2], tokens[3], errptr);
free(tokens[0]);
return newjob;
-
+
}
/*********************************************************************
*
- * Function : pcrs_compile
+ * Function : pcrs_make_job
*
* Description : Takes the three arguments to a perl s/// command
* and compiles a pcrs_job structure from them.
* has the reason.
*
*********************************************************************/
-pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr)
+pcrs_job *pcrs_make_job(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 = "";
/*
* Get and init memory
/*
* 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]);
result_offset += job->substitute->block_length[k];
- /* ..plus, if it's not the last chunk, i.e.: There *is* a backref.. */
+ /* ..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
- /* ..and referencing a nonempty match.. */
- && matches[i].submatch_length[job->substitute->backref[k]] > 0)
+ /* ..and a nonempty match.. */
+ && matches[i].submatch_length[job->substitute->backref[k]] > 0
+ /* ..and in legal range, ... */
+ && job->substitute->backref[k] <= PCRS_MAX_SUBMATCHES)
{
- /* ..copy the submatch that is ref'd. */
+ /* copy the submatch that is ref'd. */
memcpy(
result_offset,
subject + matches[i].submatch_offset[job->substitute->backref[k]],
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()
- *
- * Revision 1.8 2001/08/15 15:32:50 oes
- * Replaced the hard limit for the maximum number of matches
- * by dynamic reallocation
- *
- * Revision 1.7 2001/08/05 13:13:11 jongfoster
- * Making parameters "const" where possible.
+ * While you ROTFL at the code, you could just as well mail me
+ * (oes@paradis.rhein.de) with advice for improvement.
*
- * Revision 1.6 2001/07/29 18:52:06 jongfoster
- * Renaming _PCRS_H, and adding "extern C {}"
+ * 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.5 2001/07/18 17:27:00 oes
- * Changed interface; Cosmetics
+ * Currently, there's no documentation besides comments and the
+ * source itself ;-)
*
- * Revision 1.4 2001/06/29 13:33:19 oes
- * - Cleaned up, commented and adapted to reflect the
- * changes in pcrs.c
- * - Introduced the PCRS_* flags
+ * Copyright : Written and copyright 2001 by Sourceforge IJBSWA team.
*
+ * Revisions :
+ * $Log: pcrs.h,v $
* Revision 1.3 2001/06/09 10:58:57 jongfoster
* Removing a single unused #define which referenced BUFSIZ
*
*
*********************************************************************/
-#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.3 2001/06/09 10:58:57 jongfoster 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 /* No backreferences need to be parsed in the substitute */
/*
* 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 S_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 S_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 {
+typedef struct S_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 */
- struct PCRS_JOB *next; /* Pointer for chaining jobs to joblists */
+ pcrs_substitute *substitute; /* The compiles pcrs substitute */
+ struct S_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(char *command, int *errptr);
+extern pcrs_job *pcrs_make_job(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.19 2001/06/29 13:33:36 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
- *
- * Revision 1.22 2001/07/15 17:51:41 jongfoster
- * Renaming #define STATIC to STATIC_PCRE
- *
- * Revision 1.21 2001/07/13 14:03:19 oes
- * - Reorganized regex header inclusion and #defines to
- * comply to the scheme in configure.in
- * - Added csp->content_type and its CT_* keys
- * - Added ACTION_DEANIMATE
- * - Removed all #ifdef PCRS
- *
- * Revision 1.20 2001/06/29 21:45:41 oes
- * Indentation, CRLF->LF, Tab-> Space
- *
* Revision 1.19 2001/06/29 13:33:36 oes
* - Improved comments
* - Introduced http_request.host_ip_addr_str
/*
* Include appropriate regular expression libraries.
- * Note that pcrs and pcre (native) are needed for cgi
- * and are included anyway.
+ *
+ * PCRS ==> Include pcre
+ * REGEX && PCRE ==> Include pcre and pcreposix
+ * REGEX && !PCRE ==> Include gnu_regex
+ *
+ * STATIC ==> Use #include "pcre.h" (compiling at same time)
+ * !STATIC ==> Use #include <pcre.h> (System library)
+ *
*/
+#if (defined(REGEX) && defined(PCRE)) || defined(PCRS)
+# ifdef STATIC
+# include "pcre.h"
+# else
+# include <pcre.h>
+# endif
+#endif /* (defined(REGEX) && defined(PCRE)) || defined(PCRS) */
-#if defined(REGEX_PCRE) || defined (REGEX_GNU)
-# define REGEX
-#endif /* defined(REGEX_PCRE) || defined (REGEX_GNU) */
-
-#ifdef STATIC_PCRE
-# include "pcre.h"
-#else
-# include <pcre.h>
-#endif
-
-#ifdef STATIC_PCRS
-# include "pcrs.h"
-#else
-# include <pcrs.h>
-#endif
-
-#if defined(REGEX_PCRE)
-# ifdef STATIC_PCRE
+#if defined(REGEX) && defined(PCRE)
+# ifdef STATIC
# include "pcreposix.h"
# else
# include <pcreposix.h>
# endif
-#endif /* defined(REGEX_PCRE) */
+#endif /* defined(REGEX) && defined(PCRE) */
-#if defined(REGEX_GNU)
+#if defined(REGEX) && !defined(PCRE)
# include "gnu_regex.h"
#endif
-#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 PCRS
+#include "pcrs.h"
+#endif /* def PCRS */
+#ifdef AMIGA
+#include "amiga.h"
+#endif /* def AMIGA */
#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 */
-
-
-/*
- * 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
+struct list /* FIXME: Why not separate entries and header? */
{
- const char *str;
- struct list_entry *next;
-};
-
-struct list
-{
- struct list_entry *first;
- struct list_entry *last;
-};
-
-
-/* A map from a string to another string */
-
-struct map_entry
-{
- const char *name;
- const char *value;
- struct map_entry *next;
+ char * str; /* valid in an entry */
+ struct list *last; /* valid in header */
+ struct list *next;
};
struct map
{
- struct map_entry *first;
- struct map_entry *last;
+ char *name;
+ char *value;
+ struct map *next;
};
-
struct http_request
{
- char *cmd; /* Whole command line: method, URL, Version */
- char *ocmd; /* Backup of original cmd for CLF logging */
- char *gpc; /* HTTP method: GET, POST, .. */
- char *url; /* The URL */
- char *ver; /* Protocol version */
- int status; /* HTTP Status */
-
- char *host; /* Host part of URL */
- int port; /* Port of URL or 80 (default) */
- char *path; /* Path of URL */
- char *hostport; /* host[:port] */
- int ssl; /* Flag if protocol is https */
-
- char *host_ip_addr_str; /* String with dotted decimal representation
- * of host's IP. NULL before connect_to() */
-
- char *dbuffer; /* Buffer with '\0'-delimited domain name. */
- char **dvec; /* List of pointers to the strings in dbuffer. */
- int dcount; /* How many parts to this domain? (length of dvec) */
+ char *cmd;
+ char *gpc;
+ char *host;
+ char *host_ip_addr_str; /* NULL before connect_to() */
+ int port;
+ char *path;
+ char *ver;
+ char *hostport; /* "host[:port]" */
+ int ssl;
};
-/*
- * Response generated by CGI, blocker, or error handler
- */
+/* Response generated by CGI, blocker, or error handler */
struct http_response
{
- char *status; /* HTTP status (string) */
+ char *status; /* HTTP status (string)*/
struct list headers[1]; /* List of header lines */
- char *head; /* Formatted http response head */
- size_t head_length; /* Length of http response head */
- char *body; /* HTTP document body */
- size_t content_length; /* Length of body, REQUIRED if binary body */
- int is_static; /* Nonzero if the content will never change and
- * should be cached by the brwoser (e.g. images) */
+ char *head; /* Formatted http response head */
+ int head_length; /* Length of http response head */
+ char *body; /* HTTP document body */
+ int content_length; /* Length of body, REQUIRED if binary body*/
};
/* A URL pattern */
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 ANCHOR_RIGHT 2
+
/* An I/O buffer */
struct iob
{
#define IOB_PEEK(CSP) ((CSP->iob->cur > CSP->iob->eod) ? (CSP->iob->eod - CSP->iob->cur) : 0)
#define IOB_RESET(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob));
-/* Bits for csp->content_type */
-#define CT_TEXT 1 /* Suitable for pcrs filtering */
-#define CT_GIF 2 /* Suitable for GIF filtering */
-#define CT_TABOO 4 /* DONT filter */
+
#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_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_MOST_COMPATIBLE 0x0000U
+
+#define ACTION_BLOCK 0x0001U
+#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_FROM 0
+#define ACTION_STRING_IMAGE_BLOCKER 1
+#define ACTION_STRING_REFERER 2
+#define ACTION_STRING_USER_AGENT 3
+#define ACTION_STRING_COUNT 4
#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;
+
+
+#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 */
- /* Multi-purpose flag container, see CSP_FLAG_* above */
- unsigned short int flags;
+#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;
+#if defined(PCRS) || defined(KILLPOPUPS)
+ /* Nonzero if this has a text MIME type */
+ int is_text;
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
/* 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 */
+#ifdef PCRS
+ struct file_list *rlist; /* Perl re_filterfile */
+ size_t content_length; /* Length after processing */
+#endif /* def PCRS */
-#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.
- */
+#ifdef PCRS
struct re_filterfile_spec
{
- char *name; /* Name from FILTER: statement in re_filterfile */
- char *description; /* Description from FILTER: statement in re_filterfile */
- struct list patterns[1]; /* The patterns from the re_filterfile */
- pcrs_job *joblist; /* The resulting compiled pcrs_jobs */
- struct re_filterfile_spec *next; /* The pointer for chaining */
+ struct list patterns[1];
+ pcrs_job *joblist;
};
+#endif /* def PCRS */
-#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;
/* A URL with info on this proxy */
char *proxy_info_url;
+#ifdef PCRS
const char *re_filterfile;
+#endif /* def PCRS */
-#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.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
+
+# ********************************************************************/
+#
+# 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.16 2001/06/29 13:35:07 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.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(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)
+#ifdef PCRS
+ SHOW_RCS(pcrs_rcs)
+ SHOW_RCS(pcrs_h_rcs)
+#endif /* def PCRS */
+ 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 REGEX
+ b = strsav(b, " <li><code>#define <b>REGEX</b></code> - Support for regular expressions in the path specs.</li>\n");
+#else /* 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 PCRE
+ b = strsav(b, " <li><code>#define <b>PCRE</b></code> - Use PCRE rather than old GNU regex library.</li>\n");
+#else /* ifndef PCRE */
+ b = strsav(b, " <li><code>#undef <b>PCRE</b></code> - Use old GNU regex library rather than PCRE.</li>\n");
+#endif /* ndef PCRE */
+
+#ifdef PCRS
+ b = strsav(b, " <li><code>#define <b>PCRS</b></code> - Enables arbitrary content modification regexps.</li>\n");
+#else /* ifndef PCRS */
+ b = strsav(b, " <li><code>#undef <b>PCRS</b></code> - Disables arbitrary content modification regexps.</li>\n");
+#endif /* ndef 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.</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>
+++ /dev/null
-##########################################################
-#
-# "Blocked" Error Output template for Privoxy.
-# Compact variant.
-#
-# 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.
-#
-# hostport:
-# The host and port part of the request that lead to this problem
-# path:
-# The path part of the request that lead to this problem
-#
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-# unstable:
-# This is an alpha or beta release of the proxy software
-# force-support:
-# Privoxy 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>
- <style type="text/css">
- BODY, P { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
- </style>
- </head>
-
- <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>
- <!-- @if-force-support-start -->
- or <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>.
- <!-- if-force-support-end@ -->
- <br><a href="@default-cgi@">More info</a>.
- </p>
-
- </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>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 Release\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" CFG="vc_junkbuster - Win32 Release"\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
- "Win32 (x86) Application")\r
-!MESSAGE "vc_privoxy - Win32 Debug with Win32 threads" (based on\\r
- "Win32 (x86) Application")\r
+!MESSAGE "vc_junkbuster - Win32 Release" (based on "Win32 (x86) Application")\r
+!MESSAGE "vc_junkbuster - Win32 Debug" (based on "Win32 (x86) Application")\r
!MESSAGE \r
\r
# Begin Project\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 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 /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
+# 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"\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
-\r
-!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "vc_junkb"\r
-# PROP BASE Intermediate_Dir "vc_junkb"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "vc_release_winthr"\r
-# PROP Intermediate_Dir "vc_release_winthr"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
-# ADD CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32\r
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\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 /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
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "vc_junk0"\r
-# PROP BASE Intermediate_Dir "vc_junk0"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "vc_debug_winthr"\r
-# PROP Intermediate_Dir "vc_debug_winthr"\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 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 RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\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 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
# 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
\r
-SOURCE=.\deanimate.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\deanimate.h\r
-# End Source File\r
-# Begin Source File\r
-\r
SOURCE=.\errlog.c\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
# PROP Default_Filter ""\r
+# Begin Group "File Copy"\r
+\r
+# PROP Default_Filter ".win"\r
+# Begin Source File\r
+\r
+SOURCE=.\config.h.win\r
+\r
+!IF "$(CFG)" == "vc_junkbuster - Win32 Release"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+ copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Debug"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+ copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
# Begin Source File\r
\r
SOURCE=.\cygwin.h\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
# Begin Source File\r
\r
SOURCE=.\pcre\chartables.c\r
-\r
-!IF "$(CFG)" == "vc_privoxy - Win32 Release"\r
-\r
# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF "$(CFG)" == "vc_privoxy - 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
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ENDIF \r
-\r
# End Source File\r
# Begin Source File\r
\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
Package=<4>\r
{{{\r
- Begin Project Dependency\r
- Project_Dep_Name vc_dftables\r
- End Project Dependency\r
}}}\r
\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
\r
Package=<4>\r
{{{\r
- Begin Project Dependency\r
- Project_Dep_Name vc_dftables\r
- End Project Dependency\r
}}}\r
\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.
- *
- * Revision 1.9 2001/06/07 23:08:54 jongfoster
- * Forward and ACL edit options removed.
- * Config edit option renamed from "&Junkbuster" to "&Configuration".
- *
* Revision 1.8 2001/05/31 21:37:11 jongfoster
* GUI changes to rename "permissions file" to "actions file".
*
* 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 */
#pragma code_page(1252)
#endif /* def _WIN32 */
-/*
- * File Version
- */
-#ifndef _MAC
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_POINT,0
- PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_POINT,0
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904b0"
- BEGIN
- VALUE "CompanyName", "The Privoxy team - www.privoxy.org\0"
- VALUE "FileDescription", "Privoxy\0"
- VALUE "FileVersion", VERSION "\0"
- VALUE "InternalName", "Privoxy\0"
- VALUE "LegalCopyright", "Distributed under the GNU GPL\0"
- VALUE "OriginalFilename", "privoxy.exe\0"
- VALUE "ProductName", "Privoxy\0"
- VALUE "ProductVersion", VERSION "\0"
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x409, 1200
- END
-END
-
-#endif /* ndef _MAC */
-
-
/*
* Menus
*/
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
+#ifdef PCRS
+ MENUITEM "Perl &Regexps...", ID_TOOLS_EDITPERLRE
+#endif /* def PCRS */
+#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
+#ifdef PCRS
+ MENUITEM "Perl &Regexps...", ID_TOOLS_EDITPERLRE
+#endif /* def PCRS */
+#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.10 2001/05/31 21:37:11 jongfoster 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
- *
- * Revision 1.11 2001/06/07 23:08:12 jongfoster
- * Forward and ACL edit options removed.
- *
* Revision 1.10 2001/05/31 21:37:11 jongfoster
* GUI changes to rename "permissions file" to "actions file".
*
#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;
/* FIXME: this is a kludge */
const char * g_actions_file = NULL;
+#ifdef PCRS
const char * g_re_filterfile = NULL;
-#ifdef FEATURE_TRUST
+#endif
+#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;
* Function : EditFile
*
* Description : Opens the specified setting file for editing.
- * FIXME: What if the file has no associated application. Check for return values
-* 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:
+#ifdef PCRS
+ case ID_TOOLS_EDITPERLRE:
EditFile(g_re_filterfile);
break;
+#endif
-#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
+#ifdef PCRS
+ EnableMenuItem(hmenu, ID_TOOLS_EDITPERLRE, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED));
+#endif
+#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.4 2001/05/31 21:37:11 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.
- *
* Revision 1.4 2001/05/31 21:37:11 jongfoster
* GUI changes to rename "permissions file" to "actions file".
*
/* FIXME: this is a kludge */
extern const char * g_actions_file;
+#ifdef PCRS
extern const char * g_re_filterfile;
-#ifdef FEATURE_TRUST
+#endif
+#ifdef TRUST_FILES
extern const char * g_trustfile;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
/* FIXME: end kludge */
+
extern int LogPutString(const char *pszText);
extern BOOL InitLogWindow(void);
extern void TermLogWindow(void);
} /* 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.6 2001/05/31 21:37:11 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.
- *
* Revision 1.6 2001/05/31 21:37:11 jongfoster
* GUI changes to rename "permissions file" to "actions file".
*
*
*********************************************************************/
+#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_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 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 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
-#ifdef FEATURE_TRUST
+#ifdef PCRS
+#define ID_TOOLS_EDITPERLRE 5002
+#endif /* def PCRS */
+
+#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