From ac994c1c109604492c8ef08384963182bd59e42b Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Wed, 27 Mar 2002 15:30:26 +0000 Subject: [PATCH] Synthetic commit for tag v_2_9_5 --- .gitignore | 16 +- AUTHORS | 53 - ChangeLog | 202 - GNUmakefile.in | 945 ---- Junkbuster Status.URL | Bin 0 -> 56 bytes LICENSE | 342 -- Makefile | 63 - Makefile.in | 352 ++ README | 181 - acconfig.h | 280 +- actionlist.h | 113 +- actions.c | 1039 ++-- actions.h | 92 +- default.action => actionsfile | 432 +- advanced.action | 90 - amiga.c | 64 +- amiga.h | 29 +- basic.action | 377 -- cgi.c | 1875 +++---- cgi.h | 167 +- cgiedit.c | 4522 ---------------- cgiedit.h | 154 - cgisimple.c | 1303 ----- cgisimple.h | 143 - config | 248 +- config.guess | 1314 ----- config.h.in | 280 + config.h.win | 401 +- config.h.win32threads.win | 469 -- config.sub | 1410 ----- pcre/configure => configure | 760 ++- configure.in | 964 +--- vc_console.dsp => console_junkbuster.dsp | 161 +- contrib.sh | 4035 --------------- cygwin.h | 22 +- deanimate.c | 501 -- deanimate.h | 102 - default.filter | 335 -- doc/.gitignore | 2 - doc/USER_DOC_IS_WIDELY_OBSOLETED | 0 doc/changes.txt | 991 ++++ doc/{obsolete => }/fb.gif | Bin doc/gpl.html | 8 +- doc/{obsolete => }/ijbfaq.html | 2 +- doc/{obsolete => }/ijbman.html | 2 +- doc/pcrs.3 | 479 -- doc/source/.gitignore | 4 - doc/source/developer-manual.sgml | 1570 ------ doc/source/faq.sgml | 1431 ------ doc/source/ldp.dsl | 172 - doc/source/user-manual.sgml | 4197 --------------- doc/text/developer-manual.txt | 1315 ----- doc/text/faq.txt | 881 ---- doc/text/user-manual.txt | 2097 -------- doc/{obsolete => }/top.gif | Bin doc/webserver/.gitignore | 4 - doc/webserver/.htaccess | 26 - doc/webserver/README.txt | 5 +- doc/webserver/config/.htaccess | 34 - doc/webserver/config/index.php | 22 - doc/webserver/default_page.php | 69 - doc/webserver/developer-manual.html | 71 + doc/webserver/documentation-guidelines.html | 86 + doc/webserver/faq.html | 115 + doc/webserver/index.html | 168 +- doc/webserver/p_doc.css | 11 - doc/webserver/p_web.css | 11 - doc/webserver/redirect.php | 42 +- doc/webserver/robots.txt | 15 - doc/webserver/swa.css | 9 + doc/webserver/testplan.html | 102 + doc/webserver/user-manual.html | 71 + encode.c | 100 +- encode.h | 29 +- errlog.c | 263 +- errlog.h | 58 +- filters.c | 1253 ++--- filters.h | 94 +- gateway.c | 148 +- gateway.h | 75 +- icons/denyrule.ico | Bin 0 -> 318 bytes icons/icon1.ico | Bin 0 -> 318 bytes icons/idle.ico | Bin 318 -> 318 bytes icons/{privoxy.ico => junkbust.ico} | Bin 318 -> 318 bytes icons/os2.ico | Bin 2456 -> 0 bytes icons/os20.ico | Bin 498 -> 0 bytes icons/os21.ico | Bin 498 -> 0 bytes icons/os22.ico | Bin 498 -> 0 bytes icons/os23.ico | Bin 498 -> 0 bytes icons/os24.ico | Bin 498 -> 0 bytes icons/os25.ico | Bin 498 -> 0 bytes icons/os26.ico | Bin 498 -> 0 bytes icons/os27.ico | Bin 498 -> 0 bytes icons/os28.ico | Bin 498 -> 0 bytes install-sh | 251 - intermediate.action | 90 - jbsockets.c | 400 +- jbsockets.h | 69 +- jcc.c | 1551 ++---- jcc.h | 85 +- junkbuster-rh.spec | 295 ++ junkbuster-suse.spec | 175 + junkbuster.1 | 871 ++++ junkbuster.init | 133 + junkbuster.init.suse | 76 + privoxy.logrotate => junkbuster.logrotate | 56 +- privoxy.monthly => junkbuster.monthly | 15 +- privoxy.weekly => junkbuster.weekly | 15 +- killpopup.c | 172 +- killpopup.h | 57 +- list.c | 868 +--- list.h | 95 +- loadcfg.c | 684 +-- loadcfg.h | 62 +- loaders.c | 1079 ++-- loaders.h | 130 +- miscutil.c | 1186 +---- miscutil.h | 76 +- parsers.c | 1384 ++--- parsers.h | 170 +- pcre/.gitignore | 2 - pcre/Makefile.in | 219 - pcre/RunTest.in | 148 - pcre/config.guess | 1121 ---- pcre/config.h | 5 - pcre/config.in | 33 - pcre/config.sub | 1232 ----- pcre/configure.in | 85 - pcre/dftables.c | 148 - pcre/dll.mk | 60 - pcre/doc/ChangeLog | 655 --- pcre/doc/NON-UNIX-USE | 50 - pcre/doc/Tech.Notes | 243 - pcre/doc/authors | 6 - pcre/doc/copying | 46 - pcre/doc/news | 54 - pcre/doc/pcre.3 | 1810 ------- pcre/doc/pcre.html | 2397 --------- pcre/doc/pcre.txt | 2125 -------- pcre/doc/pcregrep.1 | 76 - pcre/doc/pcregrep.html | 105 - pcre/doc/pcregrep.txt | 87 - pcre/doc/pcreposix.3 | 149 - pcre/doc/pcreposix.html | 191 - pcre/doc/pcreposix.txt | 159 - pcre/doc/pcretest.txt | 246 - pcre/doc/perltest.txt | 29 - pcre/doc/readme | 270 - pcre/get.c | 227 - pcre/install | 185 - pcre/install-sh | 251 - pcre/internal.h | 381 -- pcre/licence | 46 - pcre/ltconfig | 3078 ----------- pcre/ltmain.sh | 4012 --------------- pcre/maketables.c | 132 - pcre/pcre-config | 59 - pcre/pcre-config.in | 59 - pcre/pcre.c | 5151 ------------------- pcre/pcre.def | 19 - pcre/pcre.h | 110 - pcre/pcre.in | 110 - pcre/pcregrep.c | 228 - pcre/pcreposix.c | 280 - pcre/pcreposix.h | 88 - pcre/pcretest.c | 1225 ----- pcre/study.c | 397 -- pcre/vc_dftables.dsp | 296 -- pcrs.c | 634 +-- pcrs.h | 124 +- privoxy-rh.spec | 778 --- privoxy-suse.spec | 382 -- privoxy.1 | 334 -- privoxy.init | 251 - privoxy.init.suse | 117 - project.h | 729 +-- re_filterfile | 159 + showargs.c | 462 ++ showargs.h | 75 + ssplit.c | 20 +- ssplit.h | 22 +- templates/blocked | 89 +- templates/blocked-compact | 86 - templates/cgi-error-404 | 166 - templates/cgi-error-bad-param | 173 - templates/cgi-error-disabled | 160 - templates/cgi-error-file | 156 - templates/cgi-error-modified | 175 - templates/cgi-error-parse | 192 - templates/connect-failed | 86 +- templates/default | 72 +- templates/edit-actions-add-url-form | 169 - templates/edit-actions-for-url | 815 --- templates/edit-actions-for-url-filter | 6 - templates/edit-actions-list | 260 - templates/edit-actions-list-section | 103 - templates/edit-actions-list-url | 73 - templates/edit-actions-remove-url-form | 153 - templates/edit-actions-url-form | 171 - templates/no-such-domain | 98 +- templates/show-request | 172 - templates/show-status | 255 +- templates/show-status-file | 72 +- templates/show-url-info | 101 +- templates/show-version | 174 - templates/toggle | 199 - templates/toggle-mini | 90 - templates/untrusted | 92 +- testdrive.status | 31 - urlmatch.c | 824 --- urlmatch.h | 97 - vc_privoxy.dsp => vc_junkbuster.dsp | 184 +- vc_privoxy.dsw => vc_junkbuster.dsw | 10 +- w32.rc | 198 +- w32log.c | 158 +- w32log.h | 38 +- w32res.h | 95 +- w32rulesdlg.c | 548 ++ w32rulesdlg.h | 72 + w32taskbar.c | 22 +- w32taskbar.h | 24 +- win32.c | 150 +- win32.h | 32 +- 223 files changed, 10965 insertions(+), 77961 deletions(-) delete mode 100644 AUTHORS delete mode 100644 ChangeLog delete mode 100644 GNUmakefile.in create mode 100644 Junkbuster Status.URL delete mode 100644 LICENSE delete mode 100644 Makefile create mode 100644 Makefile.in delete mode 100644 README rename default.action => actionsfile (75%) mode change 100644 => 100755 delete mode 100644 advanced.action delete mode 100644 basic.action delete mode 100644 cgiedit.c delete mode 100644 cgiedit.h delete mode 100644 cgisimple.c delete mode 100644 cgisimple.h delete mode 100755 config.guess create mode 100644 config.h.in delete mode 100644 config.h.win32threads.win delete mode 100755 config.sub rename pcre/configure => configure (73%) mode change 100644 => 100755 rename vc_console.dsp => console_junkbuster.dsp (58%) mode change 100644 => 100755 delete mode 100755 contrib.sh delete mode 100644 deanimate.c delete mode 100644 deanimate.h delete mode 100644 default.filter delete mode 100644 doc/.gitignore create mode 100644 doc/USER_DOC_IS_WIDELY_OBSOLETED create mode 100644 doc/changes.txt rename doc/{obsolete => }/fb.gif (100%) rename doc/{obsolete => }/ijbfaq.html (97%) rename doc/{obsolete => }/ijbman.html (97%) delete mode 100644 doc/pcrs.3 delete mode 100644 doc/source/.gitignore delete mode 100644 doc/source/developer-manual.sgml delete mode 100644 doc/source/faq.sgml delete mode 100644 doc/source/ldp.dsl delete mode 100644 doc/source/user-manual.sgml delete mode 100644 doc/text/developer-manual.txt delete mode 100644 doc/text/faq.txt delete mode 100644 doc/text/user-manual.txt rename doc/{obsolete => }/top.gif (100%) delete mode 100644 doc/webserver/.gitignore delete mode 100644 doc/webserver/.htaccess delete mode 100644 doc/webserver/config/.htaccess delete mode 100644 doc/webserver/config/index.php delete mode 100644 doc/webserver/default_page.php create mode 100644 doc/webserver/developer-manual.html create mode 100644 doc/webserver/documentation-guidelines.html create mode 100644 doc/webserver/faq.html delete mode 100644 doc/webserver/p_doc.css delete mode 100644 doc/webserver/p_web.css delete mode 100644 doc/webserver/robots.txt create mode 100644 doc/webserver/swa.css create mode 100644 doc/webserver/testplan.html create mode 100644 doc/webserver/user-manual.html create mode 100644 icons/denyrule.ico create mode 100644 icons/icon1.ico rename icons/{privoxy.ico => junkbust.ico} (59%) delete mode 100644 icons/os2.ico delete mode 100644 icons/os20.ico delete mode 100644 icons/os21.ico delete mode 100644 icons/os22.ico delete mode 100644 icons/os23.ico delete mode 100644 icons/os24.ico delete mode 100644 icons/os25.ico delete mode 100644 icons/os26.ico delete mode 100644 icons/os27.ico delete mode 100644 icons/os28.ico delete mode 100755 install-sh delete mode 100644 intermediate.action create mode 100644 junkbuster-rh.spec create mode 100644 junkbuster-suse.spec create mode 100644 junkbuster.1 create mode 100644 junkbuster.init create mode 100644 junkbuster.init.suse rename privoxy.logrotate => junkbuster.logrotate (56%) rename privoxy.monthly => junkbuster.monthly (87%) rename privoxy.weekly => junkbuster.weekly (84%) delete mode 100644 pcre/.gitignore delete mode 100644 pcre/Makefile.in delete mode 100644 pcre/RunTest.in delete mode 100644 pcre/config.guess delete mode 100644 pcre/config.h delete mode 100644 pcre/config.in delete mode 100644 pcre/config.sub delete mode 100644 pcre/configure.in delete mode 100644 pcre/dftables.c delete mode 100644 pcre/dll.mk delete mode 100644 pcre/doc/ChangeLog delete mode 100644 pcre/doc/NON-UNIX-USE delete mode 100644 pcre/doc/Tech.Notes delete mode 100644 pcre/doc/authors delete mode 100644 pcre/doc/copying delete mode 100644 pcre/doc/news delete mode 100644 pcre/doc/pcre.3 delete mode 100644 pcre/doc/pcre.html delete mode 100644 pcre/doc/pcre.txt delete mode 100644 pcre/doc/pcregrep.1 delete mode 100644 pcre/doc/pcregrep.html delete mode 100644 pcre/doc/pcregrep.txt delete mode 100644 pcre/doc/pcreposix.3 delete mode 100644 pcre/doc/pcreposix.html delete mode 100644 pcre/doc/pcreposix.txt delete mode 100644 pcre/doc/pcretest.txt delete mode 100644 pcre/doc/perltest.txt delete mode 100644 pcre/doc/readme delete mode 100644 pcre/get.c delete mode 100644 pcre/install delete mode 100644 pcre/install-sh delete mode 100644 pcre/internal.h delete mode 100644 pcre/licence delete mode 100644 pcre/ltconfig delete mode 100644 pcre/ltmain.sh delete mode 100644 pcre/maketables.c delete mode 100644 pcre/pcre-config delete mode 100644 pcre/pcre-config.in delete mode 100644 pcre/pcre.c delete mode 100644 pcre/pcre.def delete mode 100644 pcre/pcre.h delete mode 100644 pcre/pcre.in delete mode 100644 pcre/pcregrep.c delete mode 100644 pcre/pcreposix.c delete mode 100644 pcre/pcreposix.h delete mode 100644 pcre/pcretest.c delete mode 100644 pcre/study.c delete mode 100755 pcre/vc_dftables.dsp delete mode 100644 privoxy-rh.spec delete mode 100644 privoxy-suse.spec delete mode 100644 privoxy.1 delete mode 100644 privoxy.init delete mode 100644 privoxy.init.suse create mode 100644 re_filterfile create mode 100644 showargs.c create mode 100644 showargs.h delete mode 100644 templates/blocked-compact delete mode 100644 templates/cgi-error-404 delete mode 100644 templates/cgi-error-bad-param delete mode 100644 templates/cgi-error-disabled delete mode 100644 templates/cgi-error-file delete mode 100644 templates/cgi-error-modified delete mode 100644 templates/cgi-error-parse delete mode 100644 templates/edit-actions-add-url-form delete mode 100644 templates/edit-actions-for-url delete mode 100644 templates/edit-actions-for-url-filter delete mode 100644 templates/edit-actions-list delete mode 100644 templates/edit-actions-list-section delete mode 100644 templates/edit-actions-list-url delete mode 100644 templates/edit-actions-remove-url-form delete mode 100644 templates/edit-actions-url-form delete mode 100644 templates/show-request delete mode 100644 templates/show-version delete mode 100644 templates/toggle delete mode 100644 templates/toggle-mini delete mode 100644 testdrive.status delete mode 100644 urlmatch.c delete mode 100644 urlmatch.h rename vc_privoxy.dsp => vc_junkbuster.dsp (61%) rename vc_privoxy.dsw => vc_junkbuster.dsw (68%) create mode 100644 w32rulesdlg.c create mode 100644 w32rulesdlg.h diff --git a/.gitignore b/.gitignore index 9ea1fd22..6780c5a6 100644 --- a/.gitignore +++ b/.gitignore @@ -26,30 +26,18 @@ _$* *.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 diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index 9bece11a..00000000 --- a/AUTHORS +++ /dev/null @@ -1,53 +0,0 @@ - Authors of Privoxy v2.9.x and 3.x -=========================================================================== - -Current Project developers: - - Stefan Waldherr - Andreas Oesterhelt - Jon Foster - - Markus Breitenbach - Thomas Steudten - -Current Project Contributors (in alphabetical order): - - David Schmidt (OS/2, Mac OSX ports) - Gabriel L. Somlo - Hal Burgiss (docs) - Haroon Rafique - John Venvertloh - Joerg Strohmayer - Rodney Stromlund - Rodrigo Barbosa (RPM specfiles) - Sarantis Paskalis - Shamim Mohamed - -Originally developed by: - - Junkbusters Corp. - Anonymous Coders - -Thanks to the many people who have tested Privoxy, reported bugs, -or made suggestions. These include (in alphabetical order): - - Aaron Hamid - Alexander Lazic (FreeBSD patch) - Andrew J. Caines - Bart Schelstraete - Clifford Caoile - Darren Wiebe - Gabor Liptak - Guy - Ken Arromdee - Magnus Holmgren - Paul Lieverse - Peter E - Reiner Buehl - -If we've missed you off this list, please let us know! - -Privoxy team. http://www.privoxy.org/ -ijbswa-developers@lists.sourceforge.net - - diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index e16c454b..00000000 --- a/ChangeLog +++ /dev/null @@ -1,202 +0,0 @@ --------------------------------------------------------------------- -ChangeLog for Internet JunkBuster --------------------------------------------------------------------- - -*** Version 2.9.13 Beta *** - -- *NEWS*: The project has been renamed to Privoxy! The new name is -reflected throughout (file locations, etc). -- ijb.action is now default.action. re_filterfile is now -default.filter. -- http://i.j.b/ is now http://p.p/ -- The 'logo' option for replacing ad iamges is removed now. 'Pattern' -(checkerboard) is now the default. - - -*** Version 2.9.12 Beta *** - -- **READ**: The default listening PORT is NOW 8118!!! Changed from -8000 due to conflict with NAS (Network Audio Server, whatever that -is.) -- More CGI actions editor fixes and improvements. -- Win32 command line fix ups. -- re_filterfile now has modular sections that can be activated on a -per site basis. Some new goodies there too. -- +filter now takes arguments to match FILTER sections in re_filterfile -for even more flexibility. -- Added a new image blocker option: +image-blocker{pattern}, which -displays a checkerboard patthern and scales better than the logo. -- PNG images will be used in place of GIF for JB built-in images -if configured with --enable-no-gif. -- Clean up compiler warnings (mostly). -- Improved handling of failed DNS lookups & diagnostics for failed bind -to listen socket -- Made --no-daemon mode log to tty instead of logfile. -- Various spec file and init script cleanups and improvements (Redhat and -SuSE). -- CGI Editor works on OS/2 now. -- Fix restart failure where sockets were in TIME_WAIT. -- Fixes for actions cgi editor, make sure we have right file. -- A --pidfile command line option now, in addition to --help, ---version, --no-daemon, --user and configfile. --no-daemon replaces -the former -d option and _DEBUG define. --user will drop privileges -to the specified user. -- Signal handling cleanups (*nix). -- CGI actions editor improvements and fixes. -- Error handling improvements, especially out of memory. -- Default re_filterfile fix that caused spurious IJB logos -(instead of 'blank'). -- configure.in threading fixes for Solaris. -- Various other minor fixes. - - -*** Version 2.9.11 Beta Changes *** - -- Add "session" cookie concept where cookies exist for the life -of that browser session only (ie never goes to disk). -- Checks for correct header length. -- Fix user:pass@host.domain.com auth bug. -- Better signal handling on *nix. -- Fix CFLAGS hard-coded in configure.in -- Fix threading bug re: gethostbyname() that caused random -URLs to fail in some cases. - - -*** Version 2.9.11 Alpha Changes *** - -- A web-based editor for the actions file is included (go to http://i.j.b/). -- Web-based toggle IJB on/off support. -- Cookie handling has changed - the new +no-cookies-keep feature is now the -default. -- actionsfile is renamed to ijb.action. -- junkbstr.txt is now config.txt on Win32. -- Support for running IJB as a UNIX daemon process has improved. -- Unix daemon now returns error code on failed start. -- Timestamps in logfile and jarfile now. -- Fix for the Netscape bug reintroduced in 2.9.9. -- make should now abort if gmake (GNU make) not present. -- Many other minor bugfixes -- Start a ChangeLog :) - - - -*** Version 2.9.3 pre-Alpha Changes *** - -- Amiga support (completely untested by me - I don't have an Amiga) -- "tinygif 3" support (redirects blocked images to a specified URL, so -the browser doesn't have to load and cache many copies of the same -image). -- one case where there were both local and global "referrer" variables -(yuck!) clarified by renaming the local one to "refer". -- Fixed some places where close() was used instead of close_socket(). -Thanks to Jörg Strohmayer (joergs at users.sourceforge.net) for these. -- Temporary hack to get FORCE_LOAD to work with IE. I just lowercased the -FORCE_LOAD_PREFIX. Needs fixing properly. -- Most URLs hardcoded into JunkBuster were changed to go through a script -e.g. http://ijbswa.sourceforge.net/redirect.php?v=2.9.3&to=faq -The only other URLs left are the GNU GPL: - http://www.fsf.org/copyleft/gpl.html -and the home page: - http://ijbswa.sourceforge.net/ -... and various URLs which will be intercepted by JunkBuster anyway. -TODO: Still need to do something with the URLs in JunkBuster Corp's -copyright/trademark notice on the bottom of the show-proxy-args page. -- PCRE or GNU Regex is now a #define option. - - -*** Version 2.9.2 pre-Alpha Changes *** - -- Andreas applied the latest version of the FORCE patch. - - -*** Version 2.9.1 pre-Alpha Changes *** - -- in parsers.c, fixed two #ifdef FORCE to #ifdef FORCE_LOAD -(BTW: I think FORCE is precise enough, since loading remote -data is the whole purpose of a proxy..) -- Set the FORCE_PREFIX (back) to 'IJB-FORCE-LOAD-'. While 'noijb.' -is more elegant and looks like a hostname in the URL, it doesn't -make clear to the inexperienced user that the proxy is bypassed. It -also has a higher name collision risk. -- Filled in the function header templates for my functions in -parsers.c (again). They obviously got lost in our current -patch war ;-) -- Cut the credit for the §-referrer-option from the config file, -that Stefan had placed there. -- Improved the re_filterfile - - -*** Version 2.9.0 pre-Alpha Changes *** - -- Now use PCRE, not GNU REGEX. I have not yet had chance to check the -syntax of the block/image/cookie file to ensure that they match what -is expected - however they seem to work. -- Replaced "configure" script with one generated by "autoconf". Also -use a header "config.h" (was ijbconfig.h in my previous release) for -the #defines. "config.h" is now generated with "autoheader" from -"acconfig.h" and "configure.in". (Note that to install you do not -need autoconf or autoheader - just run "./configure".) -To see command-line options, run "./configure --help". -This is my first ever autoconf script, so it has some rough edges -(how PCRE is handled is the roughest). -- Error logging code replaced with new module errlog.c, based on the -one from JunkBusterMT (but with the threading code removed). -- Most of Rodney's 0.21 and 0.21A patches applied. (Marked *). I did not -apply all of these, since I had already independently done conditional -popup file, conditional image file, and integration of popup code. -- ACL, Jar and trust files conditionally compiled. -- New source file headers. -- Various cosmetic changes. (But I have not consistently ordered the -config files - I think that's worthwhile, but it's 1am and I want to -get this released!) -- RCS tags on .h files. -- RCS tags are const char[] rather than const char *. (Saves 4 bytes -per tag ;-) -- VC++ project files renamed to vc_junkbuster.*. -- show-proxy-args now shows status of all conditionals, not just REGEX -- Various functions moved around. Most notably all the system-specific -sockets code which was spread between jcc.c, bind.c, and connect.c, -has been moved to "jbsockets.c". The non-system-specific code from -connect.c and socks4.c has been movet to "gateway.c". Also, the -config file loader and the global variables it writes to have been -moved to "loadcfg.c". (Maybe this should go into loaders.c?) -And candidate for the "worst filename ever" award is "miscutil.c", -which contains, well, miscellaneous utility functions like zalloc. -(Suggestions for a better name for this file are welcome!) -- Loaders now use a common function to read a line and skip comments, -and this function also stores the proxy_args. -- Added ./junkbuster --help (Not for Win32 GUI) -- Added ./junkbuster --version (Not for Win32 GUI) -- Win32 resources are now all marked as "U.S. English", rather than -being a mix of "U.S. English", "U.K. English" and "Irish English". -- Version number changes to 2.9.0 - - - ----------------------------------------------------------------------- -Copyright : Written by and Copyright (C) 2001 the SourceForge - Privoxy team. http://www.privoxy.org/ - - Based on the Internet Junkbuster originally written - by and Copyright (C) 1997 Anonymous Coders and - Junkbusters Corporation. http://www.junkbusters.com - - This program is free software; you can redistribute it - and/or modify it under the terms of the GNU General - Public License as published by the Free Software - Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A - PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - The GNU General Public License should be included with - this file. If not, you can view it at - http://www.gnu.org/copyleft/gpl.html - or write to the Free Software Foundation, Inc., 59 - Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - diff --git a/GNUmakefile.in b/GNUmakefile.in deleted file mode 100644 index 7726cc7e..00000000 --- a/GNUmakefile.in +++ /dev/null @@ -1,945 +0,0 @@ -# Note: Makefile is built automatically from Makefile.in -# -# $Id: GNUmakefile.in,v 1.36 2002/03/27 14:58:08 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -############################################################################# -# Version number (for RPM) -############################################################################# - -VERSION_MAJOR = @VERSION_MAJOR@ -VERSION_MINOR = @VERSION_MINOR@ -VERSION_POINT = @VERSION_POINT@ -CODE_STATUS = @CODE_STATUS@ -VERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_POINT) -# will automatically be postfixed with -$(RPM_PACKAGEV) in the SPECfile -RPM_VERSION = $(VERSION) -RPM_PACKAGEV = @VERSION_RPM_PACKAGE@ - - -############################################################################# -# Directories for "make install" -############################################################################# - -DEST = @sysconfdir@/privoxy -SBIN_DEST = @sbindir@ -MAN_DEST = @mandir@ - - -############################################################################# -# Build tools -############################################################################# - -PROGRAM = privoxy@EXEEXT@ -CC = @CC@ -ECHO = echo -GZIP_PROG = gzip -INSTALL = cp -f -LD = @CC@ -RM = rm -f -STRIP_PROG = strip -SED = sed -CAT = cat -RPM = rpm -MV = mv -TAR = tar -MAKE = make -LN = ln -WDUMP = @WDUMP@ -dump -JADEBIN = @JADEBIN@ -DB = $(JADEBIN) -t sgml -ihtml -D.. -d ldpOK.dsl\#html -DB2HTML = @DB2HTML@ -DKPREFIX = @DKPREFIX@ -MAN2HTML = @MAN2HTML@ -TARGET_OS = foobar - -# Program to do LF->CRLF -# -# The sed version should be the most portable, but it doesn't for for me, -# the other two do. FIXME. -# - Jon -#DOSFILTER = $(SED) -e $$'s,$$,\r,' -#DOSFILTER = gawk -v ORS='\r\n' '{print $0;}' -DOSFILTER = perl -p -e 's/\n/\r\n/' - -############################################################################# -# Setup for make distribution rh and suse for now -############################################################################# - -TAR_ARCH = /tmp/privoxy-$(RPM_VERSION).tar.gz -RPM_BASE = @RPM_BASE@ - -############################################################################# -# Filenames and libraries -############################################################################# - -C_SRC = actions.c cgi.c cgiedit.c cgisimple.c deanimate.c encode.c \ - errlog.c filters.c gateway.c jbsockets.c jcc.c killpopup.c \ - list.c loadcfg.c loaders.c miscutil.c parsers.c ssplit.c \ - urlmatch.c - -C_OBJS = $(C_SRC:.c=.@OBJEXT@) -C_HDRS = $(C_SRC:.c=.h) project.h actionlist.h - -CONFIG_FILES = config trust \ - default.action \ - basic.action intermediate.action advanced.action \ - default.filter \ - templates/* - -DOC_FILES = AUTHORS LICENSE README ChangeLog doc/text/* privoxy.1 - -W32_SRC = @WIN_ONLY@w32log.c w32taskbar.c win32.c -W32_FILES = @WIN_ONLY@w32.res -W32_OBJS = @WIN_ONLY@$(W32_SRC:.c=.@OBJEXT@) $(W32_FILES) -W32_HDRS = @WIN_ONLY@w32log.h w32taskbar.h win32.h w32res.h -W32_LIB = @WIN_ONLY@-lwsock32 -lcomctl32 -W32_INIS = @WIN_ONLY@config.txt trust.txt - -PCRS_SRC = @STATIC_PCRS_ONLY@pcrs.c -PCRS_OBJS = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.@OBJEXT@) -PCRS_HDRS = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.h) - -PCRE_SRC = @STATIC_PCRE_ONLY@pcre/get.c pcre/maketables.c pcre/study.c pcre/pcre.c -PCRE_OBJS = @STATIC_PCRE_ONLY@$(PCRE_SRC:.c=.@OBJEXT@) -PCRE_HDRS = @STATIC_PCRE_ONLY@pcre/config.h pcre/chartables.c pcre/internal.h pcre/pcre.h - -# No REGEX (Either because dynamically linked pcreposix, or no regex at all): -REGEX_SRC = -# GNU REGEX: -@GNU_REGEX_ONLY@REGEX_SRC = gnu_regex.c -# PCRE REGEX: -@PCRE_REGEX_ONLY@@STATIC_PCRE_ONLY@REGEX_SRC = pcre/pcreposix.c - -REGEX_OBJS = $(REGEX_SRC:.c=.@OBJEXT@) -REGEX_HDRS = $(REGEX_SRC:.c=.h) - -# Dependencies introduced by #include "project.h". -PROJECT_H_DEPS = project.h $(REGEX_HDRS) $(PCRS_HDRS) @STATIC_PCRE_ONLY@pcre/pcre.h - -# Socket libraries for platforms that need them explicitly defined -SOCKET_LIB = @SOCKET_LIB@ - -# PThreads library, if needed. -PTHREAD_LIB = @PTHREAD_ONLY@@PTHREAD_LIB@ - -SRCS = $(C_SRC) $(W32_SRC) $(PCRS_SRC) $(PCRE_SRC) $(REGEX_SRC) -OBJS = $(C_OBJS) $(W32_OBJS) $(PCRS_OBJS) $(PCRE_OBJS) $(REGEX_OBJS) -HDRS = $(C_HDRS) $(W32_HDRS) $(PCRS_HDRS) $(PCRE_OBJS) $(REGEX_HDRS) -LIBS = @LIBS@ $(W32_LIB) $(SOCKET_LIB) $(PTHREAD_LIB) - - -############################################################################# -# Compiler switches -############################################################################# - -# The flag "-mno-win32" can be used by Cygwin to emulate a un?x type build. -# The flag "-mwindows -mno-cygwin" will cause Cygwin to use MingW32 for a -# Win32 GUI build. -# The flag "-pthread" is required if using Pthreads under Linux (and -# possibly other OSs). -SPECIAL_CFLAGS = @SPECIAL_CFLAGS@ - -# Add your flags here -OTHER_CFLAGS = - -CFLAGS = @CFLAGS@ @CPPFLAGS@ $(OTHER_CFLAGS) $(SPECIAL_CFLAGS) -Wall \ - @STATIC_PCRE_ONLY@ -Ipcre - -LDFLAGS = $(DEBUG_CFLAGS) $(SPECIAL_CFLAGS) - - -############################################################################# -# Build section. -# -# There should NOT be any targets above this line. -############################################################################# -all: $(PROGRAM) - - -############################################################################# -# Phony targets -############################################################################# -.PHONY: all inifiles redhat-dist redhat-upload solaris-dist suse-dist \ -suse-upload win-dist tarball-dist dok redhat-dok webserver clean clobber tags \ -install - - -############################################################################# -# Define this explicitly because Solaris is broken! -############################################################################# -%.o: %.c - $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ - - -############################################################################# -# Win32 config files -############################################################################# - -inifiles: $(W32_INIS) - -config.txt: config - $(SED) -e 's!\trustfile trust!trustfile trust.txt!' \ - -e 's!\jarfile jarfile!jarfile jar.log!' \ - -e 's!\logfile logfile!logfile privoxy.log!' \ - -e 's!#Win32-only: !!' \ - < $< | \ - $(DOSFILTER) > $@ - # LF to CRLF in default.action - $(DOSFILTER) default.action.txt && mv default.action.txt default.action - # LF to CRLF in default.filter - $(DOSFILTER) 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) "Privoxy|Doc/Man page

NAME

" > doc/webserver/man-page/privoxy-man-page.html; \ - man ./privoxy.1 | $(MAN2HTML) -bare \ - >> doc/webserver/man-page/privoxy-man-page.html; \ - $(ECHO) "" >> doc/webserver/man-page/privoxy-man-page.html; \ - fi - -redhat-dok: doc/source/ldpOK.dsl man2html - mkdir -p doc/text doc/man doc/source/user-manual \ - doc/source/developer-manual doc/source/faq -## user manual - rm -rf doc/webserver/user-manual - cd doc/source/user-manual && $(DB) ../user-manual.sgml && cd .. &&\ - mv user-manual ../webserver - cd doc/source && $(DB) -V nochunks user-manual.sgml > tmp.html && \ - $(WDUMP) tmp.html > ../text/user-manual.txt && rm -rf tmp.html \ - user-manual -## developer manual - rm -rf doc/webserver/developer-manual - cd doc/source/developer-manual && $(DB) ../developer-manual.sgml &&\ - cd .. && mv developer-manual ../webserver - cd doc/source && $(DB) -V nochunks developer-manual.sgml > tmp.html && \ - $(WDUMP) tmp.html > ../text/developer-manual.txt && rm -rf tmp.html \ - developer-manual -## faq - rm -rf doc/webserver/faq - cd doc/source/faq && $(DB) ../faq.sgml && cd .. && mv faq ../webserver - cd doc/source && $(DB) -V nochunks faq.sgml > tmp.html && $(WDUMP) \ - tmp.html > ../text/faq.txt && rm -rf tmp.html faq - -doc/source/ldpOK.dsl: - if [ "$(DKPREFIX)" != "none" ]; then \ - sed -e "s@/usr/share/sgml/docbook/dsssl-stylesheets@$(DKPREFIX)@g" doc/source/ldp.dsl > doc/source/ldpOK.dsl; \ - else \ - cp doc/source/ldp.dsl doc/source/ldpOK.dsl; \ - fi - -man2html: - if [ "$(MAN2HTML)" != "false" ]; then \ - $(MAN2HTML) privoxy.1 |grep -v "^Content-type" > doc/webserver/man-page/privoxy-man-page.html; \ - fi - -############################################################################# -# -# Webserver -# -# moves dokumentation to webserver -# -############################################################################# -webserver: - @$(ECHO) ------------------------------------------------------- - @$(ECHO) You have run make dok/redhat-dok before, right? - @$(ECHO) Note that this command scps all stuff to the webserver, - @$(ECHO) it will not remove obsolete documents. - @$(ECHO) ------------------------------------------------------- - chmod -R a+r doc/webserver - find doc/webserver -type d -exec chmod a+rx {} \; - cd doc/webserver && scp -Cr . ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ - -############################################################################# -# Source file dependencies -############################################################################# - -actions.@OBJEXT@: actions.c actions.h config.h $(PROJECT_H_DEPS) errlog.h jcc.h list.h loaders.h miscutil.h actionlist.h -cgi.@OBJEXT@: cgi.c cgi.h config.h $(PROJECT_H_DEPS) cgiedit.h cgisimple.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h -cgiedit.@OBJEXT@: cgiedit.c cgiedit.h config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h -cgisimple.@OBJEXT@: cgisimple.c cgisimple.h config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h -deanimate.@OBJEXT@: deanimate.c deanimate.h config.h $(PROJECT_H_DEPS) -encode.@OBJEXT@: encode.c encode.h config.h -errlog.@OBJEXT@: errlog.c errlog.h config.h $(PROJECT_H_DEPS) @WIN_ONLY@w32log.h -filters.@OBJEXT@: filters.c filters.h config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jbsockets.h jcc.h loadcfg.h parsers.h ssplit.h cgi.h deanimate.h @WIN_ONLY@win32.h -gateway.@OBJEXT@: gateway.c gateway.h config.h $(PROJECT_H_DEPS) errlog.h jbsockets.h jcc.h loadcfg.h -jbsockets.@OBJEXT@: jbsockets.c jbsockets.h config.h $(PROJECT_H_DEPS) filters.h -jcc.@OBJEXT@: jcc.c jcc.h config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h killpopup.h loadcfg.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h cgi.h -killpopup.@OBJEXT@: killpopup.c killpopup.h config.h $(PROJECT_H_DEPS) jcc.h loadcfg.h -list.@OBJEXT@: list.c list.h config.h $(PROJECT_H_DEPS) list.h miscutil.h -loadcfg.@OBJEXT@: loadcfg.c loadcfg.h config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h jcc.h killpopup.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h -loaders.@OBJEXT@: loaders.c loaders.h config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h ssplit.h -miscutil.@OBJEXT@: miscutil.c miscutil.h config.h -parsers.@OBJEXT@: parsers.c parsers.h config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h jbsockets.h jcc.h loadcfg.h loaders.h miscutil.h ssplit.h -ssplit.@OBJEXT@: ssplit.c ssplit.h config.h miscutil.h -urlmatch.@OBJEXT@: urlmatch.c urlmatch.h config.h $(PROJECT_H_DEPS) errlog.h miscutil.h ssplit.h - -# GNU regex -gnu_regex.@OBJEXT@: gnu_regex.c gnu_regex.h config.h - -# PCRS -pcrs.@OBJEXT@: pcrs.c pcre/pcre.h pcrs.h - -# PCRE -pcre/get.@OBJEXT@: pcre/get.c pcre/config.h pcre/internal.h pcre/pcre.h -pcre/maketables.@OBJEXT@: pcre/maketables.c pcre/config.h pcre/internal.h pcre/pcre.h -pcre/pcre.@OBJEXT@: pcre/pcre.c pcre/config.h pcre/internal.h pcre/pcre.h pcre/chartables.c -pcre/pcreposix.@OBJEXT@: pcre/pcreposix.c pcre/config.h pcre/internal.h pcre/pcre.h pcre/pcreposix.h -pcre/study.@OBJEXT@: pcre/study.c pcre/config.h pcre/internal.h pcre/pcre.h - -# An auxiliary program makes the PCRE default character table source - -pcre/chartables.c: pcre/dftables@EXEEXT@ - pcre/dftables@EXEEXT@ >pcre/chartables.c - -pcre/dftables@EXEEXT@: pcre/dftables.c pcre/maketables.c pcre/pcre.h pcre/internal.h pcre/config.h - $(CC) -o pcre/dftables@EXEEXT@ $(CFLAGS) pcre/dftables.c - -# Win32 -w32log.@OBJEXT@: w32log.c errlog.h config.h jcc.h loadcfg.h miscutil.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h w32taskbar.h win32.h -w32taskbar.@OBJEXT@: w32taskbar.c config.h w32log.h w32taskbar.h -win32.@OBJEXT@: win32.c config.h jcc.h loadcfg.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h win32.h - -w32.res: w32.rc w32res.h icons/ico00001.ico icons/ico00002.ico icons/ico00003.ico icons/ico00004.ico icons/ico00005.ico icons/ico00006.ico icons/ico00007.ico icons/ico00008.ico icons/idle.ico icons/privoxy.ico config.h - windres -D__MINGW32__=0.2 -O coff -i $< -o $@ - -# AmigaOS -@AMIGAOS_ONLY@OBJS += amiga.o -@AMIGAOS_ONLY@CFLAGS += -D__AMIGAVERSION__=\"$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)\" -D__AMIGADATE__=\"`date +%d.%m.%Y`\" -W -m68020 -noixemul -fbaserel -msmall-code -@AMIGAOS_ONLY@LDFLAGS += -m68020 -noixemul -fbaserel -@AMIGAOS_ONLY@LIBS = -lm /gg/lib/libb/libm020/libnix/swapstack.o -@AMIGAOS_ONLY@amiga.o: amiga.c amiga.h config.h - - -$(PROGRAM): $(OBJS) $(W32_FILES) - $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS) - -clean: - $(RM) a.out core $(OBJS) $(W32_FILES) $(W32_INIS) $(PROGRAM) junkbuster - -clobber: clean - $(RM) $(PROGRAM) cscope.* logfile *.pdb *.lib *.exp `find . -name tags` `find . -name TAGS` config.status config.h.in config.log junkbuster.log privoxy.log config.cache *~ *.tar.gz configure - -tags: $(SRCS) $(HDRS) - etags $(SRCS) $(HDRS) - -install: all - # - # FIXME: This is a dirty hack to have an install target - # that works at least for some setups. This needs - # to be fixed! - # - $(STRIP_PROG) $(PROGRAM) - $(INSTALL) $(PROGRAM) $(SBIN_DEST) - mkdir -p $(DEST)/user-manual - mkdir -p $(DEST)/templates - cp -r doc/webserver/user-manual $(DEST) - cp -r templates $(DEST) - $(INSTALL) config default.action default.filter trust $(DEST) - # FIXME $(ECHO) privoxy.logrotate privoxy.monthly privoxy.weekly - # FIXME: Need new manual! $(GZIP_PROG) -c privoxy.1 > $(MAN_DEST)/privoxy.1.gz - $(INSTALL) privoxy.init /etc/init.d/privoxy - - -############################################################################# - -## Local Variables: -## tab-width: 3 -## end: - -# $Log: GNUmakefile.in,v $ -# Revision 1.36 2002/03/27 14:58:08 swa -# can be used by mutilple targets -# -# Revision 1.35 2002/03/27 14:53:19 swa -# added solaris-dist -# -# Revision 1.34 2002/03/27 10:30:11 swa -# we want a html man file on the webserver -# -# Revision 1.33 2002/03/27 03:05:35 hal9 -# Added man2html target for docs (redhat-dok only for now) -# -# Revision 1.32 2002/03/26 22:29:54 swa -# we have a new homepage! -# -# Revision 1.31 2002/03/26 14:00:18 swa -# fixed make tarball, tarball-dist, tarball-clean -# -# Revision 1.30 2002/03/25 12:52:25 swa -# new targets -# -# Revision 1.29 2002/03/24 17:03:55 jongfoster -# Name change -# -# Revision 1.28 2002/03/24 16:19:48 swa -# configure needs to be generated. -# -# Revision 1.27 2002/03/24 16:13:57 swa -# generated files are a nono in cvs -# -# Revision 1.26 2002/03/24 15:36:02 swa -# did not build. -# -# Revision 1.25 2002/03/24 14:31:08 swa -# remove more crappy files. set RPM -# release version correctly. -# -# Revision 1.24 2002/03/24 14:19:55 swa -# set rpm package release in configure.in. nowhere else. -# -# Revision 1.23 2002/03/24 13:06:49 swa -# suse-clean now runs fine -# -# Revision 1.22 2002/03/24 12:56:21 swa -# name change related issues. -# -# Revision 1.21 2002/03/24 12:43:57 swa -# name change -# -# Revision 1.20 2002/03/24 11:39:17 jongfoster -# Renaming config files -# -# Revision 1.19 2002/03/22 20:53:03 morcego -# - Ongoing process to change name to JunkbusterNG -# - configure/configure.in: no change needed -# - GNUmakefile.in: -# - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz -# - PROGRAM = jbng@EXEEXT@ -# - rh-spec now references as junkbusterng-rh.spec -# - redhat-upload: references changed to junkbusterng-* (package names) -# - tarball-dist: references changed to JunkbusterNG-distribution-* -# - tarball-src: now JunkbusterNG-* -# - install: initscript now junkbusterng.init and junkbusterng (when -# installed) -# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec -# - junkbusterng.spec: -# - References to the expression ijb where changed where possible -# - New package name: junkbusterng (all in lower case, acording to -# the LSB recomendation) -# - Version changed to: 2.9.13 -# - Release: 1 -# - Added: junkbuster to obsoletes and conflicts (Not sure this is -# right. If it obsoletes, why conflict ? Have to check it later) -# - Summary changed: Stefan, please check and aprove it -# - Changes description to use the new name -# - Sed string was NOT changed. Have to wait to the manpage to -# change first -# - Keeping the user junkbuster for now. It will require some aditional -# changes on the script (scheduled for the next specfile release) -# - Added post entry to move the old logfile to the new log directory -# - Removing "chkconfig --add" entry (not good to have it automaticaly -# added to the startup list). -# - Added preun section to stop the service with the old name, as well -# as remove it from the startup list -# - Removed the chkconfig --del entry from the conditional block on -# the preun scriptlet (now handled on the %files section) -# - junkbuster.init: renamed to junkbusterng.init -# - junkbusterng.init: -# - Changed JB_BIN to jbng -# - Created JB_OBIN with the old value of JB_BIN (junkbuster), to -# be used where necessary (config dir) -# -# Aditional notes: -# - The config directory is /etc/junkbuster yet. Have to change it on the -# specfile, after it is changes on the code -# - The only files that got renamed on the cvs tree were the rh specfile and -# the init file. Some file references got changes on the makefile and on the -# rh-spec (as listed above) -# -# Revision 1.18 2002/03/21 23:00:00 swa -# want to autogenerate stuff. -# -# Revision 1.17 2002/03/19 19:30:04 morcego -# - Fixing stylesheet checking on configure. If it is found, no further checks -# should be done -# -# - configure will now check for db2html or docbook2html (should work now -# on SuSe without the docbktls package) -# -# Revision 1.16 2002/03/14 22:32:32 hal9 -# Bumped the RPM version. -# -# Revision 1.15 2002/03/08 20:00:28 swa -# some leftovers. -# -# Revision 1.14 2002/03/07 18:25:56 swa -# synced redhat and suse build process -# -# Revision 1.13 2002/03/07 17:17:56 oes -# (Hopefully) fixed for older make versions -# -# Revision 1.12 2002/03/07 15:28:27 swa -# more informative -# -# Revision 1.11 2002/03/06 14:33:18 sarantis -# Use proper temp file, not "abc". -# -# Revision 1.10 2002/03/06 14:19:35 sarantis -# Cleanup PID_FILE_PATH from redhat-dist target -# -# Revision 1.9 2002/03/05 17:31:11 morcego -# Search for docbook.dsl. Should solve portability problems for SuSe. -# -# Revision 1.8 2002/03/05 14:07:42 morcego -# configure now detects rpm topdir, and change GNUmakefile acordingly -# (based on sugestion by Sarantis Paskalis) -# -# Revision 1.7 2002/03/05 13:43:28 morcego -# Checking for text browser, so redhat-dok can work. -# -# Revision 1.6 2002/03/05 13:10:51 morcego -# Changes to implement redhat-dok (Hal Burgiss) -# Changes to make it work on other distros and out-of-the-shelf configurations -# -# Revision 1.5 2002/02/27 15:30:39 hal9 -# Reset $(RPM_PACKAGEV) to 1 (was 2) -# -# Revision 1.4 2002/01/17 21:44:04 jongfoster -# Adding urlmatch.[ch] -# -# Revision 1.3 2002/01/04 15:26:08 oes -# Added tarball-src target -# -# Revision 1.2 2001/12/30 14:07:31 steudten -# - Add signal handling (unix) -# - Add SIGHUP handler (unix) -# - Add creation of pidfile (unix) -# - Add action 'top' in rc file (RH) -# - Add entry 'SIGNALS' to manpage -# - Add exit message to logfile (unix) -# -# Revision 1.1 2001/12/01 11:22:57 jongfoster -# Renaming Makefile.in to GNUmakefile.in so that non-GNU versions of -# make break in a more obvious way. -# Adding .PHONY section. -# -# Revision 1.40 2001/12/01 00:24:11 jongfoster -# Renaming various config files -# Fixing CR->CRLF under Win32 (I hope) -# -# Revision 1.39 2001/11/06 12:07:30 steudten -# Add --clean for building rpm in target redhat-dist. -# -# Revision 1.38 2001/11/05 21:35:23 steudten -# Complete rewrite for the 'redhat-dist' target. -# Checks for writeable RPM build directories for calling user. -# So you must not be root, just set the modes to 1777 to -# build a RH package. -# Fix the upload-target to be arch independant. -# Add target for 'solaris-dist' - coming soon. -# -# Revision 1.37 2001/11/01 00:52:04 hal9 -# Redhat-upload stuff per Stefan. -# -# Revision 1.36 2001/10/31 19:26:13 swa -# automate process of uploading new releases -# to sf. -# -# Revision 1.35 2001/10/15 22:14:59 joergs -# Removed -O2 and -Wall from AmigaOS-only CFLAGS since they are now in -# the general CFLAGS already. -# -# Revision 1.34 2001/10/15 18:28:06 steudten -# remove config.cache for target clobber. -# Cleanup make dist for RH and S.u.S.E. -# -# Revision 1.33 2001/10/10 12:43:33 oes -# Added ugly hack to make install target work at least for some setups. -# -# Revision 1.32 2001/10/09 22:38:19 jongfoster -# Correcting actionsfile filename for Win32 INI build -# -# Revision 1.31 2001/09/23 10:13:48 swa -# upload process established. run make webserver and -# the documentation is moved to the webserver. documents -# are now linked correctly. -# -# Revision 1.30 2001/09/19 17:55:49 oes -# Fixed CFLAGS -# -# Revision 1.29 2001/09/16 17:34:27 jongfoster -# Removing showargs.[ch], adding cgi(simple|edit).[ch] -# Replacing $(OBJEXT) with @OBJEXT@ - this seems to be a common source -# of build problems. -# -# Revision 1.28 2001/09/13 15:19:08 swa -# we want text files as well. -# -# Revision 1.27 2001/09/13 13:11:37 steudten -# -# Replace DEBUG_CFLAGS with OTHER_CFLAGS -# -# Revision 1.26 2001/09/12 23:44:54 david__schmidt -# Mac OSX (Darwin) support added. -# -# Revision 1.25 2001/09/12 22:55:45 joergs -# AmigaOS support added. -# -# Revision 1.24 2001/09/12 17:28:59 david__schmidt -# -# OS/2 port: update autoconf'd support for the platform. -# -# Revision 1.23 2001/09/12 16:28:42 swa -# added "make dok" section to generate html pages from -# the sgml source documents. note that the we do not want -# generated stuff in cvs. -# -# Revision 1.22 2001/09/10 16:31:23 swa -# buildroot definition in the specfile fucks up the build -# process under suse. hence I moved it to the "rpm -ta" -# command -# -# Revision 1.21 2001/09/10 11:12:49 oes -# Turning on -Wall -# -# Revision 1.20 2001/08/02 22:04:29 jongfoster -# Removing some remaining references to obsolete w32rulesdlg.[ch] -# -# Revision 1.19 2001/07/30 22:14:03 jongfoster -# Removing obsolete w32rulesdlg.c and w32rulesdlg.h -# -# Revision 1.18 2001/07/29 17:09:17 jongfoster -# Major changes to build system in order to fix these bugs: -# - pthreads under Linux was broken - changed -lpthread to -pthread -# - Compiling in MinGW32 mode under CygWin now correctly detects -# which shared libraries are available -# - Solaris support (?) (Not tested under Solaris yet) -# -# Revision 1.17 2001/07/28 16:44:54 oes -# Fixed sed LF->CRLF conversion and removed deprecated files -# -# Revision 1.16 2001/07/15 19:45:33 jongfoster -# Added support for linking with POSIX threads library -# -# Revision 1.15 2001/07/13 13:48:07 oes -# - Moved STATIC #define for pcre to (ac)config.h -# - Made -Ipcre depandant on static pcre compilation to -# avoid version conflicts -# - Included compilation and depandancies for new deanimate.c -# - Made changes to the pcre/pcreposix/pcrs build process -# as required by the new library autodetection in -# configure.in -# -# Revision 1.14 2001/07/01 16:27:44 oes -# Fixed misplaced dependancy -# -# Revision 1.13 2001/06/29 13:18:36 oes -# - added depandancy of filters.o on cgi.h -# -# Revision 1.12 2001/06/12 17:15:56 swa -# fixes, because a clean build on rh6.1 was impossible. -# GZIP confuses make, %configure confuses rpm, etc. -# -# Revision 1.11 2001/06/11 11:26:35 sarantis -# RPM version should be the same as ijbswa version. The rpm release is -# specified in the specfile. -# -# Revision 1.10 2001/06/07 17:27:45 swa -# added suse build section -# -# Revision 1.9 2001/06/04 18:31:58 swa -# files are now prefixed with either `confdir' or `logdir'. -# `make redhat-dist' replaces both entries confdir and logdir -# with redhat values -# -# Revision 1.8 2001/06/04 10:44:57 swa -# `make redhatr-dist' now works. Except for the paths -# in the config file. -# -# Revision 1.7 2001/06/03 17:09:09 swa -# swa for oes: reversed my earlier change -# -# Revision 1.6 2001/06/03 17:07:27 swa -# swa for oes -# -# Revision 1.5 2001/06/03 13:57:26 swa -# compile cgi.c (for andreas' GUI) -# -# Revision 1.4 2001/05/31 21:18:45 jongfoster -# Added files actions.[ch], actionlist.h, list.[ch] to Makefile -# -# Revision 1.3 2001/05/29 20:02:48 joergs -# Changes for AmigaOS added. -# -# Revision 1.2 2001/05/17 22:23:23 oes -# - Added auto-generation of CRLFs for Win32 config files -# - Added comment-prefix to all Win32-only options in the config file -# and provided auto stripping of this prefix for the Win32 platform by make -# -# Revision 1.1.1.1 2001/05/15 13:59:00 oes -# Initial import of version 2.9.3 source tree -# -# diff --git a/Junkbuster Status.URL b/Junkbuster Status.URL new file mode 100644 index 0000000000000000000000000000000000000000..6c95de6d7dd1d98bf88e8084020edb372acbfdd1 GIT binary patch literal 56 zcma#{%qvMP%1bQ?&d4t+NiHpkC|D9W#> L)J-f(FJ=G$T<;X} literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 1bcc46f5..00000000 --- a/LICENSE +++ /dev/null @@ -1,342 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - 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.) - -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. - - 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. - - 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 - - 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. - - - Copyright (C) - - 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. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - - diff --git a/Makefile b/Makefile deleted file mode 100644 index c195c8dc..00000000 --- a/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -# $Id: Makefile,v 1.2 2002/03/24 13:25:42 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# $Log: Makefile,v $ -# Revision 1.2 2002/03/24 13:25:42 swa -# name change related issues -# -# Revision 1.1 2001/12/01 11:24:29 jongfoster -# Will display a warning if non-GNU make is used -# -# - -############################################################################# - -error: GNUmakefile - @echo - @echo "ERROR!" - @echo "To build this program, you must run ./configure and then run GNU make." - @echo - @echo "You are not using the GNU version of Make - maybe it's called gmake" - @echo "or it's in a different directory?" - @echo - -GNUmakefile: - @echo - @echo "ERROR!" - @echo "To build this program, you must run ./configure and then run GNU make." - @echo - @echo "You haven't run ./configure yet." - @echo - @false - -.PHONY: error - -############################################################################# - -## Local Variables: -## tab-width: 3 -## end: diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..338f97b5 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,352 @@ +# 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/$$/& /' < $< > $@ + +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!$$!& !' \ + -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: diff --git a/README b/README deleted file mode 100644 index 2c3fc2c4..00000000 --- a/README +++ /dev/null @@ -1,181 +0,0 @@ -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/README,v $ - * - * Purpose : README file to give a short intro. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - *********************************************************************/ - -This README is included with the development version of Privoxy, -which will eventually become Privoxy v3.0 (and soon we hope!). See -http://www.privoxy.org/. The current code level is BETA, and seems -stable to us :) - -Privoxy is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other -obnoxious Internet junk. Privoxy has a very flexible configuration and -can be customized to suit individual needs and tastes. Privoxy -has application for both stand-alone systems and multi-user -networks. - -Privoxy is based on the code of the Internet Junkbuster. Junkbuster -was originally written by JunkBusters Corporation, and was released as -free open-source software under the GNU GPL. Stefan Waldherr made many -improvements, and started the SourceForge project to continue -development. Several other developers are now contributing. - - - IMPORTANT CHANGES ------------------- - -NEWS! As of 03/24/02, the name of this project has been changed -from ijbswa/Junkbuster to Privoxy. This is reflected in many of the -included files. - -WARNING! If upgrading from earlier versions of this project via -RPM packages, the new package will delete any previously installed -'Junkbuster' packages. - -IMPORTANT! READ! Configuration Change as of 3 Apr 2002: The default -listening port is now 8118 due to conflicts with port 8000 assignment. -You will need to change your browser if upgrading!!! And maybe -firewall, etc. - - - INSTALL --------- - -For tarball, first unpack: - - tar xzvf privoxy-2.9.13-beta-src.tar.gz - cd privoxy-2.9.13-beta - - autoheader - autoconf - ./configure (--help to see options) - gmake (the make from gnu) - su - make -n install (to see where all the files will go) - make install (to really install) - -Redhat and SuSE src and binary RPMs can be built with 'make -redhat-dist' or 'make suse-dist' (run ./configure first) from unpacked -sources. BSD will (probably?) require gmake (from http://gnu.org). See -the user-manual for OS/2 build instructions. - -Privoxy is also available via anonymous CVS: - - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co current - -This will create a directory named 'current'. Then, 'cd current', and -then build as above. - - - RUN ----- - -privoxy [--help] [--version] [--no-daemon] [--pidfile PIDFILE] - [--user USER] [config_file] - -Or for RedHat: /etc/rc.d/init.d/privoxy start -Or for SuSE: /etc/rc.d/privoxy start - -See the man page or user-manual for a brief explanation of each. - - - CONFIGURATION --------------- - -See: 'config', '*.action', and 'default.filter'. These are all well -commented. Most of the magic is in '*.action', and there are several -of these included with varying degrees of aggressiveness. On Unix-like -systems, these files are installed in /etc/privoxy. On Windows, then wherever -the executable itself is installed. There are many significant changes and -advances since Junkbuster v2.0.x. The user-manual has a run down of -configuration options, and examples: http://www.privoxy.org/user-manual/. - -Be sure to set your browser(s) for HTTP/HTTPS Proxy at :, 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 $ diff --git a/acconfig.h b/acconfig.h index bf746a61..bee43ab1 100644 --- a/acconfig.h +++ b/acconfig.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_H_INCLUDED -#define CONFIG_H_INCLUDED +#ifndef _CONFIG_H +#define _CONFIG_H /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/acconfig.h,v $ @@ -11,7 +11,7 @@ * getting ludicrously long with feature defines. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,101 +37,6 @@ * * 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 @@ -204,85 +109,74 @@ */ #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: * @@ -307,115 +201,43 @@ * 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 */ diff --git a/actionlist.h b/actionlist.h index c2ae6b48..beafdb5a 100644 --- a/actionlist.h +++ b/actionlist.h @@ -13,7 +13,7 @@ * DEFINE_ACTION_ALIAS * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -39,103 +39,26 @@ * * 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. - * * *********************************************************************/ -#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 - diff --git a/actions.c b/actions.c index e0f3fcad..e4e5aaf2 100644 --- a/actions.c +++ b/actions.c @@ -1,4 +1,4 @@ -const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"; +const char actions_rcs[] = "$Id: actions.c,v 1.7 2001/06/09 10:55:28 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/actions.c,v $ @@ -7,13 +7,13 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" * Functions declared include: FIXME * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at @@ -33,88 +33,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: actions.c,v $ - * Revision 1.25 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.24 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.23 2002/03/07 03:46:16 oes - * Fixed compiler warnings - * - * Revision 1.22 2002/01/21 00:27:02 jongfoster - * Allowing free_action(NULL). - * Moving the functions that #include actionlist.h to the end of the file, - * because the Visual C++ 97 debugger gets extremely confused if you try - * to debug any code that comes after them in the file. - * - * Revision 1.21 2002/01/17 20:54:44 jongfoster - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Revision 1.20 2001/11/22 21:56:49 jongfoster - * Making action_spec->flags into an unsigned long rather than just an - * unsigned int. - * Fixing a bug in the display of -add-header and -wafer - * - * Revision 1.19 2001/11/13 00:14:07 jongfoster - * Fixing stupid bug now I've figured out what || means. - * (It always returns 0 or 1, not one of it's paramaters.) - * - * Revision 1.18 2001/11/07 00:06:06 steudten - * Add line number in error output for lineparsing for - * actionsfile. - * - * Revision 1.17 2001/10/25 03:40:47 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.16 2001/10/23 21:30:30 jongfoster - * Adding error-checking to selected functions. - * - * Revision 1.15 2001/10/14 21:58:22 jongfoster - * Adding support for the CGI-based editor: - * - Exported get_actions() - * - Added new function free_alias_list() - * - Added support for {{settings}} and {{description}} blocks - * in the actions file. They are currently ignored. - * - Added restriction to only one {{alias}} block which must appear - * first in the file, to simplify the editor's rewriting rules. - * - Note that load_actions_file() is no longer used by the CGI-based - * editor, but some of the other routines in this file are. - * - * Revision 1.14 2001/09/22 16:36:59 jongfoster - * Removing unused parameter fs from read_config_line() - * - * Revision 1.13 2001/09/16 15:47:37 jongfoster - * First version of CGI-based edit interface. This is very much a - * work-in-progress, and you can't actually use it to edit anything - * yet. You must #define FEATURE_CGI_EDIT_ACTIONS for these changes - * to have any effect. - * - * Revision 1.12 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.11 2001/09/14 00:17:32 jongfoster - * Tidying up memory allocation. New function init_action(). - * - * Revision 1.10 2001/09/10 10:14:34 oes - * Removing unused variable - * - * Revision 1.9 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.8 2001/06/29 13:19:52 oes - * Removed logentry from cancelled commit - * * Revision 1.7 2001/06/09 10:55:28 jongfoster * Changing BUFSIZ ==> BUFFER_SIZE * @@ -146,8 +64,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" #include #include -#include -#include #include "project.h" #include "jcc.h" @@ -156,14 +72,27 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $" #include "miscutil.h" #include "errlog.h" #include "loaders.h" -#ifdef FEATURE_CGI_EDIT_ACTIONS -#include "encode.h" -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ -#include "urlmatch.h" const char actions_h_rcs[] = ACTIONS_H_VERSION; +/* Turn off everything except forwarding */ +/* This structure is used to hold user-defined aliases */ +struct action_alias +{ + const char * name; + struct action_spec action[1]; + struct action_alias * next; +}; + + +/* + * Must declare this in this file for the above structure. + */ +static int get_actions (char *line, + struct action_alias * alias_list, + struct action_spec *cur_action); + /* * We need the main list of options. * @@ -178,10 +107,10 @@ const char actions_h_rcs[] = ACTIONS_H_VERSION; #define AV_ADD_STRING 1 /* +stropt{string} */ #define AV_REM_STRING 2 /* -stropt */ #define AV_ADD_MULTI 3 /* +multiopt{string} +multiopt{string2} */ -#define AV_REM_MULTI 4 /* -multiopt{string} -multiopt */ +#define AV_REM_MULTI 4 /* -multiopt{string} -multiopt{*} */ /* - * We need a structure to hold the name, flag changes, + * We need a structure to hold the name, flag changes, * type, and string index. */ struct action_name @@ -237,14 +166,13 @@ static const struct action_name action_names[] = * 1 : cur_action = Current actions, to modify. * 2 : new_action = Action to add. * - * Returns : JB_ERR_OK or JB_ERR_MEMORY + * Returns : N/A * *********************************************************************/ -jb_err merge_actions (struct action_spec *dest, - const struct action_spec *src) +void merge_actions (struct action_spec *dest, + const struct action_spec *src) { int i; - jb_err err; dest->mask &= src->mask; dest->add &= src->mask; @@ -257,10 +185,6 @@ jb_err merge_actions (struct action_spec *dest, { freez(dest->string[i]); dest->string[i] = strdup(str); - if (NULL == dest->string[i]) - { - return JB_ERR_MEMORY; - } } } @@ -269,10 +193,10 @@ jb_err merge_actions (struct action_spec *dest, if (src->multi_remove_all[i]) { /* Remove everything from dest */ - list_remove_all(dest->multi_remove[i]); + destroy_list(dest->multi_remove[i]); + destroy_list(dest->multi_add[i]); dest->multi_remove_all[i] = 1; - - err = list_duplicate(dest->multi_add[i], src->multi_add[i]); + list_duplicate(dest->multi_add[i], src->multi_add[i]); } else if (dest->multi_remove_all[i]) { @@ -281,23 +205,16 @@ jb_err merge_actions (struct action_spec *dest, * about what we add. */ list_remove_list(dest->multi_add[i], src->multi_remove[i]); - err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]); + list_append_list_unique(dest->multi_add[i], src->multi_add[i]); } else { /* No "remove all"s to worry about. */ list_remove_list(dest->multi_add[i], src->multi_remove[i]); - err = list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]); - if (!err) err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]); - } - - if (err) - { - return err; + list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]); + list_append_list_unique(dest->multi_add[i], src->multi_add[i]); } } - - return JB_ERR_OK; } @@ -307,8 +224,6 @@ jb_err merge_actions (struct action_spec *dest, * * Description : Copy an action_specs. * Similar to "cur_action = new_action". - * Note that dest better not contain valid data - * - it's overwritten, not freed. * * Parameters : * 1 : dest = Destination of copy. @@ -317,13 +232,10 @@ jb_err merge_actions (struct action_spec *dest, * Returns : N/A * *********************************************************************/ -jb_err copy_action (struct action_spec *dest, - const struct action_spec *src) +void copy_action (struct action_spec *dest, + const struct action_spec *src) { int i; - jb_err err = JB_ERR_OK; - - memset(dest, '\0', sizeof(*dest)); dest->mask = src->mask; dest->add = src->add; @@ -331,32 +243,15 @@ jb_err copy_action (struct action_spec *dest, for (i = 0; i < ACTION_STRING_COUNT; i++) { char * str = src->string[i]; - if (str) - { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } - dest->string[i] = str; - } + dest->string[i] = (str ? strdup(str) : NULL); } for (i = 0; i < ACTION_MULTI_COUNT; i++) { dest->multi_remove_all[i] = src->multi_remove_all[i]; - err = list_duplicate(dest->multi_remove[i], src->multi_remove[i]); - if (err) - { - return err; - } - err = list_duplicate(dest->multi_add[i], src->multi_add[i]); - if (err) - { - return err; - } + list_duplicate(dest->multi_remove[i], src->multi_remove[i]); + list_duplicate(dest->multi_add[i], src->multi_add[i]); } - return err; } @@ -364,9 +259,7 @@ jb_err copy_action (struct action_spec *dest, * * Function : free_action * - * Description : Destroy an action_spec. Frees memory used by it, - * except for the memory used by the struct action_spec - * itself. + * Description : Free an action_specs. * * Parameters : * 1 : src = Source to free. @@ -378,11 +271,6 @@ void free_action (struct action_spec *src) { int i; - if (src == NULL) - { - return; - } - for (i = 0; i < ACTION_STRING_COUNT; i++) { freez(src->string[i]); @@ -418,14 +306,14 @@ void free_action (struct action_spec *src) * we found an action. * 2 : name = [out] Start of action name, null * terminated. NULL on EOL - * 3 : value = [out] Start of action value, null + * 3 : value = [out] Start of action value, null * terminated. NULL if none or EOL. * - * Returns : JB_ERR_OK => Ok - * JB_ERR_PARSE => Mismatched {} (line was trashed anyway) + * Returns : 0 => Ok + * nonzero => Mismatched {} (line was trashed anyway) * *********************************************************************/ -jb_err get_action_token(char **line, char **name, char **value) +int get_action_token(char **line, char **name, char **value) { char * str = *line; char ch; @@ -449,19 +337,19 @@ jb_err get_action_token(char **line, char **name, char **value) if (*str == '{') { /* null name, just value is prohibited */ - return JB_ERR_PARSE; + return 1; } *name = str; /* parse option */ - while (((ch = *str) != '\0') && + while (((ch = *str) != '\0') && (ch != ' ') && (ch != '\t') && (ch != '{')) { if (ch == '}') { - /* error, '}' without '{' */ - return JB_ERR_PARSE; + /* error */ + return 1; } str++; } @@ -480,7 +368,7 @@ jb_err get_action_token(char **line, char **name, char **value) /* More to parse next time. */ *line = str + 1; } - return JB_ERR_OK; + return 0; } str++; @@ -491,7 +379,7 @@ jb_err get_action_token(char **line, char **name, char **value) { /* error */ *value = NULL; - return JB_ERR_PARSE; + return 1; } /* got value */ @@ -500,7 +388,7 @@ jb_err get_action_token(char **line, char **name, char **value) chomp(*value); - return JB_ERR_OK; + return 0; } @@ -517,17 +405,15 @@ jb_err get_action_token(char **line, char **name, char **value) * 3 : cur_action = Where to store the action. Caller * allocates memory. * - * Returns : JB_ERR_OK => Ok - * JB_ERR_PARSE => Parse error (line was trashed anyway) - * nonzero => Out of memory (line was trashed anyway) + * Returns : 0 => Ok + * nonzero => Error (line was trashed anyway) * *********************************************************************/ -jb_err get_actions(char *line, - struct action_alias * alias_list, - struct action_spec *cur_action) +static int get_actions(char *line, + struct action_alias * alias_list, + struct action_spec *cur_action) { - jb_err err; - init_action(cur_action); + memset(cur_action, '\0', sizeof(*cur_action)); cur_action->mask = ACTION_MASK_ALL; while (line) @@ -535,16 +421,15 @@ jb_err get_actions(char *line, char * option = NULL; char * value = NULL; - err = get_action_token(&line, &option, &value); - if (err) + if (get_action_token(&line, &option, &value)) { - return err; + return 1; } if (option) { /* handle option in 'option' */ - + /* Check for standard action name */ const struct action_name * action = action_names; @@ -570,15 +455,11 @@ jb_err get_actions(char *line, if ((value == NULL) || (*value == '\0')) { - return JB_ERR_PARSE; + return 1; } /* FIXME: should validate option string here */ freez (cur_action->string[action->index]); cur_action->string[action->index] = strdup(value); - if (NULL == cur_action->string[action->index]) - { - return JB_ERR_MEMORY; - } break; } case AV_REM_STRING: @@ -592,28 +473,24 @@ jb_err get_actions(char *line, { /* append multi string. */ - struct list * remove_p = cur_action->multi_remove[action->index]; - struct list * add_p = cur_action->multi_add[action->index]; + struct list * remove = cur_action->multi_remove[action->index]; + struct list * add = cur_action->multi_add[action->index]; if ((value == NULL) || (*value == '\0')) { - return JB_ERR_PARSE; + return 1; } - list_remove_item(remove_p, value); - err = enlist_unique(add_p, value, 0); - if (err) - { - return err; - } + list_remove_item(remove, value); + enlist_unique(add, value, 0); break; } case AV_REM_MULTI: { /* remove multi string. */ - struct list * remove_p = cur_action->multi_remove[action->index]; - struct list * add_p = cur_action->multi_add[action->index]; + struct list * remove = cur_action->multi_remove[action->index]; + struct list * add = cur_action->multi_add[action->index]; if ( (value == NULL) || (*value == '\0') || ((*value == '*') && (value[1] == '\0')) ) @@ -623,8 +500,8 @@ jb_err get_actions(char *line, * * Remove *ALL*. */ - list_remove_all(remove_p); - list_remove_all(add_p); + destroy_list(remove); + destroy_list(add); cur_action->multi_remove_all[action->index] = 1; } else @@ -634,27 +511,22 @@ jb_err get_actions(char *line, if ( !cur_action->multi_remove_all[action->index] ) { /* there isn't a catch-all in the remove list already */ - err = enlist_unique(remove_p, value, 0); - if (err) - { - return err; - } + enlist_unique(remove, value, 0); } - list_remove_item(add_p, value); + list_remove_item(add, value); } break; } default: /* Shouldn't get here unless there's memory corruption. */ - assert(0); - return JB_ERR_PARSE; + return 1; } } else { /* try user aliases. */ const struct action_alias * alias = alias_list; - + while ( (alias != NULL) && (0 != strcmpic(alias->name, option)) ) { alias = alias->next; @@ -667,51 +539,187 @@ jb_err get_actions(char *line, else { /* Bad action name */ - return JB_ERR_PARSE; + return 1; } } } } - return JB_ERR_OK; + return 0; } /********************************************************************* * - * Function : init_current_action + * Function : actions_to_text * - * Description : Zero out an action. + * Description : Converts a actionsfile entry from numeric form + * ("mask" and "add") to text. * * Parameters : - * 1 : dest = An uninitialized current_action_spec. + * 1 : mask = As from struct url_actions + * 2 : add = As from struct url_actions * - * Returns : N/A + * Returns : A string. Caller must free it. * *********************************************************************/ -void init_current_action (struct current_action_spec *dest) +char * actions_to_text(struct action_spec *action) { - memset(dest, '\0', sizeof(*dest)); + unsigned mask = action->mask; + unsigned add = action->add; + char * result = strdup(""); + struct list * lst; - dest->flags = ACTION_MOST_COMPATIBLE; + /* sanity - prevents "-feature +feature" */ + mask |= add; + + +#define DEFINE_ACTION_BOOL(__name, __bit) \ + if (!(mask & __bit)) \ + { \ + result = strsav(result, " -" __name); \ + } \ + else if (add & __bit) \ + { \ + result = strsav(result, " +" __name); \ + } + +#define DEFINE_ACTION_STRING(__name, __bit, __index) \ + if (!(mask & __bit)) \ + { \ + result = strsav(result, " -" __name); \ + } \ + else if (add & __bit) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, action->string[__index]); \ + result = strsav(result, "}"); \ + } + +#define DEFINE_ACTION_MULTI(__name, __index) \ + if (action->multi_remove_all[__index]) \ + { \ + result = strsav(result, " -" __name "{*}"); \ + } \ + else \ + { \ + lst = action->multi_remove[__index]->next; \ + while (lst) \ + { \ + result = strsav(result, " -" __name "{"); \ + result = strsav(result, lst->str); \ + result = strsav(result, "}"); \ + lst = lst->next; \ + } \ + } \ + lst = action->multi_add[__index]->next; \ + while (lst) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, lst->str); \ + result = strsav(result, "}"); \ + lst = lst->next; \ + } + +#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ + +#include "actionlist.h" + +#undef DEFINE_ACTION_MULTI +#undef DEFINE_ACTION_STRING +#undef DEFINE_ACTION_BOOL +#undef DEFINE_ACTION_ALIAS + + return result; } /********************************************************************* * - * Function : init_action + * Function : current_actions_to_text + * + * Description : Converts a actionsfile entry to text. + * + * Parameters : + * 1 : action = Action + * + * Returns : A string. Caller must free it. + * + *********************************************************************/ +char * current_action_to_text(struct current_action_spec *action) +{ + unsigned flags = action->flags; + char * result = strdup(""); + struct list * lst; + +#define DEFINE_ACTION_BOOL(__name, __bit) \ + if (flags & __bit) \ + { \ + result = strsav(result, " +" __name); \ + } \ + else \ + { \ + result = strsav(result, " -" __name); \ + } + +#define DEFINE_ACTION_STRING(__name, __bit, __index) \ + if (flags & __bit) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, action->string[__index]); \ + result = strsav(result, "}"); \ + } \ + else \ + { \ + result = strsav(result, " -" __name); \ + } + +#define DEFINE_ACTION_MULTI(__name, __index) \ + lst = action->multi[__index]->next; \ + if (lst == NULL) \ + { \ + result = strsav(result, " -" __name); \ + } \ + else \ + { \ + while (lst) \ + { \ + result = strsav(result, " +" __name "{"); \ + result = strsav(result, lst->str); \ + result = strsav(result, "}"); \ + lst = lst->next; \ + } \ + } + +#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ + +#include "actionlist.h" + +#undef DEFINE_ACTION_MULTI +#undef DEFINE_ACTION_STRING +#undef DEFINE_ACTION_BOOL +#undef DEFINE_ACTION_ALIAS + + return result; +} + + +/********************************************************************* + * + * Function : init_current_action * * Description : Zero out an action. * * Parameters : - * 1 : dest = An uninitialized action_spec. + * 1 : dest = An uninitialized current_action_spec. * * Returns : N/A * *********************************************************************/ -void init_action (struct action_spec *dest) +void init_current_action (struct current_action_spec *dest) { memset(dest, '\0', sizeof(*dest)); + dest->flags = ACTION_MOST_COMPATIBLE; } @@ -725,7 +733,7 @@ void init_action (struct action_spec *dest) * is that this one doesn't allocate memory for * strings (so "src" better be in memory for at least * as long as "dest" is, and you'd better free - * "dest" using "free_current_action"). + * "dest" using "current_free_action"). * Also, there is no mask or remove lists in dest. * (If we're applying it to a URL, we don't need them) * @@ -733,15 +741,13 @@ void init_action (struct action_spec *dest) * 1 : dest = Current actions, to modify. * 2 : src = Action to add. * - * Returns 0 : no error - * !=0 : error, probably JB_ERR_MEMORY. + * Returns : N/A * *********************************************************************/ -jb_err merge_current_action (struct current_action_spec *dest, - const struct action_spec *src) +void merge_current_action (struct current_action_spec *dest, + const struct action_spec *src) { int i; - jb_err err = JB_ERR_OK; dest->flags &= src->mask; dest->flags |= src->add; @@ -751,13 +757,8 @@ jb_err merge_current_action (struct current_action_spec *dest, char * str = src->string[i]; if (str) { - str = strdup(str); - if (!str) - { - return JB_ERR_MEMORY; - } freez(dest->string[i]); - dest->string[i] = str; + dest->string[i] = strdup(str); } } @@ -765,24 +766,16 @@ jb_err merge_current_action (struct current_action_spec *dest, { if (src->multi_remove_all[i]) { - /* Remove everything from dest, then add src->multi_add */ - err = list_duplicate(dest->multi[i], src->multi_add[i]); - if (err) - { - return err; - } + /* Remove everything from dest */ + destroy_list(dest->multi[i]); + list_duplicate(dest->multi[i], src->multi_add[i]); } else { list_remove_list(dest->multi[i], src->multi_remove[i]); - err = list_append_list_unique(dest->multi[i], src->multi_add[i]); - if (err) - { - return err; - } + list_append_list_unique(dest->multi[i], src->multi_add[i]); } } - return err; } @@ -790,8 +783,7 @@ jb_err merge_current_action (struct current_action_spec *dest, * * Function : free_current_action * - * Description : Free memory used by a current_action_spec. - * Does not free the current_action_spec itself. + * Description : Free a current_action_spec. * * Parameters : * 1 : src = Source to free. @@ -817,33 +809,6 @@ void free_current_action (struct current_action_spec *src) } -static struct file_list *current_actions_file = NULL; - - -#ifdef FEATURE_GRACEFUL_TERMINATION -/********************************************************************* - * - * Function : unload_current_actions_file - * - * Description : Unloads current actions file - reset to state at - * beginning of program. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void unload_current_actions_file(void) -{ - if (current_actions_file) - { - current_actions_file->unloader = unload_actions_file; - current_actions_file = NULL; - } -} -#endif /* FEATURE_GRACEFUL_TERMINATION */ - - /********************************************************************* * * Function : unload_actions_file @@ -864,8 +829,7 @@ void unload_actions_file(void *file_data) while (cur != NULL) { next = cur->next; - free_url_spec(cur->url); - free_action(cur->action); + free_url(cur->url); freez(cur); cur = next; } @@ -873,32 +837,6 @@ void unload_actions_file(void *file_data) } -/********************************************************************* - * - * Function : free_alias_list - * - * Description : Free memory used by a list of aliases. - * - * Parameters : - * 1 : alias_list = Linked list to free. - * - * Returns : N/A - * - *********************************************************************/ -void free_alias_list(struct action_alias *alias_list) -{ - while (alias_list != NULL) - { - struct action_alias * next = alias_list->next; - alias_list->next = NULL; - freez(alias_list->name); - free_action(alias_list->action); - free(alias_list); - alias_list = next; - } -} - - /********************************************************************* * * Function : load_actions_file @@ -914,29 +852,22 @@ void free_alias_list(struct action_alias *alias_list) *********************************************************************/ int load_actions_file(struct client_state *csp) { - - /* - * Parser mode. - * Note: Keep these in the order they occur in the file, they are - * sometimes tested with <= - */ -#define MODE_START_OF_FILE 1 -#define MODE_SETTINGS 2 -#define MODE_DESCRIPTION 3 -#define MODE_ALIAS 4 -#define MODE_ACTIONS 5 - - int mode = MODE_START_OF_FILE; + static struct file_list *current_actions_file = NULL; FILE *fp; + struct url_actions *last_perm; struct url_actions *perm; char buf[BUFFER_SIZE]; struct file_list *fs; - struct action_spec * cur_action = NULL; - int cur_action_used = 0; +#define MODE_START_OF_FILE 1 +#define MODE_ACTIONS 2 +#define MODE_ALIAS 3 + int mode = MODE_START_OF_FILE; + struct action_spec cur_action[1]; struct action_alias * alias_list = NULL; - unsigned long linenum = 0; + + memset(cur_action, '\0', sizeof(*cur_action)); if (!check_file_changed(current_actions_file, csp->config->actions_file, &fs)) { @@ -969,7 +900,7 @@ int load_actions_file(struct client_state *csp) return 1; /* never get here */ } - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) + while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) { if (*buf == '{') { @@ -984,9 +915,9 @@ int load_actions_file(struct client_state *csp) { /* too short */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -998,87 +929,25 @@ int load_actions_file(struct client_state *csp) { /* too short */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): {{ }}", - csp->config->actions_file, linenum); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: {{ }}", + csp->config->actions_file); return 1; /* never get here */ } - /* - * An actionsfile can optionally contain the following blocks. - * They *MUST* be in this order, to simplify processing: - * - * {{settings}} - * name=value... - * - * {{description}} - * ...free text, format TBD, but no line may start with a '{'... - * - * {{alias}} - * name=actions... - * - * The actual actions must be *after* these special blocks. - * None of these special blocks may be repeated. - * - */ - if (0 == strcmpic(start, "settings")) - { - /* it's a {{settings}} block */ - if (mode >= MODE_SETTINGS) - { - /* {{settings}} must be first thing in file and must only - * appear once. - */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: {{settings}} must only appear once, and it must be before anything else.", - csp->config->actions_file, linenum); - } - mode = MODE_SETTINGS; - } - else if (0 == strcmpic(start, "description")) - { - /* it's a {{description}} block */ - if (mode >= MODE_DESCRIPTION) - { - /* {{description}} is a singleton and only {{settings}} may proceed it - */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: {{description}} must only appear once, and only a {{settings}} block may be above it.", - csp->config->actions_file, linenum); - } - mode = MODE_DESCRIPTION; - } - else if (0 == strcmpic(start, "alias")) + if (0 == strcmpic(start, "alias")) { /* it's an {{alias}} block */ - if (mode >= MODE_ALIAS) - { - /* {{alias}} must be first thing in file, possibly after - * {{settings}} and {{description}} - * - * {{alias}} must only appear once. - * - * Note that these are new restrictions introduced in - * v2.9.10 in order to make actionsfile editing simpler. - * (Otherwise, reordering actionsfile entries without - * completely rewriting the file becomes non-trivial) - */ - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: {{alias}} must only appear once, and it must be before all actions.", - csp->config->actions_file, linenum); - } + mode = MODE_ALIAS; } else { /* invalid {{something}} block */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): {{%s}}", - csp->config->actions_file, linenum, start); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: {{%s}}", + csp->config->actions_file, start); return 1; /* never get here */ } } @@ -1093,26 +962,7 @@ int load_actions_file(struct client_state *csp) mode = MODE_ACTIONS; /* free old action */ - if (cur_action) - { - if (!cur_action_used) - { - free_action(cur_action); - free(cur_action); - } - cur_action = NULL; - } - cur_action_used = 0; - cur_action = (struct action_spec *)zalloc(sizeof(*cur_action)); - if (cur_action == NULL) - { - fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': out of memory", - csp->config->actions_file); - return 1; /* never get here */ - } - init_action(cur_action); + free_action(cur_action); /* trim { */ strcpy(actions_buf, buf + 1); @@ -1121,11 +971,11 @@ int load_actions_file(struct client_state *csp) end = actions_buf + strlen(actions_buf) - 1; if (*end != '}') { - /* No closing } */ + /* too short */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } *end = '\0'; @@ -1133,48 +983,42 @@ int load_actions_file(struct client_state *csp) /* trim any whitespace immediately inside {} */ chomp(actions_buf); + if (*actions_buf == '\0') + { + /* too short */ + fclose(fp); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); + return 1; /* never get here */ + } + if (get_actions(actions_buf, alias_list, cur_action)) { /* error */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } } } - else if (mode == MODE_SETTINGS) - { - /* - * Part of the {{settings}} block. - * Ignore for now, but we may want to read & check permissions - * when we go multi-user. - */ - } - else if (mode == MODE_DESCRIPTION) - { - /* - * Part of the {{description}} block. - * Ignore for now. - */ - } else if (mode == MODE_ALIAS) { - /* - * define an alias - */ + /* define an alias */ char actions_buf[BUFFER_SIZE]; struct action_alias * new_alias; + int more = 1; char * start = strchr(buf, '='); char * end = start; if ((start == NULL) || (start == buf)) { - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid alias line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -1207,9 +1051,9 @@ int load_actions_file(struct client_state *csp) } if (*start == '\0') { - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid alias line: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -1221,12 +1065,12 @@ int load_actions_file(struct client_state *csp) { /* error */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': invalid alias line (%lu): %s = %s", - csp->config->actions_file, linenum, buf, start); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': invalid alias line: %s = %s", + csp->config->actions_file, buf, start); return 1; /* never get here */ } - + /* add to list */ new_alias->next = alias_list; alias_list = new_alias; @@ -1252,9 +1096,9 @@ int load_actions_file(struct client_state *csp) if (create_url_spec(perm->url, buf)) { fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': line %lu: cannot create URL pattern from: %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': cannot create URL pattern from: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } @@ -1266,16 +1110,16 @@ int load_actions_file(struct client_state *csp) { /* oops - please have a {} line as 1st line in file. */ fclose(fp); - log_error(LOG_LEVEL_FATAL, - "can't load actions file '%s': first needed line (%lu) is invalid: %s", - csp->config->actions_file, linenum, buf); + log_error(LOG_LEVEL_FATAL, + "can't load actions file '%s': first line is invalid: %s", + csp->config->actions_file, buf); return 1; /* never get here */ } else { /* How did we get here? This is impossible! */ fclose(fp); - log_error(LOG_LEVEL_FATAL, + log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': INTERNAL ERROR - mode = %d", csp->config->actions_file, mode); return 1; /* never get here */ @@ -1283,10 +1127,24 @@ int load_actions_file(struct client_state *csp) } fclose(fp); - + free_action(cur_action); - free_alias_list(alias_list); + while (alias_list != NULL) + { + struct action_alias * next = alias_list->next; + freez((char *)alias_list->name); + free_action(alias_list->action); + free(alias_list); + alias_list = next; + } + +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) + { + fs->proxy_args = strsav(fs->proxy_args, ""); + } +#endif /* ndef SPLIT_PROXY_ARGS */ /* the old one is now obsolete */ if (current_actions_file) @@ -1306,290 +1164,3 @@ int load_actions_file(struct client_state *csp) return(0); } - - -/********************************************************************* - * - * Function : actions_to_text - * - * Description : Converts a actionsfile entry from numeric form - * ("mask" and "add") to text. - * - * Parameters : - * 1 : mask = As from struct url_actions - * 2 : add = As from struct url_actions - * - * Returns : A string. Caller must free it. - * NULL on out-of-memory error. - * - *********************************************************************/ -char * actions_to_text(struct action_spec *action) -{ - unsigned mask = action->mask; - unsigned add = action->add; - char * result = strdup(""); - struct list_entry * lst; - - /* sanity - prevents "-feature +feature" */ - mask |= add; - - -#define DEFINE_ACTION_BOOL(__name, __bit) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, " -" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, " +" __name); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, " -" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, action->string[__index]); \ - string_append(&result, "}"); \ - } - -#define DEFINE_ACTION_MULTI(__name, __index) \ - if (action->multi_remove_all[__index]) \ - { \ - string_append(&result, " -" __name); \ - } \ - else \ - { \ - lst = action->multi_remove[__index]->first; \ - while (lst) \ - { \ - string_append(&result, " -" __name "{"); \ - string_append(&result, lst->str); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } \ - } \ - lst = action->multi_add[__index]->first; \ - while (lst) \ - { \ - string_append(&result, " +" __name "{"); \ - string_append(&result, lst->str); \ - string_append(&result, "}"); \ - lst = lst->next; \ - } - -#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */ - -#include "actionlist.h" - -#undef DEFINE_ACTION_MULTI -#undef DEFINE_ACTION_STRING -#undef DEFINE_ACTION_BOOL -#undef DEFINE_ACTION_ALIAS - - return result; -} - - -#ifdef FEATURE_CGI_EDIT_ACTIONS -/********************************************************************* - * - * Function : actions_to_html - * - * Description : Converts a actionsfile entry from numeric form - * ("mask" and "add") to a
-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
-" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, "\n
+" __name); \ - } - -#define DEFINE_ACTION_STRING(__name, __bit, __index) \ - if (!(mask & __bit)) \ - { \ - string_append(&result, "\n
-" __name); \ - } \ - else if (add & __bit) \ - { \ - string_append(&result, "\n
+" __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
-" __name); \ - } \ - else \ - { \ - lst = action->multi_remove[__index]->first; \ - while (lst) \ - { \ - string_append(&result, "\n
-" __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
+" __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
*/ - 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; -} diff --git a/actions.h b/actions.h index 04434e28..d71d8c34 100644 --- a/actions.h +++ b/actions.h @@ -1,6 +1,6 @@ -#ifndef ACTIONS_H_INCLUDED -#define ACTIONS_H_INCLUDED -#define ACTIONS_H_VERSION "$Id: actions.h,v 1.8 2002/03/24 13:25:43 swa Exp $" +#ifndef _ACTIONS_H +#define _ACTIONS_H +#define ACTIONS_H_VERSION "$Id: actions.h,v ??? $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/actions.h,v $ @@ -9,7 +9,7 @@ * Functions declared include: FIXME * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,46 +35,6 @@ * * 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. - * * *********************************************************************/ @@ -84,51 +44,23 @@ extern "C" { #endif -struct action_spec; -struct current_action_spec; -struct client_state; - - - -/* This structure is used to hold user-defined aliases */ -struct action_alias -{ - const char * name; - struct action_spec action[1]; - struct action_alias * next; -}; - - -extern jb_err get_actions (char *line, - struct action_alias * alias_list, - struct action_spec *cur_action); -extern void free_alias_list(struct action_alias *alias_list); - -extern void init_action(struct action_spec *dest); -extern void free_action(struct action_spec *src); -extern jb_err merge_actions (struct action_spec *dest, - const struct action_spec *src); -extern jb_err copy_action (struct action_spec *dest, +extern void merge_actions (struct action_spec *dest, const struct action_spec *src); +extern void copy_action (struct action_spec *dest, + const struct action_spec *src); +extern void free_action (struct action_spec *src); extern char * actions_to_text (struct action_spec *action); -#ifdef FEATURE_CGI_EDIT_ACTIONS -extern char * actions_to_html (struct action_spec *action); -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ extern void init_current_action (struct current_action_spec *dest); -extern void free_current_action (struct current_action_spec *src); -extern jb_err merge_current_action (struct current_action_spec *dest, +extern void merge_current_action (struct current_action_spec *dest, const struct action_spec *src); +extern void free_current_action (struct current_action_spec *src); extern char * current_action_to_text(struct current_action_spec *action); -extern jb_err get_action_token(char **line, char **name, char **value); +extern int get_action_token(char **line, char **name, char **value); extern void unload_actions_file(void *file_data); extern int load_actions_file(struct client_state *csp); -#ifdef FEATURE_GRACEFUL_TERMINATION -void unload_current_actions_file(void); -#endif - /* Revision control strings from this header and associated .c file */ extern const char actions_rcs[]; @@ -138,7 +70,7 @@ extern const char actions_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef ACTIONS_H_INCLUDED */ +#endif /* ndef _ERRLOG_H */ /* Local Variables: diff --git a/default.action b/actionsfile old mode 100644 new mode 100755 similarity index 75% rename from default.action rename to actionsfile index b2c85ef5..83b541dc --- a/default.action +++ b/actionsfile @@ -1,43 +1,10 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/basic.action,v $ -# -# $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $ +############################################################################# +# Sample actions file for the Internet Junkbuster 2.9.x # -# Purpose : Default actions file, see -# http://www.privoxy.org/faq/questions.html#CONFIGFILES +# For information, see http://ijbswa.sourceforge.net/ # -# Copyright : Written by and Copyright -# Privoxy team. http://www.privoxy.org/ +# $Id: actionsfile,v 1.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 ############################################################################# @@ -65,7 +32,7 @@ # is a domain-only pattern and will match any request to www.yahoo.com # # www.example.com/ -# means exactly the same (but is slightly less efficient) +# means exactly the same # # www.example.com/index.html # matches only the document /index.html on www.example.com @@ -125,16 +92,12 @@ # 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 @@ -175,22 +138,6 @@ # +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, @@ -212,23 +159,9 @@ # 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. @@ -267,50 +200,17 @@ # 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{} with 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{}" 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 @@ -364,130 +264,86 @@ # Useful aliases +no-cookies = +no-cookies-set +no-cookies-read -no-cookies = -no-cookies-set -no-cookies-read +fragile = -block -no-cookies -filter -fast-redirects -hide-referer -no-popups +shop = -no-cookies -filter -fast-redirects +imageblock = +block +image -# Fragile sites should have the minimum changes -fragile = -block -deanimate-gifs -fast-redirects -filter -hide-referer -no-cookies -no-popups - -# Shops should be allowed to set persistent cookies -shop = -filter -no-cookies -no-cookies-keep - -# Your favourite blend of filters: -# -myfilters = +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\ - +filter{webbugs} +filter{nimda} +filter{banners-by-size} - +#For people who don't like to type too much: ;-) +c0 = +no-cookies +c1 = -no-cookies +c2 = -no-cookies-set +no-cookies-read +c3 = +no-cookies-set -no-cookies-read #... etc. Customize to your heart's content. ############################################################################# # Defaults ############################################################################# {\ --add-header \ -block \ --deanimate-gifs \ --downgrade \ +fast-redirects \ -myfilters \ -+no-compression \ -+no-cookies-keep \ ++filter \ +hide-forwarded \ +hide-from{block} \ +hide-referer{forge} \ -hide-user-agent \ -image \ -+image-blocker{http://config.privoxy.org/send-banner} \ -+no-cookies-keep \ --no-cookies-read \ --no-cookies-set \ ++image-blocker{http://i.j.b/send-banner} \ ++no-cookies-read \ ++no-cookies-set \ +no-popups \ --vanilla-wafer \ --wafer \ ++vanilla-wafer \ } / # Match all URLs - ############################################################################# # A useful site for testing - shows all headers: # http://privacy.net/analyze/ ############################################################################# -{+add-header{X-Privacy: Yes please} \ +{+add-header{X-Privacy: Yes please} #-add-header{*} \ +add-header{X-User-Tracking: No thanks!} -filter} privacy.net - ############################################################################# -# Test for new GIF deanimation feature. -# Just try http://www.oesterhelt.org/deanimate-demo with and without it. +# Permissions list ############################################################################# -{+deanimate-gifs{last}} -www.oesterhelt.org/deanimate-demo - -############################################################################# # Sites that need cookies -# -# FIXME: Now cookies are allowed by default, do any of these sites -# need persistent cookies? -############################################################################# +{-no-cookies} +.javasoft.com +.sun.com +.yahoo.com +.msdn.microsoft.com -#{-no-cookies} -#.javasoft.com -#.sun.com -#.yahoo.com -#.msdn.microsoft.com -#.sourceforge.net -#.sf.net -#www.nexgo.de -#.myrealbox.com -#mail.uni.de -#e-tools.freenet.de -#office.freenet.de +# Alternative way of saying the same thing +{-no-cookies-set -no-cookies-read} +.sourceforge.net +.sf.net -############################################################################# # These sites are very complex and require # minimal interference. -############################################################################# {fragile} .office.microsoft.com .windowsupdate.microsoft.com -.deutsche-bank-24.de -############################################################################# # Shopping sites - still want to block ads. -############################################################################# {shop} .quietpc.com .worldpay.com # for quietpc.com .jungle.com .scan.co.uk -############################################################################# # These shops require pop-ups -############################################################################# {shop -no-popups} .dabs.com .overclockers.co.uk -############################################################################# -# Sometimes fast-redirects catches things by mistake -############################################################################# {-fast-redirects} www.ukc.ac.uk/cgi-bin/wac\.cgi\? login.yahoo.com -edit.europe.yahoo.com -.google.com -.altavista.com/.*(like|url|link):http -.altavista.com/trans.*urltext=http -.speedfind.de -.nytimes.com -############################################################################# # Please don't re_filter code! -############################################################################# {-filter} -.sourceforge.net - +.cvs.sourceforge.net ############################################################################# # Imagelist: @@ -517,18 +373,13 @@ www.carbuyer.com/cgi-carbuyer/getimage.cgi *.fxweb.com/v2-trackrun\.cgi 195.63.104.61 195.63.104.222 -213.165.64.3[4-9] -213.165.64.4[0-4] +213.165.64.3[89] +213.165.64.4[1-4] 194.221.183.22[1-7] -a196.g.akamai.net/7/196/2670/000[1-3]/images\.gmx\.net/.*images/.*/.*/ -/cgi-bin/ivw/CP/ +a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/ +/cgi-bin/ivw/CP/CGI 151.189.8.213/Adimg 151.189.8.193/Media -.smartclicks.com/.*/smart(img|banner|host|bar|site) -.linkexchange.com/.*/showl(ogo|e) -MoneyBanner.de -pixel.intares.net/cgi-bin/janus -ar.atwola.com # This serves all ads for CNN and AOL ############################################################################# # Blocklist: @@ -544,48 +395,49 @@ ar.atwola.com # This serves all ads for CNN and AOL ###/*.*/(sponsor|banner)s?[0-9]?/ ###/*.*/.*banner([-_]?[a-z0-9]+)?\.(gif|jpg) -/?.*/_?(plain|live)?ads?(-banners)?/ -/?.*/abanners/ -/?.*/ad(sdna_image|gifs?)/ -/?.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe) -/?.*/adbanners/ -/?.*/ad_banner/ -/?.*/adserver -/?.*/adstream\.cgi -/?.*/adv((er)?ts?|ertis(ing|ements?))?/ -/?.*/anzei(gen)?/? -/?.*/ban[-_]cgi/ -/?.*/banner_?ads/ -/?.*/banner_?anzeigen -/?.*/bannerimage/ -/?.*/banners?/ -/?.*/banners?\.cgi/ -/?.*/cgi-bin/centralad/getimage -/?.*/images/addver\.gif -/?.*/images/advert\.gif -/?.*/images/marketing/.*\.(gif|jpe?g) -/?.*/place-ads -/?.*/popupads/ -/?.*/promobar.* -/?.*/publicite/ -/?.*/randomads/.*\.(gif|jpe?g) -/?.*/rekla(ma|me|am)/.*\.(gif|jpe?g) -/?.*/siteads/ -/?.*/sponsor.*\.gif -/?.*/sponsors?[0-9]?/ -/?.*/ucbandeimg/ -/?.*/werb\..* -/?.*/werbebanner/ -/?.*/werbung/.*\.(gif|jpe?g) -/?.*/adv\. # www.telegraaf.nl -/?.*/advert[0-9]+\.jpg -/?.*bann\.gif -/?.*/ads/ +/.*/_?(plain|live)?ads?(-banners)?/ +/.*/abanners/ +/.*/ad(sdna_image|gifs?)/ +/.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe) +/.*/adbanners/ +/.*/adserver +/.*/adstream\.cgi +/.*/adv((er)?ts?|ertis(ing|ements?))?/ +/.*/anzei(gen)?/? +/.*/ban[-_]cgi/ +/.*/banner_?ads/ +/.*/banner_?anzeigen +/.*/bannerimage/ +/.*/banners?/ +/.*/banners?\.cgi/ +/.*/cgi-bin/centralad/getimage +/.*/images/addver\.gif +/.*/images/advert\.gif +/.*/images/marketing/.*\.(gif|jpe?g) +/.*/place-ads +/.*/popupads/ +/.*/promobar.* +/.*/publicite/ +/.*/randomads/.*\.(gif|jpe?g) +/.*/reklama/.*\.(gif|jpe?g) +/.*/reklame/.*\.(gif|jpe?g) +/.*/reklaam/.*\.(gif|jpe?g) +/.*/siteads/ +/.*/sponsor.*\.gif +/.*/sponsors?[0-9]?/ +/.*/ucbandeimg/ +/.*/werb\..* +/.*/werbebanner/ +/.*/werbung/.*\.(gif|jpe?g) +/.*/adv\. # www.telegraaf.nl +/.*/advert[0-9]+\.jpg +/.*bann\.gif /Media/Images/Adds/ /_banner/ /ad_images/ /adgenius/ /adimages/ +/.*/ads/ /viewad/ /adserve/ /adverts/ @@ -624,24 +476,24 @@ ar.atwola.com # This serves all ads for CNN and AOL /worldnet/ad\.cgi /zhp/auktion/img/ /cgi-bin/nph-adclick.exe/ -/?.*/Image/BannerAdvertising/ -/?.*/ad-bin/ -/?.*/adlib/server\.cgi -/?.*/gsa_bs/gsa_bs.cmdl +/.*/Image/BannerAdvertising/ +/.*/ad-bin/ +/.*/adlib/server\.cgi +/.*/gsa_bs/gsa_bs.cmdl /autoads/ /anz/pics/ # for our finnish friends, by Kai Puolamaki -/?.*/mainos/*.*/.*\.gif -/?.*/mainos/*.*/.*\.jpe?g +/.*/mainos/*.*/.*\.gif +/.*/mainos/*.*/.*\.jpe?g # more from a finnish friend Petri Haapio 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 194.251.243.50/cgi-bin/banner @@ -652,21 +504,21 @@ www.iltalehti.fi/ilmkuvat www.mtv3.fi/mainoskuvat # -/?.*/adfinity -/?.*/[?]adserv -/?.*/bizgrphx/ -/?.*/smallad2\.gif -/?.*/ana2ad\.gif -/?.*/adimg/ -/?.*/.*counter\.pl -/?.*/spin_html/ -/?.*/images/topics/topicgimp\.gif +/.*/adfinity +/.*/[?]adserv +/.*/bizgrphx/ +/.*/smallad2\.gif +/.*/ana2ad\.gif +/.*/adimg/ +/.*/.*counter\.pl +/.*/spin_html/ +/.*/images/topics/topicgimp\.gif .discovery.com/.*banner_id -/?.*/.*bannr\.gif +/.*/.*bannr\.gif .cruel.com/images/ .idrink.com/frm_bottom.htm -/?.*/.*pb_ihtml\.gif -/?.*/ph-ad.*\.focalink\.com +/.*/.*pb_ihtml\.gif +/.*/ph-ad.*\.focalink\.com /cgi-bin/adjuggler /we_ba/ # hausfrauenseite.de *bwhahahaaaaa* @@ -699,38 +551,38 @@ www.mtv3.fi/mainoskuvat /.*s_msn\.gif /.*addchannel\.gif /.*adddesktop\.gif -/?.*/ns4\.gif -/?.*/v3sban\.gif -/?.*/?FPCreated\.gif -/?.*/opera35\.gif -/?.*/opera13\.gif -/?.*/opera_b\.gif -/?.*/ie_horiz\.gif -/?.*/ie_logo\.gif +/.*/ns4\.gif +/.*/v3sban\.gif +/.*/?FPCreated\.gif +/.*/opera35\.gif +/.*/opera13\.gif +/.*/opera_b\.gif +/.*/ie_horiz\.gif +/.*/ie_logo\.gif # ... and even more! -/?.*/favicon\.ico +/.*/favicon\.ico # generally useless information and promo stuff (commented out) #/.*/(counter|getpcbutton|BuiltByNOF|netscape|hotmail|vcr(rated)?|rsaci(rated)?|freeloader|cache_now(_anim)?|apache_pb|now_(anim_)?button|ie_?(buttonlogo|static?|.*ani.*)?)\.(gif|jpe?g) -/?.*/images/na/us/brand/ -/?.*/advantage\.(gif|jpg) -/?.*/advanbar\.(gif|jpg) -/?.*/advanbtn\.(gif|jpg) -/?.*/biznetsmall\.(gif|jpg) -/?.*/utopiad\.(gif|jpg) -/?.*/epipo\.(gif|jpg) -/?.*/amazon([a-zA-Z0-9]+)\.(gif|jpg) -/?.*/bnlogo.(gif|jpg) -/?.*/buynow([a-zA-Z0-9]+)\.(gif|jpg) +/.*/images/na/us/brand/ +/.*/advantage\.(gif|jpg) +/.*/advanbar\.(gif|jpg) +/.*/advanbtn\.(gif|jpg) +/.*/biznetsmall\.(gif|jpg) +/.*/utopiad\.(gif|jpg) +/.*/epipo\.(gif|jpg) +/.*/amazon([a-zA-Z0-9]+)\.(gif|jpg) +/.*/bnlogo.(gif|jpg) +/.*/buynow([a-zA-Z0-9]+)\.(gif|jpg) /p/d/publicid # for the dutch folks by a dutch friend gertjan@west.nl -/?.*/Advertenties/ -/?.*/Adverteerders/ +/.*/Advertenties/ +/.*/Adverteerders/ .netdirect.nl/nd_servlet/___ # -------------------------------------------------------------------------- @@ -1039,8 +891,8 @@ www.forbes.com/tool/images/frontend/ www.zserver.com www.spinbox.com .pathfinder.com/shopping/marketplace/images/ -/?.*/adbanner* -/?.*/adgraphic* +/.*/adbanner* +/.*/adgraphic* static.wired.com/images .perso.estat.com/cgi-bin/perso/ #dinoadserver1.roka.net @@ -1086,11 +938,11 @@ home.talkcity.com/homepopup.html.* # Banners from Freeserve #banner.freeservers.com/cgi-bin/fs_adbar # fixed by above regexp # And those nasty va-popups ! -/?.*/?va_banner.html +/.*/?va_banner.html # And an all-around hit against advert*.jpg -/?.*/advert[0-9]+\.jpg +/.*/advert[0-9]+\.jpg # And yet another Internet Explorer gif ... -/?.*/ie_horiz\.gif +/.*/ie_horiz\.gif # Some uninteresting buttons I think... .mircx.com/images/buttons/ services.mircx.com/.*\.gif @@ -1309,10 +1161,6 @@ www.linux-magazin.de/banner # The Register ads - oh, and all images in Register stories (sigh). www.theregister.co.uk/media/ -# Used on http://www.theregister.co.uk/ -# Sample advert URL: -# http://secure.webconnect.net/cgi-bin/webconnecthome.dll?F467 -.webconnect.net # Dilbert: www.dilbert.com/comics/dilbert/images/.*_140x800.*\.gif @@ -1326,11 +1174,11 @@ www.stattrack.com/stats/ #Now they're Yahoo GeoCities, their junk is in a different place. ##geo.yahoo.com/serv ##visit.geocities.com/visit.gif -.yimg.com/?.*/www.geocities.com/js_source +.yimg.com/.*/www.geocities.com/js_source #http://us.toto.geo.yahoo.com/toto?s=76001086 .geo.yahoo.com .visit.geocities.com -.yimg.com/?.*/www.geocities.com/ +.yimg.com/.*/www.geocities.com/ #http://counter16.bravenet.com/counter.php counter*. @@ -1366,7 +1214,7 @@ logout.gmx.net logout.tvspielfilm.de gmx.tvspielfilm.de www.freenet.de/customerindex\.html -/?.*/phpAds +/.*/phpAds .fxweb.com/v2-trackrun\.cgi rtldating.peopleunited.de .advertising.com @@ -1378,21 +1226,19 @@ fourohfour.nbci.com/Members404Error.php3 .adlink.de www.fair-ist-mehr.de/cgi-bin/bt.pl .linkexchange. -/?.*/adpage.asp +/.*/adpage.asp /ADS .net-on.net rstrip.namezero.com 62.26.220.2 .doubleclick.net -.adserver.yahoo.com ############################################################################# {-block} ############################################################################# -include.ebay.com + cpan.valueclick.com www.userfriendly.org/images/banners/banner_dp_heart\.gif -advogato.org #Why were these in the Waldherr blockfile? #www.hitbox.com @@ -1497,8 +1343,10 @@ www.iez-auktion.de # Jon's addition: MSDN + .msdn.microsoft.com + #js .adbusters.com .freemail*.web.de/online/ordner/anzeigen @@ -1506,8 +1354,4 @@ foggy.sda.t-online.de .us.i1.yimg.com/us.yimg.com/i/pim/ad2.gif www.nexgo.de/.*/bg_banner.jpg -# .*ads. matches prdownloads.sourceforge.net and many other download sites -# The fix is: -.*downloads. - # End of file diff --git a/advanced.action b/advanced.action deleted file mode 100644 index 02855034..00000000 --- a/advanced.action +++ /dev/null @@ -1,90 +0,0 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/advanced.action,v $ -# -# $Id: advanced.action,v 1.3 2002/03/26 22:29:54 swa Exp $ -# -# Purpose : Most agressive actions file, see -# http://www.privoxy.org/faq/questions.html#CONFIGFILES -# -# 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. -# -###################################################################### - -###################################################################### -# Aliases -###################################################################### - -###################################################################### -# Defaults -###################################################################### - -###################################################################### -# Specials -###################################################################### - -###################################################################### -# Imagelist: -###################################################################### - -###################################################################### -# Blocklist: -###################################################################### - -###################################################################### -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -###################################################################### diff --git a/amiga.c b/amiga.c index 493a00eb..789fd085 100644 --- a/amiga.c +++ b/amiga.c @@ -1,4 +1,4 @@ -const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; +const char amiga_rcs[] = "$Id: amiga.c,v 1.1.1.1 2001/05/15 13:58:46 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/amiga.c,v $ @@ -6,7 +6,7 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; * Purpose : Amiga-specific declarations. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General @@ -28,48 +28,6 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; * * Revisions : * $Log: amiga.c,v $ - * Revision 1.8 2002/03/25 19:32:15 joergs - * Name in version string changed from junkbuster to Privoxy. - * - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.5 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.4 2001/10/07 15:35:13 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Revision 1.3 2001/09/12 22:54:51 joergs - * Stacksize of main thread increased. - * - * Revision 1.2 2001/05/23 00:13:58 joergs - * AmigaOS support fixed. - * * Revision 1.1.1.1 2001/05/15 13:58:46 oes * Initial import of version 2.9.3 source tree * @@ -88,8 +46,8 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $"; const char amiga_h_rcs[] = AMIGA_H_VERSION; -unsigned long __stack = 100*1024; -static char ver[] = "$VER: Privoxy " __AMIGAVERSION__ " (" __AMIGADATE__ ")"; +unsigned long __stack = 20*1024; +static char ver[] = "$VER: junkbuster " __AMIGAVERSION__ " (" __AMIGADATE__ ")"; struct Task *main_task = NULL; int childs = 0; @@ -109,32 +67,29 @@ __saveds ULONG server_thread(void) { SetErrnoPtr(&(UserData.eno),sizeof(int)); local_csp->cfd=ObtainSocket(local_csp->cfd, AF_INET, SOCK_STREAM, 0); - if(JB_INVALID_SOCKET!=local_csp->cfd) + if(-1!=local_csp->cfd) { Signal(main_task,SIGF_SINGLE); serve((struct client_state *) local_csp); } else { - local_csp->flags &= ~CSP_FLAG_ACTIVE; + local_csp->active = 0; Signal(main_task,SIGF_SINGLE); } CloseLibrary(SocketBase); } else { - local_csp->flags &= ~CSP_FLAG_ACTIVE; + local_csp->active = 0; Signal(main_task,SIGF_SINGLE); } childs--; return 0; } -static BPTR olddir; - void amiga_exit(void) { if(SocketBase) { CloseLibrary(SocketBase); } - CurrentDir(olddir); } static struct SignalSemaphore memsem; @@ -162,13 +117,12 @@ void InitAmiga(void) InitSemaphore(&memsem); memsemptr = &memsem; - olddir=CurrentDir(GetProgramDir()); atexit(amiga_exit); } #ifdef __GNUC__ #ifdef libnix -/* multithreadingsafe libnix replacements */ +/* multitaskingsafe libnix replacements */ static void *memPool=NULL; void *malloc (size_t s) @@ -277,7 +231,7 @@ ADD2EXIT(__memCleanUp,-50); #error No libnix and no ixemul!? #endif /* libnix */ #else -#error Only GCC is supported, multithreading safe malloc/free required. +#error Only GCC is supported, multitasking safe malloc/free required. #endif /* __GNUC__ */ #endif /* def AMIGA */ diff --git a/amiga.h b/amiga.h index 580dc32d..53933048 100644 --- a/amiga.h +++ b/amiga.h @@ -1,7 +1,7 @@ #ifdef AMIGA -#ifndef AMIGA_H_INCLUDED -#define AMIGA_H_INCLUDED -#define AMIGA_H_VERSION "$Id: amiga.h,v 1.8 2002/03/24 13:25:43 swa Exp $" +#ifndef _AMIGA_H +#define _AMIGA_H +#define AMIGA_H_VERSION "$Id: amiga.h,v 1.3 2001/05/25 21:53:27 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/amiga.h,v $ @@ -9,7 +9,7 @@ * Purpose : Amiga-specific declarations. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General @@ -31,23 +31,6 @@ * * Revisions : * $Log: amiga.h,v $ - * Revision 1.8 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.7 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.6 2001/10/13 12:46:08 joergs - * Added #undef EINTR to avoid warnings - * - * Revision 1.5 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.4 2001/05/29 20:05:06 joergs - * Fixed exit() macro not exiting if called before InitAmiga() - * (junkbuster --help and --version). - * * Revision 1.3 2001/05/25 21:53:27 jongfoster * Fixing indentation * @@ -70,7 +53,6 @@ #undef __NOLIBBASE__ #define __CONSTLIBBASEDECL__ const -#define DEVICES_TIMER_H #include #include #include @@ -116,8 +98,7 @@ __saveds ULONG server_thread(void); } \ } -#undef EINTR #define EINTR 0 -#endif /* ndef AMIGA_H_INCLUDED */ +#endif /* ndef _AMIGA_H */ #endif /* def AMIGA */ diff --git a/basic.action b/basic.action deleted file mode 100644 index 567f6b93..00000000 --- a/basic.action +++ /dev/null @@ -1,377 +0,0 @@ -###################################################################### -# -# File : $Source: /cvsroot/ijbswa/current/basic.action,v $ -# -# $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $ -# -# Purpose : Very basic actions file, see -# http://www.privoxy.org/faq/questions.html#CONFIGFILES -# -# 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. -# -###################################################################### - -###################################################################### -# Aliases -###################################################################### -{{alias}} -+imageblock = +block +image - -###################################################################### -# Defaults -###################################################################### -{\ -+deanimate-gifs{last} \ -+image-blocker{trans} \ -+hide-referer{forge} \ -+no-cookies-keep \ --filter \ -} -/ # Match all URLs - - -###################################################################### -# Specials -###################################################################### -{+image} -############################################################################# -/.*\.gif -/.*\.jpe?g -/.*\.png - -############################################################################# -{+imageblock} -############################################################################# -.ad.doubleclick.net -.adforce.imgis.com -.focalink.com - -###################################################################### -# Blocklist: -###################################################################### -{+block} -############################################################################# - -# generic hosts (probably most effective) -ad*. -.*ads. -banner. - -/.*/(.*[-_.])?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?))?/ -/?.*/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/ -/_banner/ -/ad_images/ -/adgenius/ -/adimages/ -/viewad/ -/adserve/ -/adverts/ -/annonser?/ -/bando/ -/bannerad/ -/bannerfarm/ -/bin/getimage.cgi/...\?AD -/bin/nph-oma.count/ct/default.shtml -/bin/nph-oma.count/ix/default.html -/cgi-bin/getimage.cgi/....\?GROUP= -/cgi-bin/nph-load -/cgi-bin/webad.dll/ad -/cwmail/acc\.gif -/cwmail/amzn-bm1\.gif -/db_area/banrgifs/ -/gif/teasere/ -/grafikk/annonse/ -/graphics/defaultAd/ -/grf/annonif -/htmlad/ -/image\.ng/AdType -/image\.ng/transactionID -/images/.*/.*_anim\.gif # alvin brattli -/ip_img/.*\.(gif|jpe?g) -/marketpl*/ -/minibanners/ -/netscapeworld/nw-ad/ -/promotions/houseads/ -/rotads/ -/rotateads/ -/rotations/ -/torget/jobline/.*\.gif -/viewad/ -/werbung/ -/worldnet/ad\.cgi -/zhp/auktion/img/ -/cgi-bin/nph-adclick.exe/ -/?.*/Image/BannerAdvertising/ -/?.*/ad-bin/ -/?.*/adlib/server\.cgi -/?.*/gsa_bs/gsa_bs.cmdl -/autoads/ -/anz/pics/ -# for our finnish friends, by Kai Puolamaki -/?.*/mainos/*.*/.*\.gif -/?.*/mainos/*.*/.*\.jpe?g -# more from a finnish friend Petri Haapio -/?.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png)) -/?.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png)) -# -/?.*/adfinity -/?.*/[?]adserv -/?.*/bizgrphx/ -/?.*/smallad2\.gif -/?.*/ana2ad\.gif -/?.*/adimg/ -/?.*/.*counter\.pl -/?.*/spin_html/ -/?.*/images/topics/topicgimp\.gif -.discovery.com/.*banner_id -/?.*/.*bannr\.gif -.cruel.com/images/ -.idrink.com/frm_bottom.htm -/?.*/.*pb_ihtml\.gif -/?.*/ph-ad.*\.focalink\.com -/cgi-bin/adjuggler - -# ms sucks ! -/.*(ms)?backoff(ice)?.*\.(gif|jpe?g) -/.*(/ie4|/ie3|msie|sqlbans|powrbybo|activex|backoffice|explorer|netnow|getpoint|ntbutton|hmlink).*\.(gif|jpe?g) -/.*activex.*(gif|jpe?g) -/.*explorer?.(gif|jpe?g) -/.*freeie\.(gif|jpe?g) -/.*/ie_?(buttonlogo|static?|anim.*)?\.(gif|jpe?g) -/.*ie_sm\.(gif|jpe?g) -/.*msie(30)?\.(gif|jpe?g) -/.*msnlogo\.(gif|jpe?g) -/.*office97_ad1\.(gif|jpe?g) -/.*pbbobansm\.(gif|jpe?g) -/.*powrbybo\.(gif|jpe?g) -/.*sqlbans\.(gif|jpe?g) -/.*exc_ms\.gif -/.*ie4get_animated\.gif -/.*ie4_animated\.gif -/.*n_iemap\.gif -/.*ieget\.gif -/.*logo_msnhm_* -/.*mcsp2\.gif -/.*msn2\.gif -/.*add_active\.gif -/.*n_msnmap\.gif -/.*Ad00\.gif -/.*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 -# ... and even more! -/?.*/favicon\.ico - -/?.*/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) - -# for the dutch folks by a dutch friend gertjan@west.nl -/?.*/Advertenties/ -/?.*/Adverteerders/ -.netdirect.nl/nd_servlet/___ - -.admaximize.com -.imgis.com - -# wayne@staff.msen.com -a*.*.*.yimg.com/([0-9]*|\/)*us.yimg.com/* - -#################################################### -# Jon's addition: -# -# 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 - -# stattrack.com -# Uses URL: http://www.stattrack.com/cgi-bin/stats/image.cgi -/cgi-bin/stats/ -# And loads JavaScript from http://www.stattrack.com/stats/code -www.stattrack.com/stats/ - -#Now they're Yahoo GeoCities, their junk is in a different place. -##geo.yahoo.com/serv -##visit.geocities.com/visit.gif -.yimg.com/?.*/www.geocities.com/js_source -#http://us.toto.geo.yahoo.com/toto?s=76001086 -.geo.yahoo.com -.visit.geocities.com -.yimg.com/?.*/www.geocities.com/ - -.exitexchange.com - -#SourceForge ads. -sfads.osdn.com - -#This site traps the browser -.webhideout.com - -#privacy.net runs ads -.a.consumer.net - -#Lindsay.Marshall@newcastle.ac.uk suggested these, to kill Opera adverts: -www.qksrv.net -mirror.qkimg.net - -#js -dinoadserver*.roka.net -logout.gmx.net -logout.tvspielfilm.de -gmx.tvspielfilm.de -www.freenet.de/customerindex\.html -/?.*/phpAds -.fxweb.com/v2-trackrun\.cgi -rtldating.peopleunited.de -.advertising.com -www.zdnet.com/fcgi-bin/ -service.bfast.com/bfast/serve -199.172.144.25 -fourohfour.nbci.com/Members404Error.php3 -.adtech.de -.adlink.de -www.fair-ist-mehr.de/cgi-bin/bt.pl -.linkexchange. -/?.*/adpage.asp -/ADS -.net-on.net -rstrip.namezero.com -62.26.220.2 -.doubleclick.net -.adserver.yahoo.com - -############################################################################# -{-block} -############################################################################# -.admin. -.edu -.ac.uk # English Universities too! - Jon -.uni-*.de # What about Germany? --oes -# my banking stuff => no ads. -.comdirekt.de -.comdirect.de -.teledata.de -# Jon's addition: MSDN -.msdn.microsoft.com -# .*ads. matches prdownloads.sourceforge.net and many other download sites -# The fix is: -.*downloads. - -###################################################################### -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -###################################################################### diff --git a/cgi.c b/cgi.c index a5694414..55935c28 100644 --- a/cgi.c +++ b/cgi.c @@ -1,18 +1,16 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.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 @@ -38,218 +36,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $"; * * Revisions : * $Log: cgi.c,v $ - * Revision 1.56 2002/03/24 17:50:46 jongfoster - * Fixing compile error if actions file editor disabled - * - * Revision 1.55 2002/03/24 16:55:06 oes - * Making GIF checkerboard transparent - * - * Revision 1.54 2002/03/24 16:18:15 jongfoster - * Removing old logo - * - * Revision 1.53 2002/03/24 16:06:00 oes - * Correct transparency for checkerboard PNG. Thanks, Magnus! - * - * Revision 1.52 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.51 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.50 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.49 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.48 2002/03/08 17:47:07 jongfoster - * Adding comments - * - * Revision 1.47 2002/03/08 16:41:33 oes - * Added GIF images again - * - * Revision 1.46 2002/03/07 03:48:38 oes - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - Added a 4x4 pattern PNG which is less intrusive - * than the logo but also clearly marks the deleted banners - * - * Revision 1.45 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.44 2002/03/05 22:43:45 david__schmidt - * - Better error reporting on OS/2 - * - Fix double-slash comment (oops) - * - * Revision 1.43 2002/03/05 21:33:45 david__schmidt - * - Re-enable OS/2 building after new parms were added - * - Fix false out of memory report when resolving CGI templates when no IP - * address is available of failed attempt (a la no such domain) - * - * Revision 1.42 2002/01/21 00:33:20 jongfoster - * Replacing strsav() with the safer string_append() or string_join(). - * Adding map_block_keep() to save a few bytes in the edit-actions-list HTML. - * Adding missing html_encode() to error message generators. - * Adding edit-actions-section-swap and many "shortcuts" to the list of CGIs. - * - * Revision 1.41 2002/01/17 20:56:22 jongfoster - * Replacing hard references to the URL of the config interface - * with #defines from project.h - * - * Revision 1.40 2002/01/09 14:26:46 oes - * Added support for thread-safe gmtime_r call. - * - * Revision 1.39 2001/11/16 00:48:13 jongfoster - * Fixing a compiler warning - * - * Revision 1.38 2001/11/13 00:31:21 jongfoster - * - Adding new CGIs for use by non-JavaScript browsers: - * edit-actions-url-form - * edit-actions-add-url-form - * edit-actions-remove-url-form - * - Fixing make_menu()'s HTML generation - it now quotes the href parameter. - * - Fixing || bug. - * - * Revision 1.37 2001/11/01 14:28:47 david__schmidt - * Show enablement/disablement status in almost all templates. - * There is a little trickiness here: apparent recursive resolution of - * @if-enabled-then@ caused the toggle template to show status out-of-phase with - * the actual enablement status. So a similar construct, - * @if-enabled-display-then@, is used to resolve the status display on non-'toggle' - * templates. - * - * Revision 1.36 2001/10/26 17:33:27 oes - * marginal bugfix - * - * Revision 1.35 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.34 2001/10/18 22:22:09 david__schmidt - * Only show "Local support" on templates conditionally: - * - if either 'admin-address' or 'proxy-info-url' are uncommented in config - * - if not, no Local support section appears - * - * Revision 1.33 2001/10/14 22:28:41 jongfoster - * Fixing stupid typo. - * - * Revision 1.32 2001/10/14 22:20:18 jongfoster - * - Changes to CGI dispatching method to match CGI names exactly, - * rather than doing a prefix match. - * - No longer need to count the length of the CGI handler names by hand. - * - Adding new handler for 404 error when disptching a CGI, if none of - * the handlers match. - * - Adding new handlers for CGI actionsfile editor. - * - * Revision 1.31 2001/10/10 10:56:39 oes - * Failiure to load template now fatal. Before, the user got a hard-to-understand assertion failure from cgi.c - * - * Revision 1.30 2001/10/02 15:30:57 oes - * Introduced show-request cgi - * - * Revision 1.29 2001/09/20 15:47:44 steudten - * - * Fix BUG: Modify int size to size_t size in fill_template() - * - removes big trouble on machines where sizeof(int) != sizeof(size_t). - * - * Revision 1.28 2001/09/19 18:00:37 oes - * - Deletef time() FIXME (Can't fail under Linux either, if - * the argument is guaranteed to be in out address space, - * which it is.) - * - Fixed comments - * - Pointer notation cosmetics - * - Fixed a minor bug in template_fill(): Failiure of - * pcrs_execute() now secure. - * - * Revision 1.27 2001/09/16 17:08:54 jongfoster - * Moving simple CGI functions from cgi.c to new file cgisimple.c - * - * Revision 1.26 2001/09/16 15:47:37 jongfoster - * First version of CGI-based edit interface. This is very much a - * work-in-progress, and you can't actually use it to edit anything - * yet. You must #define FEATURE_CGI_EDIT_ACTIONS for these changes - * to have any effect. - * - * Revision 1.25 2001/09/16 15:02:35 jongfoster - * Adding i.j.b/robots.txt. - * Inlining add_stats() since it's only ever called from one place. - * - * Revision 1.24 2001/09/16 11:38:01 jongfoster - * Splitting fill_template() into 2 functions: - * template_load() loads the file - * template_fill() performs the PCRS regexps. - * This is because the CGI edit interface has a "table row" - * template which is used many times in the page - this - * change means it's only loaded from disk once. - * - * Revision 1.23 2001/09/16 11:16:05 jongfoster - * Better error handling in dispatch_cgi() and parse_cgi_parameters() - * - * Revision 1.22 2001/09/16 11:00:10 jongfoster - * New function alloc_http_response, for symmetry with free_http_response - * - * Revision 1.21 2001/09/13 23:53:03 jongfoster - * Support for both static and dynamically generated CGI pages. - * Correctly setting Last-Modified: and Expires: HTTP headers. - * - * Revision 1.20 2001/09/13 23:40:36 jongfoster - * (Cosmetic only) Indentation correction - * - * Revision 1.19 2001/09/13 23:31:25 jongfoster - * Moving image data to cgi.c rather than cgi.h. - * - * Revision 1.18 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.17 2001/08/05 15:57:38 oes - * Adapted finish_http_response to new list_to_text - * - * Revision 1.16 2001/08/01 21:33:18 jongfoster - * Changes to fill_template() that reduce memory usage without having - * an impact on performance. I also renamed some variables so as not - * to clash with the C++ keywords "new" and "template". - * - * Revision 1.15 2001/08/01 21:19:22 jongfoster - * Moving file version information to a separate CGI page. - * - * Revision 1.14 2001/08/01 00:19:03 jongfoster - * New function: map_conditional() for an if-then-else syntax. - * Changing to use new version of show_defines() - * - * Revision 1.13 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.12 2001/07/29 18:47:05 jongfoster - * Adding missing #include "loadcfg.h" - * - * Revision 1.11 2001/07/18 17:24:37 oes - * Changed to conform to new pcrs interface - * - * Revision 1.10 2001/07/13 13:53:13 oes - * Removed all #ifdef PCRS and related code - * - * 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 @@ -332,7 +118,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $"; #include #include #include -#include #ifdef _WIN32 #define snprintf _snprintf @@ -341,198 +126,45 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $"; #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, - "Shut down - Do not deploy this build in a production environment, this is a one click Denial Of Service attack!!!" }, -#endif +const struct cgi_dispatcher cgi_dispatcher[] = { { "show-status", - cgi_show_status, - "Show information about the current configuration" }, - { "show-version", - cgi_show_version, - "Show the source code version numbers" }, - { "show-request", - cgi_show_request, - "Show the client's request headers." }, + 11, cgi_show_status, + "Show information about the version and configuration" }, { "show-url-info", - cgi_show_url_info, + 13, cgi_show_url_info, "Show which actions apply to a URL and why" }, -#ifdef FEATURE_CGI_EDIT_ACTIONS - { "toggle", - cgi_toggle, - "Toggle Privoxy on or off" }, - { "edit-actions", - cgi_edit_actions, - "Edit the actions list" }, - - - { "eaa", /* Shortcut for edit-actions-add-url-form */ - cgi_edit_actions_add_url_form, - NULL }, - { "eau", /* Shortcut for edit-actions-url-form */ - cgi_edit_actions_url_form, - NULL }, - { "ear", /* Shortcut for edit-actions-remove-url-form */ - cgi_edit_actions_remove_url_form, - NULL }, - { "eas", /* Shortcut for edit-actions-for-url */ - cgi_edit_actions_for_url, - NULL }, - { "easa", /* Shortcut for edit-actions-section-add */ - cgi_edit_actions_section_add, - NULL }, - { "easr", /* Shortcut for edit-actions-section-remove */ - cgi_edit_actions_section_remove, - NULL }, - { "eass", /* Shortcut for edit-actions-section-swap */ - cgi_edit_actions_section_swap, - NULL }, - { "edit-actions-for-url", - cgi_edit_actions_for_url, - NULL /* Edit the actions for (a) specified URL(s) */ }, - { "edit-actions-list", - cgi_edit_actions_list, - NULL /* Edit the actions list */ }, - { "edit-actions-submit", - cgi_edit_actions_submit, - NULL /* Change the actions for (a) specified URL(s) */ }, - { "edit-actions-url", - cgi_edit_actions_url, - NULL /* Change a URL pattern in the actionsfile */ }, - { "edit-actions-url-form", - cgi_edit_actions_url_form, - NULL /* Form to change a URL pattern in the actionsfile */ }, - { "edit-actions-add-url", - cgi_edit_actions_add_url, - NULL /* Add a URL pattern to the actionsfile */ }, - { "edit-actions-add-url-form", - cgi_edit_actions_add_url_form, - NULL /* Form to add a URL pattern to the actionsfile */ }, - { "edit-actions-remove-url", - cgi_edit_actions_remove_url, - NULL /* Remove a URL pattern from the actionsfile */ }, - { "edit-actions-remove-url-form", - cgi_edit_actions_remove_url_form, - NULL /* Form to remove a URL pattern from the actionsfile */ }, - { "edit-actions-section-add", - cgi_edit_actions_section_add, - NULL /* Remove a section from the actionsfile */ }, - { "edit-actions-section-remove", - cgi_edit_actions_section_remove, - NULL /* Remove a section from the actionsfile */ }, - { "edit-actions-section-swap", - cgi_edit_actions_section_swap, - NULL /* Swap two sections in the actionsfile */ }, -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - { "robots.txt", - cgi_robots_txt, - NULL /* Sends a robots.txt file to tell robots to go away. */ }, { "send-banner", - cgi_send_banner, - NULL /* Send a built-in image */ }, - { "t", - cgi_transparent_image, - NULL /* Send a transparent image (short name) */ }, - { NULL, /* NULL Indicates end of list and default page */ - cgi_error_404, - NULL /* Unknown CGI page */ } + 11, cgi_send_banner, + "HIDE Send the transparent or \"Junkbuster\" gif" }, + { "", + 0, cgi_default, + "Junkbuster main page" }, + { NULL, 0, NULL, NULL } }; -/* - * Bulit-in images for ad replacement - * - * Hint: You can encode your own images like this: - * cat your-image | perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o", unpack("C", $c)); }' - */ - -#ifdef FEATURE_NO_GIFS - -/* - * Checkerboard pattern, as a PNG. - */ -const char image_pattern_data[] = - "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104" - "\122\000\000\000\004\000\000\000\004\010\002\000\000\000\046" - "\223\011\051\000\000\000\006\142\113\107\104\000\310\000\310" - "\000\310\052\045\225\037\000\000\000\032\111\104\101\124\170" - "\332\143\070\161\342\304\377\377\377\041\044\003\234\165\342" - "\304\011\006\234\062\000\125\200\052\251\125\174\360\223\000" - "\000\000\000\111\105\116\104\256\102\140\202"; - -/* - * 1x1 transparant PNG. - */ -const char image_blank_data[] = - "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104\122" - "\000\000\000\004\000\000\000\004\010\006\000\000\000\251\361\236" - "\176\000\000\000\007\164\111\115\105\007\322\003\013\020\073\070" - "\013\025\036\203\000\000\000\011\160\110\131\163\000\000\013\022" - "\000\000\013\022\001\322\335\176\374\000\000\000\004\147\101\115" - "\101\000\000\261\217\013\374\141\005\000\000\000\033\111\104\101" - "\124\170\332\143\070\161\342\304\207\377\377\377\347\302\150\006" - "\144\016\210\146\040\250\002\000\042\305\065\221\270\027\131\110" - "\000\000\000\000\111\105\116\104\256\102\140\202"; -#else - -/* - * Checkerboard pattern, as a GIF. - */ -const char image_pattern_data[] = - "\107\111\106\070\071\141\004\000\004\000\200\000\000\310\310" - "\310\377\377\377\041\376\016\111\040\167\141\163\040\141\040" - "\142\141\156\156\145\162\000\041\371\004\001\012\000\001\000" - "\054\000\000\000\000\004\000\004\000\000\002\005\104\174\147" - "\270\005\000\073"; - -/* - * 1x1 transparant GIF. - */ -const char image_blank_data[] = - "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000" - "\000!\371\004\001\000\000\000\000,\000\000\000\000\001" - "\000\001\000\000\002\002D\001\000;"; -#endif - -const size_t image_pattern_length = sizeof(image_pattern_data) - 1; -const size_t image_blank_length = sizeof(image_blank_data) - 1; - - -static struct http_response cgi_error_memory_response[1]; - -static struct http_response *dispatch_known_cgi(struct client_state * csp, - const char * path); -static struct map *parse_cgi_parameters(char *argstring); - - /********************************************************************* * * Function : dispatch_cgi * - * Description : Checks if a request URL has either the magical - * hostname CGI_SITE_1_HOST (usully http://i.j.b/) or - * matches CGI_SITE_2_HOST CGI_SITE_2_PATH (usually - * http://ijbswa.sourceforge.net/config). If so, it passes - * the (rest of the) path onto dispatch_known_cgi, which - * calls the relevant CGI handler function. + * Description : Checks if a request URL has either the magical hostname + * i.j.b or matches HOME_PAGE_URL/config/. If so, it parses + * the (rest of the) path as a cgi name plus query string, + * prepares a map that maps CGI parameter names to their values, + * initializes the http_response struct, and calls the + * relevant CGI handler function. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) @@ -542,47 +174,31 @@ static struct map *parse_cgi_parameters(char *argstring); *********************************************************************/ struct http_response *dispatch_cgi(struct client_state *csp) { - const char *host = csp->http->host; - const char *path = csp->http->path; + char *argstring = NULL; + const struct cgi_dispatcher *d; + struct map *param_list; + struct http_response *rsp; /* * Should we intercept ? */ - /* Note: "example.com" and "example.com." are equivalent hostnames. */ - - /* Either the host matches CGI_SITE_1_HOST ..*/ - if ( ( (0 == strcmpic(host, CGI_SITE_1_HOST)) - || (0 == strcmpic(host, CGI_SITE_1_HOST "."))) - && (path[0] == '/') ) + /* Either the host matches CGI_PREFIX_HOST ..*/ + if (0 == strcmpic(csp->http->host, CGI_PREFIX_HOST)) { - /* ..then the path will all be for us. Remove leading '/' */ - path++; + /* ..then the path will all be for us */ + argstring = csp->http->path; } - /* Or it's the host part CGI_SITE_2_HOST, and the path CGI_SITE_2_PATH */ - else if ( ( (0 == strcmpic(host, CGI_SITE_2_HOST )) - || (0 == strcmpic(host, CGI_SITE_2_HOST ".")) ) - && (0 == strncmpic(path, CGI_SITE_2_PATH, strlen(CGI_SITE_2_PATH))) ) + /* Or it's the host part HOME_PAGE_URL, and the path /config ? */ + else if ( (0 == strcmpic(csp->http->host, HOME_PAGE_URL + 7 )) + && (0 == strncmpic(csp->http->path,"/config", 7)) + && ((csp->http->path[7] == '/') || (csp->http->path[7] == '\0'))) { - /* take everything following CGI_SITE_2_PATH */ - path += strlen(CGI_SITE_2_PATH); - if (*path == '/') - { - /* skip the forward slash after CGI_SITE_2_PATH */ - path++; - } - else if (*path != '\0') - { - /* - * wierdness: URL is /configXXX, where XXX is some string - * Do *NOT* intercept. - */ - return NULL; - } + /* then it's everything following "/config" */ + argstring = csp->http->path + 7; } else { - /* Not a CGI */ return NULL; } @@ -590,74 +206,16 @@ struct http_response *dispatch_cgi(struct client_state *csp) * This is a CGI call. */ - return dispatch_known_cgi(csp, path); -} - - -/********************************************************************* - * - * Function : dispatch_known_cgi - * - * Description : Processes a CGI once dispatch_cgi has determined that - * it matches one of the magic prefixes. Parses the path - * as a cgi name plus query string, prepares a map that - * maps CGI parameter names to their values, initializes - * the http_response struct, and calls the relevant CGI - * handler function. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : path = Path of CGI, with the CGI prefix removed. - * Should not have a leading "/". - * - * Returns : http_response, or NULL on handler failure or out of - * memory. - * - *********************************************************************/ -static struct http_response *dispatch_known_cgi(struct client_state * csp, - const char * path) -{ - const struct cgi_dispatcher *d; - struct map *param_list; - struct http_response *rsp; - char *query_args_start; - char *path_copy; - jb_err err; - - if (NULL == (path_copy = strdup(path))) - { - return cgi_error_memory(); - } - - query_args_start = path_copy; - while (*query_args_start && *query_args_start != '?') - { - query_args_start++; - } - if (*query_args_start == '?') + /* 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); @@ -665,32 +223,25 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp, csp->ip_addr_str, csp->http->cmd); /* Find and start the right CGI function*/ - d = cgi_dispatchers; - for (;;) + for (d = cgi_dispatcher; d->handler; d++) { - if ((d->name == NULL) || (strcmp(path_copy, d->name) == 0)) + if (strncmp(argstring, d->name, d->name_length) == 0) { - err = (d->handler)(csp, rsp, param_list); - free(path_copy); - free_map(param_list); - if (err == JB_ERR_CGI_PARAMS) - { - err = cgi_error_bad_param(csp, rsp); - } - if (!err) - { - /* It worked */ - return finish_http_response(rsp); - } - else + param_list = parse_cgi_parameters(argstring + d->name_length); + if ((d->handler)(csp, rsp, param_list)) { - /* Error in handler, probably out-of-memory */ - free_http_response(rsp); - return cgi_error_memory(); + freez(rsp); } + + free_map(param_list); + return(finish_http_response(rsp)); } - d++; } + + /* Can't get here, since cgi_default will match all requests */ + freez(rsp); + return(NULL); + } @@ -702,361 +253,521 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp, * pairs and store them in a struct map list. * * Parameters : - * 1 : string = string to be parsed. Will be trashed. + * 1 : string = string to be parsed * - * Returns : pointer to param list, or NULL if out of memory. + * Returns : poniter to param list, or NULL if failiure * *********************************************************************/ -static struct map *parse_cgi_parameters(char *argstring) +struct map *parse_cgi_parameters(char *argstring) { - char *p; + char *tmp, *p; char *vector[BUFFER_SIZE]; int pairs, i; - struct map *cgi_params; + struct map *cgi_params = NULL; - if (NULL == (cgi_params = new_map())) - { - return NULL; - } + if(*argstring == '?') argstring++; + tmp = strdup(argstring); - pairs = ssplit(argstring, "&", vector, SZ(vector), 1, 1); + pairs = ssplit(tmp, "&", vector, SZ(vector), 1, 1); for (i = 0; i < pairs; i++) { if ((NULL != (p = strchr(vector[i], '='))) && (*(p+1) != '\0')) { *p = '\0'; - if (map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0)) - { - free_map(cgi_params); - return NULL; - } + cgi_params = map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0); } } - return cgi_params; + free(tmp); + return(cgi_params); } /********************************************************************* * - * Function : error_response - * - * Description : returns an http_response that explains the reason - * why a request failed. + * Function : cgi_default * + * Description : CGI function that is called if no action was given. + * Lists menu of available unhidden CGIs. + * * Parameters : - * 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, "

What made you think this cgi takes parameters?\n" + "Anyway, here they are, in case you're interested:

\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 = - "\r\n" - "500 Internal Privoxy Error\r\n" - "\r\n" - "

500 Internal Privoxy Error

\r\n" - "

Privoxy ran out of memory while processing your request.

\r\n" - "

Please contact your proxy administrator, or try again later

\r\n" - "\r\n" - "\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[] = - "\r\n" - "500 Internal Privoxy Error\r\n" - "\r\n" - "

500 Internal Privoxy Error

\r\n" - "

Privoxy encountered an error while processing your request:

\r\n" - "

Could not load template file "; - static const char body_suffix[] = - "

\r\n" - "

Please contact your proxy administrator.

\r\n" - "

If you are the proxy administrator, please put the required file " - "in the (confdir)/templates directory. The " - "location of the (confdir) directory " - "is specified in the main Privoxy config " - "file. (It's typically the Privoxy install directory" -#ifndef _WIN32 - ", or /etc/privoxy/" -#endif /* ndef _WIN32 */ - ").

\r\n" - "\r\n" - "\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, "

ERROR OPENING FILE!

", 1); + } + else + { + while (fgets(buf, sizeof(buf), fp)) + { + p = html_encode(buf); + if (p) + { + s = strsav(s, p); + freez(p); + s = strsav(s, "
"); + } + } + 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, "{"); + matches = strsav(matches, s); + matches = strsav(matches, " }
\n"); + matches = strsav(matches, b->url->spec); + matches = strsav(matches, "
\n
\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)); } @@ -1070,28 +781,18 @@ void get_http_time(int time_offset, char *buf) * Parameters : * 1 : rsp = pointer to http_response to be processed * - * Returns : A http_response, usually the rsp parameter. - * On error, free()s rsp and returns cgi_error_memory() + * Returns : http_response, or NULL on failiure * *********************************************************************/ struct http_response *finish_http_response(struct http_response *rsp) { char buf[BUFFER_SIZE]; - jb_err err; - - /* Special case - do NOT change this statically allocated response, - * which is ready for output anyway. - */ - if (rsp == cgi_error_memory_response) - { - return rsp; - } /* * Fill in the HTTP Status */ sprintf(buf, "HTTP/1.0 %s", rsp->status ? rsp->status : "200 OK"); - err = enlist_first(rsp->headers, buf); + enlist_first(rsp->headers, buf); /* * Set the Content-Length @@ -1100,95 +801,32 @@ struct http_response *finish_http_response(struct http_response *rsp) { rsp->content_length = rsp->body ? strlen(rsp->body) : 0; } - if (!err) - { - sprintf(buf, "Content-Length: %d", rsp->content_length); - err = enlist(rsp->headers, buf); - } + sprintf(buf, "Content-Length: %d", rsp->content_length); + enlist(rsp->headers, buf); /* - * Fill in the default headers: - * - * Content-Type: default to text/html if not already specified. - * Date: set to current date/time. - * Last-Modified: set to date/time the page was last changed. - * Expires: set to date/time page next needs reloading. - * Cache-Control: set to "no-cache" if applicable. - * - * See http://www.w3.org/Protocols/rfc2068/rfc2068 + * Fill in the default headers FIXME: Are these correct? sequence OK? check rfc! */ - if (!err) err = enlist_unique(rsp->headers, "Content-Type: text/html", 13); - - if (rsp->is_static) - { - /* - * Set Expires to about 10 min into the future so it'll get reloaded - * occasionally, e.g. if Privoxy gets upgraded. - */ - - if (!err) - { - get_http_time(0, buf); - err = enlist_unique_header(rsp->headers, "Date", buf); - } - - /* Some date in the past. */ - if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", "Sat, 17 Jun 2000 12:00:00 GMT"); - - if (!err) - { - get_http_time(10 * 60, buf); /* 10 * 60sec = 10 minutes */ - err = enlist_unique_header(rsp->headers, "Expires", buf); - } - } - else - { - /* - * Compliant browsers should not cache this due to the "Cache-Control" - * setting. However, to be certain, we also set both "Last-Modified" - * and "Expires" to the current time. - */ - if (!err) err = enlist_unique_header(rsp->headers, "Cache-Control", "no-cache"); - - get_http_time(0, buf); - if (!err) err = enlist_unique_header(rsp->headers, "Date", buf); - if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", buf); - if (!err) err = enlist_unique_header(rsp->headers, "Expires", buf); - } - + enlist_unique(rsp->headers, "Last-Modified: Thu Jul 31, 1997 07:42:22 pm GMT", 14); + enlist_unique(rsp->headers, "Expires: Thu Jul 31, 1997 07:42:22 pm GMT", 8); + enlist_unique(rsp->headers, "Content-Type: text/html", 13); + enlist(rsp->headers, ""); + /* * Write the head */ - if (err || (NULL == (rsp->head = list_to_text(rsp->headers)))) + if (NULL == (rsp->head = list_to_text(rsp->headers))) { free_http_response(rsp); - return cgi_error_memory(); + return(NULL); } rsp->head_length = strlen(rsp->head); - return rsp; + 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)); - -} - + /********************************************************************* * @@ -1205,16 +843,13 @@ struct http_response *alloc_http_response(void) *********************************************************************/ void free_http_response(struct http_response *rsp) { - /* - * Must special case cgi_error_memory_response, which is never freed. - */ - if (rsp && (rsp != cgi_error_memory_response)) + if(rsp) { freez(rsp->status); freez(rsp->head); freez(rsp->body); destroy_list(rsp->headers); - free(rsp); + freez(rsp); } } @@ -1222,254 +857,99 @@ void free_http_response(struct http_response *rsp) /********************************************************************* * - * Function : template_load + * Function : fill_template * * Description : CGI support function that loads a given HTML - * template from the confdir, ignoring comment - * lines. + * template from the confdir, and fills it in + * by replacing @name@ with value using pcrs, + * for each item in the output map. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : template_ptr = Destination for pointer to loaded - * template text. - * 3 : template = name of the HTML template to be used + * 1 : csp = Current client state (buffers, headers, etc...) + * 3 : template = name of the HTML template to be used + * 2 : exports = map with fill in symbol -> name pairs * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * JB_ERR_FILE if the template file cannot be read + * Returns : char * with filled out form, or NULL if failiure * *********************************************************************/ -jb_err template_load(struct client_state *csp, char ** template_ptr, - const char *templatename) +char *fill_template(struct client_state *csp, const char *template, struct map *exports) { - char *templates_dir_path; - char *full_path; - char *file_buffer; - FILE *fp; + struct map *m; + pcrs_job *job, *joblist = NULL; char buf[BUFFER_SIZE]; + char *new, *old = NULL; + int size; + FILE *fp; - assert(csp); - assert(template_ptr); - assert(templatename); - - *template_ptr = NULL; /* * Open template file or fail */ + snprintf(buf, BUFFER_SIZE, "%s/templates/%s", csp->config->confdir, template); - templates_dir_path = make_path(csp->config->confdir, "templates"); - if (templates_dir_path == NULL) - { - 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; } @@ -1483,75 +963,43 @@ jb_err template_fill_for_cgi(struct client_state *csp, * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * 2 : caller = name of CGI who calls us and which should - * be excluded from the generated menu. May be - * NULL. - * Returns : NULL if no memory, else a new map. Caller frees. + * be excluded from the generated menu. + * Returns : NULL if no memory, else map * *********************************************************************/ -struct map *default_exports(const struct client_state *csp, const char *caller) +struct map *default_exports(struct client_state *csp, char *caller) { + struct map *exports = NULL; char buf[20]; - jb_err err; - struct map * exports; - int local_help_exists = 0; - - assert(csp); - - exports = new_map(); - if (exports == NULL) - { - return NULL; - } - err = map(exports, "version", 1, html_encode(VERSION), 0); - if (!err) err = map(exports, "my-ip-address", 1, html_encode(csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown"), 0); - if (!err) err = map(exports, "my-hostname", 1, html_encode(csp->my_hostname ? csp->my_hostname : "unknown"), 0); - if (!err) err = map(exports, "homepage", 1, html_encode(HOME_PAGE_URL), 0); - if (!err) err = map(exports, "default-cgi", 1, html_encode(CGI_PREFIX), 0); - if (!err) err = map(exports, "menu", 1, make_menu(caller), 0); - if (!err) err = map(exports, "code-status", 1, CODE_STATUS, 1); - if (!err) err = map_conditional(exports, "enabled-display", g_bToggleIJB); + exports = map(exports, "version", 1, VERSION, 1); + exports = map(exports, "my-ip-address", 1, csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown", 1); + exports = map(exports, "my-hostname", 1, csp->my_hostname ? csp->my_hostname : "unknown", 1); + exports = map(exports, "admin-address", 1, csp->config->admin_address ? csp->config->admin_address : "fill@me.in.please", 1); + exports = map(exports, "homepage", 1, HOME_PAGE_URL, 1); + exports = map(exports, "default-cgi", 1, HOME_PAGE_URL "/config", 1); + exports = map(exports, "menu", 1, make_menu(caller), 0); + exports = map(exports, "code-status", 1, CODE_STATUS, 1); snprintf(buf, 20, "%d", csp->config->hport); - if (!err) err = map(exports, "my-port", 1, buf, 1); + exports = map(exports, "my-port", 1, buf, 1); if(!strcmp(CODE_STATUS, "stable")) { - if (!err) err = map_block_killer(exports, "unstable"); + 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; } @@ -1569,184 +1017,145 @@ struct map *default_exports(const struct client_state *csp, const char *caller) * 1 : exports = map to extend * 2 : name = name of conditional block * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : extended map * *********************************************************************/ -jb_err map_block_killer(struct map *exports, const char *name) +struct map *map_block_killer(struct map *exports, char *name) { char buf[1000]; /* Will do, since the names are hardwired */ - assert(exports); - assert(name); - assert(strlen(name) < 490); - snprintf(buf, 1000, "if-%s-start.*if-%s-end", name, name); - return map(exports, buf, 1, "", 1); + exports = map(exports, buf, 1, "", 1); + + return(exports); + } /********************************************************************* * - * Function : map_block_keep + * Function : make_menu * - * Description : Convenience function. Removes the markers used - * by map-block-killer, to save a few bytes. - * i.e. removes "@if--start@" and "@if--end@" + * Description : Returns an HTML-formatted menu of the available + * unhidden CGIs, excluding the one given in . * - * 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, "
  • %s
  • \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 , i.e. a substitution of the form: - * @if--then@ - * True text - * @else-not-@ - * False text - * @endif-@ + * 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, "\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, "\n"); + p = p->next; } - snprintf(buf, 1000, (choose_first ? "if-%s-then" : "endif-%s"), name); - return map(exports, buf, 1, "", 1); + ret = strsav(ret, "
    "); + ret = strsav(ret, p->name); + ret = strsav(ret, ""); + ret = strsav(ret, p->value); + ret = strsav(ret, "
    \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 . + * 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, "
  • name); - string_append(&result, "\">"); - string_append(&result, d->description); - string_append(&result, "
  • \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, "\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, "\n"); + sprintf(buf, "%6.2f", perc_rej); + exports = map(exports, "percent-blocked", 1, buf, 1); } - string_append(&ret, "
    "); - string_join (&ret, html_encode(cur_entry->name)); - string_append(&ret, ""); - string_join (&ret, html_encode(cur_entry->value)); - string_append(&ret, "
    \n"); - return ret; -} + return(exports); +} +#endif /* def STATISTICS */ /* Local Variables: diff --git a/cgi.h b/cgi.h index c7391bc6..fb6f5742 100644 --- a/cgi.h +++ b/cgi.h @@ -1,6 +1,6 @@ -#ifndef CGI_H_INCLUDED -#define CGI_H_INCLUDED -#define CGI_H_VERSION "$Id: cgi.h,v 1.23 2002/03/24 16:18:15 jongfoster Exp $" +#ifndef _CGI_H +#define _CGI_H +#define CGI_H_VERSION "$Id: cgi.h,v 1.5 2001/06/29 13:22:44 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ @@ -12,7 +12,7 @@ * * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -38,86 +38,6 @@ * * Revisions : * $Log: cgi.h,v $ - * Revision 1.23 2002/03/24 16:18:15 jongfoster - * Removing old logo - * - * Revision 1.22 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.21 2002/03/07 03:48:38 oes - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - Added a 4x4 pattern PNG which is less intrusive - * than the logo but also clearly marks the deleted banners - * - * Revision 1.20 2002/03/04 17:53:22 oes - * Fixed compiled warning - * - * Revision 1.19 2002/01/21 00:33:52 jongfoster - * Adding map_block_keep() to save a few bytes in the edit-actions-list HTML. - * - * Revision 1.18 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.17 2001/10/23 21:48:19 jongfoster - * Cleaning up error handling in CGI functions - they now send back - * a HTML error page and should never cause a FATAL error. (Fixes one - * potential source of "denial of service" attacks). - * - * CGI actions file editor that works and is actually useful. - * - * Ability to toggle JunkBuster remotely using a CGI call. - * - * You can turn off both the above features in the main configuration - * file, e.g. if you are running a multi-user proxy. - * - * Revision 1.16 2001/09/16 17:08:54 jongfoster - * Moving simple CGI functions from cgi.c to new file cgisimple.c - * - * Revision 1.15 2001/09/16 15:02:35 jongfoster - * Adding i.j.b/robots.txt. - * Inlining add_stats() since it's only ever called from one place. - * - * Revision 1.14 2001/09/16 11:38:02 jongfoster - * Splitting fill_template() into 2 functions: - * template_load() loads the file - * template_fill() performs the PCRS regexps. - * This is because the CGI edit interface has a "table row" - * template which is used many times in the page - this - * change means it's only loaded from disk once. - * - * Revision 1.13 2001/09/16 11:00:10 jongfoster - * New function alloc_http_response, for symmetry with free_http_response - * - * Revision 1.12 2001/09/13 23:31:25 jongfoster - * Moving image data to cgi.c rather than cgi.h. - * - * Revision 1.11 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.10 2001/08/01 21:19:22 jongfoster - * Moving file version information to a separate CGI page. - * - * Revision 1.9 2001/08/01 00:17:54 jongfoster - * Adding prototype for map_conditional - * - * Revision 1.8 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.7 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.6 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * * Revision 1.5 2001/06/29 13:22:44 oes * - Cleaned up * - Added new functions: default_exports(), make_menu(), @@ -145,59 +65,68 @@ extern "C" { #endif /* - * Main dispatch function + * Dispatch & parameter parsing functions */ extern struct http_response *dispatch_cgi(struct client_state *csp); +extern struct map *parse_cgi_parameters(char *argstring); + +/* + * CGI functions + */ +extern int cgi_default(struct client_state *csp, struct http_response *rsp, + struct map *parameters); +extern int cgi_show_status(struct client_state *csp, struct http_response *rsp, + struct map *parameters); +extern int cgi_show_url_info(struct client_state *csp, struct http_response *rsp, + struct map *parameters); +extern int cgi_send_banner(struct client_state *csp, struct http_response *rsp, + struct map *parameters); /* Not exactly a CGI */ -extern struct http_response * error_response(struct client_state *csp, - const char *templatename, - int err); +extern struct http_response *error_response(struct client_state *csp, const char *template, int err); /* * CGI support functions */ -extern struct http_response * alloc_http_response(void); -extern void free_http_response(struct http_response *rsp); - extern struct http_response *finish_http_response(struct http_response *rsp); +extern void free_http_response(struct http_response *rsp); -extern struct map * default_exports(const struct client_state *csp, const char *caller); - -extern jb_err map_block_killer (struct map *exports, const char *name); -extern jb_err map_block_keep (struct map *exports, const char *name); -extern jb_err map_conditional (struct map *exports, const char *name, int choose_first); - -extern jb_err template_load(struct client_state *csp, char ** template_ptr, - const char *templatename); -extern jb_err template_fill(char ** template_ptr, const struct map *exports); -extern jb_err template_fill_for_cgi(struct client_state *csp, - const char *templatename, - struct map *exports, - struct http_response *rsp); +extern struct map *default_exports(struct client_state *csp, char *caller); +extern struct map *map_block_killer(struct map *map, char *name); +extern char *fill_template(struct client_state *csp, const char *template, struct map *exports); -extern void cgi_init_error_messages(void); -extern struct http_response *cgi_error_memory(void); -extern jb_err cgi_error_no_template(struct client_state *csp, - struct http_response *rsp, - const char *template_name); -extern jb_err cgi_error_bad_param(struct client_state *csp, - struct http_response *rsp); /* * Text generators */ -extern void get_http_time(int time_offset, char * buf); extern char *make_menu(const char *self); -extern char *dump_map(const struct map *the_map); +extern char *dump_map(struct map *map); + +#ifdef STATISTICS +extern struct map *add_stats(struct map *exports); +#endif /* def STATISTICS */ + /* - * Ad replacement images. + * Hint: You can encode your own GIFs like that: + * perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o,", unpack("C", $c)); }' */ -extern const char image_pattern_data[]; -extern const size_t image_pattern_length; -extern const char image_blank_data[]; -extern const size_t image_blank_length; + +static const char JBGIF[] = + "GIF89aD\000\013\000\360\000\000\000\000\000\377\377\377!" + "\371\004\001\000\000\001\000,\000\000\000\000D\000\013\000" + "\000\002a\214\217\251\313\355\277\000\200G&K\025\316hC\037" + "\200\234\230Y\2309\235S\230\266\206\372J\253<\3131\253\271" + "\270\215\342\254\013\203\371\202\264\334P\207\332\020o\266" + "N\215I\332=\211\312\3513\266:\026AK)\364\370\365aobr\305" + "\372\003S\275\274k2\354\254z\347?\335\274x\306^9\374\276" + "\037Q\000\000;"; + +static const char BLANKGIF[] = + "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000" + "\000!\371\004\001\000\000\000\000,\000\000\000\000\001" + "\000\001\000\000\002\002D\001\000;"; + /* Revision control strings from this header and associated .c file */ extern const char cgi_rcs[]; @@ -207,7 +136,7 @@ extern const char cgi_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef CGI_H_INCLUDED */ +#endif /* ndef _CGI_H */ /* Local Variables: diff --git a/cgiedit.c b/cgiedit.c deleted file mode 100644 index 51a70f27..00000000 --- a/cgiedit.c +++ /dev/null @@ -1,4522 +0,0 @@ -const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.27 2002/03/26 23:06:04 jongfoster Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/cgiedit.c,v $ - * - * Purpose : CGI-based actionsfile editor. - * - * Functions declared include: cgi_edit_* - * - * NOTE: The CGIs in this file use parameter names - * such as "f" and "s" which are really *BAD* choices. - * However, I'm trying to save bytes in the - * edit-actions-list HTML page - the standard actions - * file generated a 550kbyte page, which is ridiculous. - * - * Stick to the short names in this file for consistency. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: cgiedit.c,v $ - * Revision 1.27 2002/03/26 23:06:04 jongfoster - * Removing duplicate @ifs on the toggle page - * - * Revision 1.26 2002/03/26 22:59:17 jongfoster - * Fixing /toggle to display status consistently. - * - * Revision 1.25 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.24 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.23 2002/03/24 13:32:41 swa - * name change related issues - * - * Revision 1.22 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.21 2002/03/22 18:02:48 jongfoster - * Fixing remote toggle - * - * Revision 1.20 2002/03/16 20:28:34 oes - * Added descriptions to the filters so users will know what they select in the cgi editor - * - * Revision 1.19 2002/03/16 18:38:14 jongfoster - * Stopping stupid or malicious users from breaking the actions - * file using the web-based editor. - * - * Revision 1.18 2002/03/16 14:57:44 jongfoster - * Full support for enabling/disabling modular filters. - * - * Revision 1.17 2002/03/16 14:26:42 jongfoster - * First version of modular filters support - READ ONLY! - * Fixing a double-free bug in the out-of-memory handling in map_radio(). - * - * Revision 1.16 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.15 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.14 2002/03/05 00:24:51 jongfoster - * Patch to always edit the current actions file. - * - * Revision 1.13 2002/03/04 02:07:59 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.12 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.11 2002/01/23 01:03:31 jongfoster - * Fixing gcc [CygWin] compiler warnings - * - * Revision 1.10 2002/01/23 00:22:59 jongfoster - * Adding new function cgi_edit_actions_section_swap(), to reorder - * the actions file. - * - * Adding get_url_spec_param() to get a validated URL pattern. - * - * Moving edit_read_line() out of this file and into loaders.c. - * - * Adding missing html_encode() to many CGI functions. - * - * Moving the functions that #include actionlist.h to the end of the file, - * because the Visual C++ 97 debugger gets extremely confused if you try - * to debug any code that comes after them in the file. - * - * Major optimizations in cgi_edit_actions_list() to reduce the size of - * the generated HTML (down 40% from 550k to 304k), with major side-effects - * throughout the editor and templates. In particular, the length of the - * URLs throughout the editor has been drastically reduced, by cutting - * paramater names down to 1 character and CGI names down to 3-4 - * characters, by removing all non-essential CGI paramaters even at the - * expense of having to re-read the actions file for the most trivial - * page, and by using relative rather than absolute URLs. This means - * that this (typical example): - * - * - * - * is now this: - * - * - * - * 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. - * - * - **********************************************************************/ - - -#include "config.h" - -/* - * FIXME: Following includes copied from cgi.c - which are actually needed? - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#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: - * - * 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: - * Nimda!%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|]*?(width=['"]?468\D)[^>]*(height=['"]?60[^>]*?)>||sig -s|]*?(width=['"]?234\D)[^>]*(height=['"]?60[^>]*?)>||sig -s|]*?(width=['"]?88\D)[^>]*(height=['"]?31[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?90[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?600[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?60[^>]*?)>||sig -s|]*?(width=['"]?160\D)[^>]*(height=['"]?600[^>]*?)>||sig -s|]*?(width=['"]?125\D)[^>]*(height=['"]?125[^>]*?)>||sig -s|]*?(width=['"]?120\D)[^>]*(height=['"]?240[^>]*?)>||sig -s|]*?(width=['"]?180\D)[^>]*(height=['"]?150[^>]*?)>||sig -s|]*?(width=['"]?300\D)[^>]*(height=['"]?250[^>]*?)>||sig -s|]*?(width=['"]?250\D)[^>]*(height=['"]?250[^>]*?)>||sig -s|]*?(width=['"]?240\D)[^>]*(height=['"]?400[^>]*?)>||sig -s|]*?(width=['"]?336\D)[^>]*(height=['"]?280[^>]*?)>||sig - -# One more. (Where is 200x50 from?) -# -s|]*?(width=['"]?200\D)[^>]*(height=['"]?50[^>]*?)>||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%^.*(?Blocked

    Blocked due to possible adult content. Please see this site.

    %is -s+^.*warez.*$+No Warez

    You're not searching for illegal stuff, are you?

    +is - -############################################################################## -# -# Revisions : -# $Log: default.filter,v $ -# Revision 1.4 2002/03/26 22:29:54 swa -# we have a new homepage! -# -# Revision 1.3 2002/03/24 16:08:03 jongfoster -# Fixing banners-by-size for new config URLs -# -# Revision 1.2 2002/03/24 13:02:18 swa -# name change related issues. -# -# Revision 1.1 2002/03/24 11:37:39 jongfoster -# Name change -# -# Revision 1.24 2002/03/16 20:39:54 oes -# - Added descriptions to the filters so users will know what they select in the cgi editor -# - Added content-cookies filter -# - Bugfixed many jobs (Thanks to Al for some hints) -# -# Revision 1.22 2002/03/12 13:42:50 oes -# Fixing & Optimizing REs -# -# Revision 1.21 2002/03/12 11:59:20 oes -# Beefed up Buzzword Bingo -# -# Revision 1.20 2002/03/12 01:42:50 oes -# Introduced modular filters -# -# Revision 1.19 2002/03/10 19:49:24 oes -# Added expression to kill referer tracking in JavaScripts -# -# Revision 1.18 2002/03/08 17:14:12 oes -# PNG -> image in comments -# -# Revision 1.17 2002/03/07 03:50:54 oes -# Adapted comments to new built-in images -# -# Revision 1.16 2002/02/21 00:12:19 jongfoster -# Modifying the banner regexps to use long URLS and to autodetect -# whether to show a logo or a transparent GIF, based on actionsfile -# setting. -# -# Revision 1.15 2001/12/28 23:54:20 steudten -# Fix for feature Req #495374: http-equiv problem -# -# Revision 1.14 2001/12/09 18:55:11 david__schmidt -# Updated CODE_STATUS to beta, commented out microsuck line in re_filterfile -# for 2.9.10 beta -# -# Revision 1.13 2001/10/13 13:11:20 joergs -# Fixed WebBug filter. -# -# Revision 1.12 2001/10/07 15:46:42 oes -# Followed Guy's proposal to change the document.cookie job -# -# Revision 1.11 2001/09/21 12:34:00 joergs -# Added filter to replace "Nimda" code by a warning. -# -# Revision 1.10 2001/07/20 11:04:26 oes -# Added Rodneys javascript cookie filter -# -# Revision 1.9 2001/07/13 14:03:48 oes -# Elimiated yet another bug in the banner-by-size jobs. Shame on me! -# -# Revision 1.8 2001/06/29 13:34:00 oes -# - Added explanation for U and T options -# - Added hint on image replacement by CGI call -# - Fixed bug in banner-by-size jobs -# -# Revision 1.7 2001/06/19 14:21:56 oes -# Fixed microsuck line -# -# Revision 1.6 2001/06/09 14:01:57 swa -# header. cosmetics. default: no messing ala microsuck. -# -# -# diff --git a/doc/.gitignore b/doc/.gitignore deleted file mode 100644 index 769562fa..00000000 --- a/doc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -man -text diff --git a/doc/USER_DOC_IS_WIDELY_OBSOLETED b/doc/USER_DOC_IS_WIDELY_OBSOLETED new file mode 100644 index 00000000..e69de29b diff --git a/doc/changes.txt b/doc/changes.txt new file mode 100644 index 00000000..6aa14820 --- /dev/null +++ b/doc/changes.txt @@ -0,0 +1,991 @@ +This file contains details of the changes made to JunkBuster, in +chronological order. Scroll down to the bottom for the newest +additions! + + +***************************************************************************** +* Copied from old README * +***************************************************************************** + +README for the Internet Junkbuster Proxy (TM) Copyright 1997-8 Junkbusters Corp. + + Id: README,v 1.1 2001/04/16 21:10:38 rodney Exp + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +The version of the code with this makefile is Version 2.0.2. +No CHANGES file is included here; for a history of previous versions see + http://www.junkbusters.com/ht/en/ijbdist.html#previous +This version tightens security over 2.0.1; some multi-user sites will need +to change the listen-address in the configuration file (see previous URL). + +For installation on Windows see http://www.junkbusters.com/ht/en/ijbwin.html +An executable is provided so you don't need nmake or a C compiler. + +For UNIX and other systems see the FAQ. If you just want to test it with its +defaults of simply stopping cookies and private info, all you need to do now +on most Unix systems is type make, run junkbuster & and configure your browser. + +This directory should contain the following files. The .html files are also +in http://www.junkbusters.com/ht/en/ and http://internet.junkbuster.com +You are welcome to publish copies of the .html files on your local web server, +according to the GNU General Public License. + +gpl.html GNU General Public Licence +junkbstr.exe Executable (binary) for Windows 95/NT +Makefile A very bland Makefile; Most versions of Unix except HP & Suns + compile without change. Windows requires the changes indicated. +ijbman.html Manual for the Internet Junkbuster, HTML format +junkbuster.1 Manual for the Internet Junkbuster, man macro format: + man ./junkbuster.1 # or nroff -man junkbuster.1 | more +ijbfaq.html FAQ: Frequently Asked Questions on the Internet Junkbuster + Includes installation instructions +junkbstr.ini Sample configuration file with almost all options commented out +sblock.ini Sample blockfile (which doesn't really block much, see FAQ) +scookie.ini Sample cookiefile (permits little; you decide who to trust) +saclfile.ini Sample access control file (block access to everyone) +sforward.ini Sample forwardfile (does no fowarding, no gateways, so SOCKS) +strust.ini Sample trustfile (has no trusted sites and blocks nothing) +conn.c, bind.c, encode.c, loaders.c, parsers.c, ssplit.c Various utilities +socks4.c Code for SOCKS4 and SOCKS4A gateways +jcc.c The main program +jcc.h #included declarations etc +gnu_regex.c, gnu_regex.h: Regular expression code from the FSF, not us. +win32.c A few lines of code specific to the Windows version (95 & NT) +acl.c Access controls (new in version 2.0) - doesn't replace firewalls +filters.c Strings for the presentation of messages to user + +If you find that the Internet Junkbuster improves the quality of your life +online, we hope you'll visit http://www.junkbusters.com to see how our free +services can help you bust other kinds of junk out of your life: +junk mail, spam, telemarketing, and invasions of your private data. +And please tell your friends about this free product, and help them set it up. + +If your company finds this software useful in protecting its confidential +information and making its people happier and more productive, please consider +purchasing one of our our commercial support packages: + http://www.junkbusters.com/ht/en/ijbfaq.html#commercial + +We don't advertise, so please tell others in your community about us. + +Junkbusters Corp. http://www.junkbusters.com + + +***************************************************************************** +* Copied from old README.too * +***************************************************************************** + +Id: README.TOO,v 1.1 2001/04/16 21:10:38 rodney Exp + +This is the README.TOO file for Stefan's version of the Internet +Junkbuster (from http://www.waldherr.org/junkbuster/). + + + +Installation: +------------- +Install the RPM with the usual command `rpm -Uvh foobar.rpm'. Since we +run the Junkbuster as user `nobody', cd to a directory where `nobody' +has read access (in particular NOT /root) and issue (as root) + + /etc/rc.d/init.d/junkbuster start + +This will be done automagically for you any time you boot your machine. + + + +Configuration: +-------------- +To let Junkbuster take `care' of the ads, you have to setup your +browser to use the Junkbuster. + + Short instructions for the advanced user: + + Configure Netscape to use 127.0.0.1 on port 8000 as + a proxy server. + + Detailed instructions for the beginner: + + Remove Internet Explorer and install Netscape. No `real' + user would ever use MSIE. Though the Junkbuster works + with IE as well. Read + http://www.junkbusters.com/ht/en/ijbfaq.html#browser + +Check to see if the Junkbuster works correctly by surfing to + + http://127.0.0.1/show-proxy-args + +or any other place and add the text `/show-proxy-args' to the URL. +Ok? Then enjoy your ad-free surfing. + + + +Mailinglists: +------------- +In case you are interested in the Junkbuster, there are two +mailinglists (junkbuster-users and junkbuster-announce). Instructions +on how to subscribe and unsubscribe are at + + http://www.waldherr.org/junkbuster/ + +Bugs: +----- +Please fill out + + http://sourceforge.net/bugs/?func=addbug&group_id=11118 + +Patches: +-------- +Please fill out + + http://sourceforge.net/patch/?func=addpatch&group_id=11118 + +Need Help? +---------- +Please fill out + + http://sourceforge.net/support/?func=addsupport&group_id=11118 + + +Comments: +--------- +I would greatly appreciate feedback for this program. Send comments to +Stefan Waldherr (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 (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 " 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 and #include 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 * +***************************************************************************** +(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 * +***************************************************************************** + +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 * +***************************************************************************** +(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 * +***************************************************************************** +(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 * +***************************************************************************** + +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 * +***************************************************************************** + diff --git a/doc/obsolete/fb.gif b/doc/fb.gif similarity index 100% rename from doc/obsolete/fb.gif rename to doc/fb.gif diff --git a/doc/gpl.html b/doc/gpl.html index 7c252b5b..c980e61f 100644 --- a/doc/gpl.html +++ b/doc/gpl.html @@ -1,5 +1,5 @@ - - -
    - - Privoxy Developer Manual - - $Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $ - - - - - By: Privoxy Developers - - - - - - - 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 http://www.privoxy.org/developer-manual/. - Please see the Contact section in the user-manual if you want to contact the - developers. - - - - - - - - - - - Introduction - To be filled. - - - - - 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 - - - A bugfix / clean-up / cosmetic thing: shoot - - - A new feature that can be turned off: shoot - - - A clear improvement w/o side effects on other parts of the code: shoot - - - A matter of taste: ask the list - - - A major redesign of some part of the code: ask the list - - - - - - - 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)? - - - 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. - - - Run make webserver which copies all files from -doc/webserver to the sourceforge webserver -via scp. - - - - - - - - - - Coding Guidelines - - 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. ;-> - - - - Using Comments - - - Comment, Comment, Comment - - Explanation: - - Comment as much as possible without commenting the obvious. - For example do not comment "aVariable is equal to bVariable". - Instead explain why aVariable should be equal to the bVariable. - Just because a person can read code does not mean they will - understand why or what is being done. A reader may spend a lot - more time figuring out what is going on when a simple comment - or explanation would have prevented the extra research. Please - help your brother IJB'ers out! - - The comments will also help justify the intent of the code. - If the comment describes something different than what the code - is doing then maybe a programming error is occurring. - - Example: - -/* if page size greater than 1k ... */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -/* if page size is small, send it in blocks */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -This demonstrates 2 cases of "what not to do". The first is a -"syntax comment". The second is a comment that does not fit what -is actually being done. - - - - - - Use blocks for comments - - Explanation: - - Comments can help or they can clutter. They help when they - are differentiated from the code they describe. One line - comments do not offer effective separation between the comment - and the code. Block identifiers do, by surrounding the code - with a clear, definable pattern. - - Example: - -/********************************************************************* - * This will stand out clearly in your code! - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -/* unfortunately, this may not */ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -if ( thisVariable == thatVariable ) /* this may not either */ -{ - DoSomethingVeryImportant(); -} - - Exception: - - If you are trying to add a small logic comment and do not - wish to "disrubt" the flow of the code, feel free to use a 1 - line comment which is NOT on the same line as the code. - - - - - - Keep Comments on their own line - - Explanation: - - It goes back to the question of readability. If the comment - is on the same line as the code it will be harder to read than - the comment that is on its own line. - - There are three exceptions to this rule, which should be - violated freely and often: during the definition of variables, - at the end of closing braces, when used to comment - parameters. - - Example: - -/********************************************************************* - * This will stand out clearly in your code, - * But the second example won't. - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - -if ( thisVariable == thatVariable ) /*can you see me?*/ -{ - DoSomethingVeryImportant(); /*not easily*/ -} - - -/********************************************************************* - * But, the encouraged exceptions: - *********************************************************************/ -int urls_read = 0; /* # of urls read + rejected */ -int urls_rejected = 0; /* # of urls rejected */ - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); -} - - -short DoSomethingVeryImportant( - short firstparam, /* represents something */ - short nextparam /* represents something else */ ) -{ - ...code here... - -} /* -END- DoSomethingVeryImportant */ - - - - - Comment each logical step - - Explanation: - - Logical steps should be commented to help others follow the - intent of the written code and comments will make the code more - readable. - - If you have 25 lines of code without a comment, you should - probably go back into it to see where you forgot to put - one. - - Most "for", "while", "do", etc... loops _probably_ need a - comment. After all, these are usually major logic - containers. - - - - - - Comment All Functions Thoroughly - - Explanation: - - A reader of the code should be able to look at the comments - just prior to the beginning of a function and discern the - reason for its existence and the consequences of using it. The - reader should not have to read through the code to determine if - a given function is safe for a desired use. The proper - information thoroughly presented at the introduction of a - function not only saves time for subsequent maintenance or - debugging, it more importantly aids in code reuse by allowing a - user to determine the safety and applicability of any function - for the problem at hand. As a result of such benefits, all - functions should contain the information presented in the - addendum section of this document. - - - - - - Comment at the end of braces if the - content is more than one screen length - - Explanation: - - Each closing brace should be followed on the same line by a - comment that describes the origination of the brace if the - original brace is off of the screen, or otherwise far away from - the closing brace. This will simplify the debugging, - maintenance, and readability of the code. - - As a suggestion , use the following flags to make the - comment and its brace more readable: - - use following a closing brace: } /* -END- if() or while () - or etc... */ - - Example: - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if x is 1 */ - -or: - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if ( 1 == X ) */ - - - - - - Naming Conventions - - - - Variable Names - - Explanation: - - 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; - - - - - - - - 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 ) - - - - - - - - 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 ) - - - - - - - - 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 */ - - - - - Constants - - Explanation: - - Spell common words out entirely (do not remove vowels). - - Use only widely-known domain acronyms and abbreviations. - Capitalize all letters of an acronym. - - Use underscore (_) to separate adjacent acronyms and - abbreviations. Never terminate a name with an underscore. - - Example: - -#define USE_IMAGE_LIST 1 - - Instead of: - - - -#define USE_IMG_LST 1 or -#define _USE_IMAGE_LIST 1 or -#define USE_IMAGE_LIST_ 1 or -#define use_image_list 1 or -#define UseImageList 1 - - - - - - - - - - Using Space - - - - Put braces on a line by themselves. - - Explanation: - - The brace needs to be on a line all by itself, not at the - end of the statement. Curly braces should line up with the - construct that they're associated with. This practice makes it - easier to identify the opening and closing braces for a - block. - - Example: - -if ( this == that ) -{ - ... -} - - Instead of: - - if ( this == that ) { ... } - - or - - if ( this == that ) { ... } - - Note: In the special case that the if-statement is - inside a loop, and it is trivial, i.e. it tests for a - condidtion that is obvious from the purpose of the block, - one-liners as above may optically preserve the loop structure - and make it easier to read. - - Status: developer-discrection. - - Example exception: - -while ( more lines are read ) -{ - /* Please document what is/is not a comment line here */ - if ( it's a comment ) continue; - - do_something( line ); -} - - - - - ALL control statements should have a - block - - Explanation: - - Using braces to make a block will make your code more - readable and less prone to error. All control statements should - have a block defined. - - Example: - -if ( this == that ) -{ - DoSomething(); - DoSomethingElse(); -} - - Instead of: - - if ( this == that ) DoSomething(); DoSomethingElse(); - - or - - if ( this == that ) DoSomething(); - - Note: The first example in "Instead of" will execute - in a manner other than that which the developer desired (per - indentation). Using code braces would have prevented this - "feature". The "explanation" and "exception" from the point - above also applies. - - - - - - Do not belabor/blow-up boolean - expressions - - Example: - -structure->flag = ( condition ); - - Instead of: - - if ( condition ) { structure->flag = 1; } else { - structure->flag = 0; } - - Note: The former is readable and consice. The later - is wordy and inefficient. Please assume that any developer new - to the project has at least a "good" knowledge of C/C++. (Hope - I do not offend by that last comment ... 8-) - - - - - - Use white space freely because it is - free - - Explanation: - - Make it readable. The notable exception to using white space - freely is listed in the next guideline. - - Example: - -int firstValue = 0; -int someValue = 0; -int anotherValue = 0; -int thisVariable = 0; - -if ( thisVariable == thatVariable ) - -firstValue = oldValue + ( ( someValue - anotherValue ) - whatever ) - - - - - Don't use white space around structure - operators - - Explanation: - - - structure pointer operator ( "->" ) - member operator ( - "." ) - functions and parentheses - - It is a general coding practice to put pointers, references, - and function parentheses next to names. With spaces, the - connection between the object and variable/function name is not - as clear. - - Example: - -aStruct->aMember; -aStruct.aMember; -FunctionName(); - - Instead of: aStruct -> aMember; aStruct . aMember; - FunctionName (); - - - - - - Make the last brace of a function stand - out - - Example: - -int function1( ... ) -{ - ...code... - return( retCode ); - -} /* -END- function1 */ - - -int function2( ... ) -{ -} /* -END- function2 */ - - - Instead of: - - int function1( ... ) { ...code... return( retCode ); } int - function2( ... ) { } - - Note: Use 1 blank line before the closing brace and 2 - lines afterwards. This makes the end of function standout to - the most casual viewer. Although function comments help - seperate functions, this is still a good coding practice. In - fact, I follow these rules when using blocks in "for", "while", - "do" loops, and long if {} statements too. After all whitespace - is free! - - Status: developer-discrection on the number of blank - lines. Enforced is the end of function comments. - - - - - - Use 3 character indentions - - Explanation: - - If some use 8 character TABs and some use 3 character TABs, - the code can look *very* ragged. So use 3 character indentions - only. If you like to use TABs, pass your code through a filter - such as "expand -t3" before checking in your code. - - Example: - -static const char * const url_code_map[256] = -{ - NULL, ... -}; - - -int function1( ... ) -{ - if ( 1 ) - { - return( ALWAYS_TRUE ); - } - else - { - return( HOW_DID_YOU_GET_HERE ); - } - - return( NEVER_GETS_HERE ); - -} - - - - - - - Initializing - - - - Initialize all variables - - Explanation: - - Do not assume that the variables declared will not be used - until after they have been assigned a value somewhere else in - the code. Remove the chance of accidentally using an unassigned - variable. - - Example: - -short anShort = 0; -float aFloat = 0; -struct *ptr = NULL; - - Note: It is much easier to debug a SIGSEGV if the - message says you are trying to access memory address 00000000 - and not 129FA012; or arrayPtr[20] causes a SIGSEV vs. - arrayPtr[0]. - - Status: developer-discrection if and only if the - variable is assigned a value "shortly after" declaration. - - - - - - Functions - - - - Name functions that return a boolean as a - question. - - Explanation: - - Value should be phrased as a question that would logically - be answered as a true or false statement - - Example: - -ShouldWeBlockThis(); -ContainsAnImage(); -IsWebPageBlank(); - - - - - Always specify a return type for a - function. - - Explanation: - - The default return for a function is an int. To avoid - ambiguity, create a return for a function when the return has a - purpose, and create a void return type if the function does not - need to return anything. - - - - - - Minimize function calls when iterating by - using variables - - Explanation: - - It is easy to write the following code, and a clear argument - can be made that the code is easy to understand: - - Example: - -for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ ) -{ - .... -} - - Note: Unfortunately, this makes a function call for - each and every iteration. This increases the overhead in the - program, because the compiler has to look up the function each - time, call it, and return a value. Depending on what occurs in - the blockListLength() call, it might even be creating and - destroying structures with each iteration, even though in each - case it is comparing "cnt" to the same value, over and over. - Remember too - even a call to blockListLength() is a function - call, with the same overhead. - - Instead of using a function call during the iterations, - assign the value to a variable, and evaluate using the - variable. - - Example: - -size_t len = blockListLength(); - -for ( size_t cnt = 0; cnt < len; cnt ++ ) -{ - .... -} - - Exceptions: if the value of blockListLength() *may* - change or could *potentially* change, then you must code the - function call in the for/while loop. - - - - - - Pass and Return by Const Reference - - Explanation: - - This allows a developer to define a const pointer and call - your function. If your function does not have the const - keyword, we may not be able to use your function. Consider - strcmp, if it were defined as: extern int strcmp( char *s1, - char *s2 ); - - I could then not use it to compare argv's in main: int main( - int argc, const char *argv[] ) { strcmp( argv[0], "privoxy" - ); } - - Both these pointers are *const*! If the c runtime library - maintainers do it, we should too. - - - - - - Pass and Return by Value - - Explanation: - - Most structures cannot fit onto a normal stack entry (i.e. - they are not 4 bytes or less). Aka, a function declaration - like: int load_aclfile( struct client_state csp ) - - would not work. So, to be consistent, we should declare all - prototypes with "pass by value": int load_aclfile( struct - client_state *csp ) - - - - - - 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. - - - - - - 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 */ - - - - - 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 */ - - - - - Where Possible, Use Forward Struct - Declaration Instead of Includes - - Explanation: - - Useful in headers that include pointers to other struct's. - Modifications to excess header files may cause needless - compiles. - - Example: - -/********************************************************************* - * We're avoiding an include statement here! - *********************************************************************/ -struct file_list; -extern file_list *xyz; - - Note: If you declare "file_list xyz;" (without the - pointer), then including the proper header file is necessary. - If you only want to prototype a pointer, however, the header - file is unneccessary. - - Status: Use with discrection. - - - - - - General Coding Practices - - - - 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. - - - - - - Provide a default case for all switch - statements - - Explanation: - - What you think is guaranteed is never really guaranteed. The - value that you don't think you need to check is the one that - someday will be passed. So, to protect yourself from the - unknown, always have a default step in a switch statement. - - Example: - -switch( hash_string( cmd ) ) -{ - case hash_actions_file : - ... code ... - break; - - case hash_confdir : - ... code ... - break; - - default : - log_error( ... ); - ... anomly code goes here ... - continue; / break; / exit( 1 ); / etc ... - -} /* end switch( hash_string( cmd ) ) */ - - Note: If you already have a default condition, you - are obviously exempt from this point. Of note, most of the - WIN32 code calls `DefWindowProc' after the switch statement. - This API call *should* be included in a default statement. - - Another Note: This is not so much a readability issue - as a robust programming issue. The "anomly code goes here" may - be no more than a print to the STDERR stream (as in - load_config). Or it may really be an ABEND condition. - - Status: Programmer discretion is advised. - - - - - - Try to avoid falling through cases in a - switch statement. - - Explanation: - - In general, you will want to have a 'break' statement within - each 'case' of a switch statement. This allows for the code to - be more readable and understandable, and furthermore can - prevent unwanted surprises if someone else later gets creative - and moves the code around. - - The language allows you to plan the fall through from one - case statement to another simply by omitting the break - statement within the case statement. This feature does have - benefits, but should only be used in rare cases. In general, - use a break statement for each case statement. - - If you choose to allow fall through, you should comment both - the fact of the fall through and reason why you felt it was - necessary. - - - - - - Use 'long' or 'short' Instead of - 'int' - - Explanation: - - On 32-bit platforms, int usually has the range of long. On - 16-bit platforms, int has the range of short. - - Status: open-to-debate. In the case of most FSF - projects (including X/GNU-Emacs), there are typedefs to int4, - int8, int16, (or equivalence ... I forget the exact typedefs - now). Should we add these to IJB now that we have a "configure" - script? - - - - - - 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. - - - - - - Declare each variable and struct on its - own line. - - Explanation: - - It can be tempting to declare a series of variables all on - one line. Don't. - - Example: - -long a = 0; -long b = 0; -long c = 0; - - Instead of: - - long a, b, c; - - Explanation: - there is more room for comments on the - individual variables - easier to add new variables without - messing up the original ones - when searching on a variable to - find its type, there is less clutter to "visually" - eliminate - - Exceptions: when you want to declare a bunch of loop - variables or other trivial variables; feel free to declare them - on 1 line. You should, although, provide a good comment on - their functions. - - Status: developer-discrection. - - - - - - Use malloc/zalloc sparingly - - Explanation: - - Create a local stuct (on the stack) if the variable will - live and die within the context of one function call. - - Only "malloc" a struct (on the heap) if the variable's life - will extend beyond the context of one function call. - - Example: - -If a function creates a struct and stores a pointer to it in a -list, then it should definately be allocated via `malloc'. - - - - - The Programmer Who Uses 'malloc' is - Responsible for Ensuring 'free' - - Explanation: - - If you have to "malloc" an instance, you are responsible for - insuring that the instance is `free'd, even if the deallocation - event falls within some other programmer's code. You are also - responsible for ensuring that deletion is timely (i.e. not too - soon, not too late). This is known as "low-coupling" and is a - "good thing (tm)". You may need to offer a - free/unload/destuctor type function to accomodate this. - - Example: - -int load_re_filterfile( struct client_state *csp ) { ... } -static void unload_re_filterfile( void *f ) { ... } - - Exceptions: - - The developer cannot be expected to provide `free'ing - functions for C run-time library functions ... such as - `strdup'. - - Status: developer-discrection. The "main" use of this - standard is for allocating and freeing data structures (complex - or nested). - - - - - - Add loaders to the `file_list' structure - and in order - - Explanation: - - I have ordered all of the "blocker" file code to be in alpha - order. It is easier to add/read new blockers when you expect a - certain order. - - Note: It may appear that the alpha order is broken in - places by POPUP tests coming before PCRS tests. But since - POPUPs can also be referred to as KILLPOPUPs, it is clear that - it should come first. - - - - - - "Uncertain" new code and/or changes to - exitinst code, use FIXME - - Explanation: - - If you have enough confidence in new code or confidence in - your changes, but are not *quite* sure of the reprocussions, - add this: - - /* FIXME: this code has a logic error on platform XYZ, * - attempthing to fix */ #ifdef PLATFORM ...changed code here... - #endif - - or: - - /* FIXME: I think the original author really meant this... - */ ...changed code here... - - or: - - /* FIXME: new code that *may* break something else... */ - ...new code here... - - Note: If you make it clear that this may or may not - be a "good thing (tm)", it will be easier to identify and - include in the project (or conversly exclude from the - project). - - - - - - - Addendum: Template for files and function - comment blocks: - - Example for file comments: - -const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 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.12 2002/03/27 01:02:51 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. - - - - - - - Version Control Guidelines - To be filled. note on cvs comments. don't comment what you did, comment -why you did it. - - - - - Testing Guidelines - To be filled. - - - - Testplan for releases - -Explain release numbers. major, minor. developer releases. etc. - - - -Remove any existing rpm with rpm -e - - -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* - - - -Install the rpm. Any error messages? - - start,stop,status Privoxy with the specific script - (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does - autostart work? - Start browsing. Does Privoxy work? Logfile written? - Remove the rpm. Any error messages? All files removed? - - - - - - Test reports - -Please submit test reports only with the 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). - - - - - - - Contact the developers - Please see the user manual for information on how to contact the developers. - - - - - Copyright and History - Please see the user manual for information on Copyright and History. - - - - - See also - Please see the user manual for information on references. - - - - - -
    diff --git a/doc/source/faq.sgml b/doc/source/faq.sgml deleted file mode 100644 index bbbf493e..00000000 --- a/doc/source/faq.sgml +++ /dev/null @@ -1,1431 +0,0 @@ - - - -
    - -Privoxy Frequently Asked Questions - -$Id: faq.sgml,v 1.31 2002/03/26 22:29:55 swa Exp $ - - - - - By: Privoxy Developers - - - - - - - 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 http://www.privoxy.org/faq/. -Please see the Contact section in the -user-manual if you want to contact the developers. - - - - - - - - - - - - - - -Frequently Asked Questions - - - -General Information - -What is this new version of <application>Privoxy</application>? - - The original Internet Junkbuster (tm) is a - copyrighted product of Junkbusters - Corporation. Development of this effort stopped some time ago as of - version 2.0.2. Stefan Waldherr started the ijbswa project on 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. - - - - - - -Why <quote>Privoxy</quote>? 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 - 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. - - - - - -How does it differ from the old <application>Junkbuster?</application> - - 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. - - - - -What are some of the new features? - - - - - - - Integrated browser based configuration and control utility (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. - - - - - - - - -What is a <quote>proxy</quote>? How does -<application>Privoxy</application> 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. - - - - -My browser does the same things as -<application>Privoxy</application>. Why should I use -<application>Privoxy</application> 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. - - - - - - -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 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! - - - - -I would like to help you, what do I do? - -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. - - - -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. - - - - - - - - - - -Installation - - -Which browsers are supported by <application>Privoxy</application>? - - 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. - - - - -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. - - - - -Can I install - <application>Privoxy</application> over <application>Junkbuster</application>? - - 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 user-manual for - platform specific installation instructions. [FIXME: This is meant for after - the name change for 3.0!] - - - - - -I just installed <application>Privoxy</application>. 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. - - - - - - -What is the proxy address of <application>Privoxy</application>? - - 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. - - - - -I just installed <application>Privoxy</application>, 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: - 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. - - - - - - - - - - -Configuration - -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. - - - - -What is an <quote>actions</quote> 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). - - - - - -The <quote>actions</quote>concept confuses me. Please list -some of these <quote>actions</quote>. - - These are all explained in the - user-manual. - Please refer to that. - - - - - -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 http://p.p/, - and then select - "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 - user-manual for a - detailed explanation of these and other configuration files, and their - various options and syntax. - - - - - - - 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. - - -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 - ? - - - - - - - -
    -
    -
    - - 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. - - - - - -What is a <quote>default.filter</quote>? - - 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. - - - - - -How can I set up <application>Privoxy</application> 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. - - - - - - -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 http://p.p/. Or by hand editing the appropriate - actions file. This will only effect what is defined as images - though. - - - - - - - -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. - - - - - -I see large red banners on some pages that say -<quote>Blocked</quote>. 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. - - - - - -How can I make <application>Privoxy</application> work with other -proxies like <application>Squid</application>? - - This can be done. See the user manual, - which describes how to do this. - - - - - -
    - - - -Miscellaneous - - -How much does <application>Privoxy</application> 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. - - - - - - -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. - - - - -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). - - - - - -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. - - - -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. - - - -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 multiproxy.org and many -more through Google. - - - - - - - - - - - - -Can <application>Privoxy</application> 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! - - - - - -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. - - - - - - - -Can <application>Privoxy</application> act as a <quote>caching</quote> proxy to -speed up web browsing? - - No, it does not have this ability at all. You want something like - Squid for this. And, yes, - before you ask, Privoxy can co-exist - with other kinds of proxies like Squid. - - - - -What about as a firewall? Can <application>Privoxy</application> 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. - - - - - - - - - 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]. - - - - - -I have large empty spaces now where ads used to be. -Why does <application>Privoxy</application> 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. - - - - - -How can <application>Privoxy</application> 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. - - - - - - -<application>Privoxy</application> runs as a <quote>server</quote>. 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. - - - - - -How can I temporarily disable <application>Privoxy</application>? - - The easiest way is to access Privoxy with your - browser by using the special URL: http://p.p/ - and select "Toggle Privoxy on or off" from that page. - - - - - - - - - - -Troubleshooting - - -I just upgraded and am getting <quote>connection refused</quote> -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. - - - - - -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 http://www.privoxy.org/config/show-url-info - and see if any actions match your new rule. - - - - - -One of my favorite sites does not work with <application>Privoxy</application>. -What can I do? - - - First verify that it is indeed a Privoxy problem, - by disabling Privoxy filtering and blocking. - Go to 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 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 user-manual - appendix. - - - - - Alternately, if you are comfortable with a text editor, you can accomplish - the same thing by editing the appropriate actions file. - - - - - -What time is it? - - Time for you to go! - - - - - -
    - - - - - - - - -Copyright and History -Please see the user manual for information on Copyright and History. - - - - -See also -Please see the user manual for information on references. - - - - - - -
    diff --git a/doc/source/ldp.dsl b/doc/source/ldp.dsl deleted file mode 100644 index e4352a5a..00000000 --- a/doc/source/ldp.dsl +++ /dev/null @@ -1,172 +0,0 @@ - - - -]]> - - -]]> -]> - - - - - - - - -;; ============================== -;; customize the print stylesheet -;; ============================== - - - - - - - - - - -;; this is necessary because right now jadetex does not understand -;; symbolic entities, whereas things work well with numeric entities. -(declare-characteristic preserve-sdata? - "UNREGISTERED::James Clark//Characteristic::preserve-sdata?" - #f) - -;; put the legal notice in a separate file -(define %generate-legalnotice-link% - #t) - -;; use graphics in admonitions, and have their path be "stylesheet-images" -;; NO: they do not yet look very good -(define %admon-graphics-path% - "./stylesheet-images/") - -(define %admon-graphics% - #f) - -(define %funcsynopsis-decoration% - ;; make funcsynopsis look pretty - #t) - -(define %html-ext% - ".html") - -(define %generate-article-toc% - ;; Should a Table of Contents be produced for Articles? - ;; If true, a Table of Contents will be generated for each 'Article'. - #t) - -(define %root-filename% - ;; The filename of the root HTML document (e.g, "index"). - "index") - -(define %generate-part-toc% - #t) - -(define %shade-verbatim% - #t) - -(define %use-id-as-filename% - ;; Use ID attributes as name for component HTML files? - #t) - -(define %graphic-default-extension% - "gif") - -(define %section-autolabel% - ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.) - #t) - -;; HB changed TOC depth to 3 levels. -(define (toc-depth nd) - 3) - -;; HB added 03/20/02, see dbparam.dsl ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(define %body-attr% - ;; REFENTRY body-attr - ;; PURP What attributes should be hung off of BODY? - ;; DESC - ;; A list of the the BODY attributes that should be generated. - ;; The format is a list of lists, each interior list contains the - ;; name and value of a BODY attribute. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - (list - (list "BGCOLOR" "#EEEEEE") - (list "TEXT" "#000000") - (list "LINK" "#0000FF") - (list "VLINK" "#840084") - (list "ALINK" "#0000FF"))) - -(define %stylesheet% - ;; REFENTRY stylesheet - ;; PURP Name of the stylesheet to use - ;; DESC - ;; The name of the stylesheet to place in the HTML LINK TAG, or '#f' to - ;; suppress the stylesheet LINK. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - "../p_doc.css") - -(define %stylesheet-type% - ;; REFENTRY stylesheet-type - ;; PURP The type of the stylesheet to use - ;; DESC - ;; The type of the stylesheet to place in the HTML LINK TAG. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - "text/css") - -(define %css-liststyle-alist% - ;; REFENTRY css-liststyle-alist - ;; PURP Map DocBook OVERRIDE and MARK attributes to CSS - ;; DESC - ;; If '%css-decoration%' is turned on then the list-style-type property of - ;; list items will be set to reflect the list item style selected in the - ;; DocBook instance. This associative list maps the style type names used - ;; in your instance to the appropriate CSS names. If no mapping exists, - ;; the name from the instance will be used. - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - '(("bullet" "disc") - ("box" "square"))) - -(define %css-decoration% - ;; REFENTRY css-decoration - ;; PURP Enable CSS decoration of elements - ;; DESC - ;; If '%css-decoration%' is turned on then HTML elements produced by the - ;; stylesheet may be decorated with STYLE attributes. For example, the - ;; LI tags produced for list items may include a fragment of CSS in the - ;; STYLE attribute which sets the CSS property "list-style-type". - ;; /DESC - ;; AUTHOR N/A - ;; /REFENTRY - #t) - - - - - - - - diff --git a/doc/source/user-manual.sgml b/doc/source/user-manual.sgml deleted file mode 100644 index 1e9723e1..00000000 --- a/doc/source/user-manual.sgml +++ /dev/null @@ -1,4197 +0,0 @@ - - - - - -
    - -Privoxy User Manual - -$Id: user-manual.sgml,v 1.59 2002/03/27 00:54:33 hal9 Exp $ - - - - - By: Privoxy Developers - - - - - - - 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 http://www.privoxy.org/user-manual/. - - - - - - - - - - - - -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! - - - - - -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 (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. - - - - - - - - - - - - - - -Installation - - Privoxy is available as raw source code, or - pre-compiled binaries. See the Privoxy Home Page - for binaries and current release info. Privoxy - is also available via 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. - - - -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 current - 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. - - - - - - -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/. - - - - - -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/. - - - - - - -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 os2setup - - 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. - - - - - - -Windows -Click-click. (I need help on this. Not a clue here. Also for -configuration section below. HB.) - - - - -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 http://www.gnu.org. - The rest should be the same as above for Linux/Unix. - - - - - - - - - - -<application>Privoxy</application> 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. - - - - - - - -Controlling <application>Privoxy</application> with Your Web Browser - - Privoxy can be reached by the special - URL http://p.p/ (or alternately - 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. - - - - - - - - - - - - - -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 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. - - - - - - - -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. - - - - - - -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 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 - - - - - - - - - - - - - - -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 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 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-toggleto - 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 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 - - - - - - - - - - - - - -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 requests 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. - - - - - - - - - - -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 - - - - - - - - - - - - - -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 - - - - - - - - - - - - - -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 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 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. - - - - - - -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 http://www.perldoc.com/perl5.6/pod/perlre.html) - for details. A brief discussion of regular expressions is in the - 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. - - - - - - - - - - - -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 +blocked, - 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 Appendix - for a brief example on troubleshooting actions. - - - -
    - - - - - - -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-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. - - - - - - - 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 - - - - - - -
    - - - - - - -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 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 - - - - - - - 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>BINGO!</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 - - - - - - - - - - - - - - -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. - - - - -
    - - - - - - -Quickstart to Using <application>Privoxy</application> - - 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 - 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). - - - - - - - -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. - - - - - - - - - - - - - - - - -Contacting the Developers, Bug Reporting and Feature -Requests - -We value your feedback. However, to provide you with the best support, -please note: - - - - Use the Sourceforge support forum to get - help. - - Submit bugs only thru our 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 Sourceforge feature request forum. - - - - - - - -For any other issues, feel free to use the mailing lists. - - - - Anyone interested in actively participating in development and related - discussions can join the appropriate mailing list - here. - Archives are available here too. - - - - - - -Copyright and History - - -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 the Free Software Foundation, - Inc, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - - - - - - - - - -History - - Privoxy is derived from - the Internet Junkbuster, with many - improvments and enhancements over the original. - - - - Junkbuster was originally written by Anonymous - Coders and Junkbuster's - Corporation, and was released as free open-source software under the - GNU GPL. Stefan - Waldherr made many improvements, and started the 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 ;-). - - - - - - - -See also - - - - -   http://sourceforge.net/projects/ijbswa - - - - -   http://www.privoxy.org/ - - - - -   http://p.p/ - - - - -   http://www.junkbusters.com/ht/en/cookies.html - - - - -   http://www.waldherr.org/junkbuster/ - - - - -   http://privacy.net/analyze/ - - - - -  http://www.squid-cache.org/ - - - - - - - - - -Appendix - - - - -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: - http://www.perldoc.com/perl5.6/pod/perlre.html - - - - - - - - - -<application>Privoxy</application>'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: - -
    - - http://www.privoxy.org/config/ - -
    - - Alternately, this may be reached at http://p.p/, but this - variation may not work as reliably as the above in some configurations. - -
    - - - - Show information about the current configuration: - -
    - - http://www.privoxy.org/config/show-status - -
    -
    - - - - Show the source code version numbers: - -
    - - http://www.privoxy.org/config/show-version - -
    -
    - - - - Show the client's request headers: - -
    - - http://www.privoxy.org/config/show-request - -
    -
    - - - - Show which actions apply to a URL and why: - -
    - - http://www.privoxy.org/config/show-url-info - -
    -
    - - - - Toggle Privoxy on or off: - -
    - - http://www.privoxy.org/config/toggle - -
    - - Short cuts. Turn off, then on: - -
    - - http://www.privoxy.org/config/toggle?set=disable - -
    -
    - - http://www.privoxy.org/config/toggle?set=enable - -
    -
    - - - - Edit the actions list file: - -
    - - http://www.privoxy.org/config/edit-actions - -
    -
    - -
    -
    - - - These may be bookmarked for quick reference. - - - -
    - - - - -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 - 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, 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 - - - - - - -
    - - - -
    diff --git a/doc/text/developer-manual.txt b/doc/text/developer-manual.txt deleted file mode 100644 index e0a86856..00000000 --- a/doc/text/developer-manual.txt +++ /dev/null @@ -1,1315 +0,0 @@ - -Privoxy Developer Manual - - By: Privoxy Developers - - $Id: developer-manual.sgml,v 1.13 2002/03/27 01:16:41 hal9 Exp $ - - The developer manual gives the users information on how to help the - developer team. It provides guidance on coding, testing, documentation - and other issues. - - Privoxy is a web proxy with advanced filtering capabilities for - protecting privacy, filtering web page content, managing cookies, - controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very flexible configuration and - can be customized to suit individual needs and tastes. Privoxy has - application for both stand-alone systems and multi-user networks. - - Privoxy is based on the code of the Internet Junkbuster. Junkbuster - was originally written by JunkBusters Corporation, and was released as - free open-source software under the GNU GPL. Stefan Waldherr made many - improvements, and started the SourceForge project to continue - development. Other developers have since joined Stefan. - - You can find the latest version of the user manual at - [1]http://www.privoxy.org/developer-manual/. Please see the Contact - section in the user-manual if you want to contact the developers. - _________________________________________________________________ - - Table of Contents - 1. [2]Introduction - 2. [3]Quickstart to Privoxy Development - 3. [4]Documentation Guidelines - 4. [5]Coding Guidelines - - 4.1. [6]Introduction - 4.2. [7]Using Comments - - 4.2.1. [8]Comment, Comment, Comment - 4.2.2. [9]Use blocks for comments - 4.2.3. [10]Keep Comments on their own line - 4.2.4. [11]Comment each logical step - 4.2.5. [12]Comment All Functions Thoroughly - 4.2.6. [13]Comment at the end of braces if the content is - more than one screen length - - 4.3. [14]Naming Conventions - - 4.3.1. [15]Variable Names - 4.3.2. [16]Function Names - 4.3.3. [17]Header file prototypes - 4.3.4. [18]Enumerations, and #defines - 4.3.5. [19]Constants - - 4.4. [20]Using Space - - 4.4.1. [21]Put braces on a line by themselves. - 4.4.2. [22]ALL control statements should have a block - 4.4.3. [23]Do not belabor/blow-up boolean expressions - 4.4.4. [24]Use white space freely because it is free - 4.4.5. [25]Don't use white space around structure operators - 4.4.6. [26]Make the last brace of a function stand out - 4.4.7. [27]Use 3 character indentions - - 4.5. [28]Initializing - - 4.5.1. [29]Initialize all variables - - 4.6. [30]Functions - - 4.6.1. [31]Name functions that return a boolean as a - question. - - 4.6.2. [32]Always specify a return type for a function. - 4.6.3. [33]Minimize function calls when iterating by using - variables - - 4.6.4. [34]Pass and Return by Const Reference - 4.6.5. [35]Pass and Return by Value - 4.6.6. [36]Names of include files - 4.6.7. [37]Provide multiple inclusion protection - 4.6.8. [38]Use `extern "C"` when appropriate - 4.6.9. [39]Where Possible, Use Forward Struct Declaration - Instead of Includes - - 4.7. [40]General Coding Practices - - 4.7.1. [41]Turn on warnings - 4.7.2. [42]Provide a default case for all switch statements - 4.7.3. [43]Try to avoid falling through cases in a switch - statement. - - 4.7.4. [44]Use 'long' or 'short' Instead of 'int' - 4.7.5. [45]Don't mix size_t and other types - 4.7.6. [46]Declare each variable and struct on its own - line. - - 4.7.7. [47]Use malloc/zalloc sparingly - 4.7.8. [48]The Programmer Who Uses 'malloc' is Responsible - for Ensuring 'free' - - 4.7.9. [49]Add loaders to the `file_list' structure and in - order - - 4.7.10. [50]"Uncertain" new code and/or changes to exitinst - code, use FIXME - - 4.8. [51]Addendum: Template for files and function comment - blocks: - - 5. [52]Version Control Guidelines - 6. [53]Testing Guidelines - - 6.1. [54]Testplan for releases - 6.2. [55]Test reports - - 7. [56]Contact the developers - 8. [57]Copyright and History - 9. [58]See also - -1. Introduction - - To be filled. - _________________________________________________________________ - -2. Quickstart to Privoxy Development - - You'll need an account on Sourceforge to support our development. Mail - you ID to the list and wait until a project manager has added you. For - the time beeing (read, this section is under construction), please - note the following guidelines for changing stuff in the code. If it is - - 1. A bugfix / clean-up / cosmetic thing: shoot - 2. A new feature that can be turned off: shoot - 3. A clear improvement w/o side effects on other parts of the code: - shoot - 4. A matter of taste: ask the list - 5. A major redesign of some part of the code: ask the list - _________________________________________________________________ - -3. Documentation Guidelines - - All docs are in SGML format and located in the doc/source directory. - - How do you update the webserver (i.e. the pages on sourceforge)? - - 1. Run make dok (which uses the documents in doc/source to update all - text files in doc/text and to update all web documents in - doc/webserver. - 2. Run make webserver which copies all files from doc/webserver to - the sourceforge webserver via scp. - _________________________________________________________________ - -4. Coding Guidelines - -4.1. Introduction - - This set of standards is designed to make our lives easier. It is - developed with the simple goal of helping us keep the "new and - improved Privoxy" consistent and reliable. Thus making maintenance - easier and increasing chances of success of the project. - - And that of course comes back to us as individuals. If we can increase - our development and product efficiencies then we can solve more of the - request for changes/improvements and in general feel good about - ourselves. ;-> - _________________________________________________________________ - -4.2. Using Comments - -4.2.1. Comment, Comment, Comment - - Explanation: - - Comment as much as possible without commenting the obvious. For - example do not comment "aVariable is equal to bVariable". Instead - explain why aVariable should be equal to the bVariable. Just because a - person can read code does not mean they will understand why or what is - being done. A reader may spend a lot more time figuring out what is - going on when a simple comment or explanation would have prevented the - extra research. Please help your brother IJB'ers out! - - The comments will also help justify the intent of the code. If the - comment describes something different than what the code is doing then - maybe a programming error is occurring. - - Example: -/* if page size greater than 1k ... */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -/* if page size is small, send it in blocks */ -if ( PageLength() > 1024 ) -{ - ... "block" the page up ... -} - -This demonstrates 2 cases of "what not to do". The first is a -"syntax comment". The second is a comment that does not fit what -is actually being done. - _________________________________________________________________ - -4.2.2. Use blocks for comments - - Explanation: - - Comments can help or they can clutter. They help when they are - differentiated from the code they describe. One line comments do not - offer effective separation between the comment and the code. Block - identifiers do, by surrounding the code with a clear, definable - pattern. - - Example: -/********************************************************************* - * This will stand out clearly in your code! - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -/* unfortunately, this may not */ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - - -if ( thisVariable == thatVariable ) /* this may not either */ -{ - DoSomethingVeryImportant(); -} - - Exception: - - If you are trying to add a small logic comment and do not wish to - "disrubt" the flow of the code, feel free to use a 1 line comment - which is NOT on the same line as the code. - _________________________________________________________________ - -4.2.3. Keep Comments on their own line - - Explanation: - - It goes back to the question of readability. If the comment is on the - same line as the code it will be harder to read than the comment that - is on its own line. - - There are three exceptions to this rule, which should be violated - freely and often: during the definition of variables, at the end of - closing braces, when used to comment parameters. - - Example: -/********************************************************************* - * This will stand out clearly in your code, - * But the second example won't. - *********************************************************************/ -if ( thisVariable == thatVariable ) -{ - DoSomethingVeryImportant(); -} - -if ( thisVariable == thatVariable ) /*can you see me?*/ -{ - DoSomethingVeryImportant(); /*not easily*/ -} - - -/********************************************************************* - * But, the encouraged exceptions: - *********************************************************************/ -int urls_read = 0; /* # of urls read + rejected */ -int urls_rejected = 0; /* # of urls rejected */ - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); -} - - -short DoSomethingVeryImportant( - short firstparam, /* represents something */ - short nextparam /* represents something else */ ) -{ - ...code here... - -} /* -END- DoSomethingVeryImportant */ - _________________________________________________________________ - -4.2.4. Comment each logical step - - Explanation: - - Logical steps should be commented to help others follow the intent of - the written code and comments will make the code more readable. - - If you have 25 lines of code without a comment, you should probably go - back into it to see where you forgot to put one. - - Most "for", "while", "do", etc... loops _probably_ need a comment. - After all, these are usually major logic containers. - _________________________________________________________________ - -4.2.5. Comment All Functions Thoroughly - - Explanation: - - A reader of the code should be able to look at the comments just prior - to the beginning of a function and discern the reason for its - existence and the consequences of using it. The reader should not have - to read through the code to determine if a given function is safe for - a desired use. The proper information thoroughly presented at the - introduction of a function not only saves time for subsequent - maintenance or debugging, it more importantly aids in code reuse by - allowing a user to determine the safety and applicability of any - function for the problem at hand. As a result of such benefits, all - functions should contain the information presented in the addendum - section of this document. - _________________________________________________________________ - -4.2.6. Comment at the end of braces if the content is more than one screen -length - - Explanation: - - Each closing brace should be followed on the same line by a comment - that describes the origination of the brace if the original brace is - off of the screen, or otherwise far away from the closing brace. This - will simplify the debugging, maintenance, and readability of the code. - - As a suggestion , use the following flags to make the comment and its - brace more readable: - - use following a closing brace: } /* -END- if() or while () or etc... - */ - - Example: -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if x is 1 */ - -or: - -if ( 1 == X ) -{ - DoSomethingVeryImportant(); - ...some long list of commands... -} /* -END- if ( 1 == X ) */ - _________________________________________________________________ - -4.3. Naming Conventions - -4.3.1. Variable Names - - Explanation: - - Use all lowercase, and seperate words via an underscore ('_'). Do not - start an identifier with an underscore. (ANSI C reserves these for use - by the compiler and system headers.) Do not use identifiers which are - reserved in ANSI C++. (E.g. template, class, true, false, ...). This - is in case we ever decide to port Privoxy to C++. - - Example: -int ms_iis5_hack = 0; - - Instead of: - -int msiis5hack = 0; int msIis5Hack = 0; - _________________________________________________________________ - -4.3.2. Function Names - - Explanation: - - Use all lowercase, and seperate words via an underscore ('_'). Do not - start an identifier with an underscore. (ANSI C reserves these for use - by the compiler and system headers.) Do not use identifiers which are - reserved in ANSI C++. (E.g. template, class, true, false, ...). This - is in case we ever decide to port Privoxy to C++. - - Example: -int load_some_file( struct client_state *csp ) - - Instead of: - -int loadsomefile( struct client_state *csp ) -int loadSomeFile( struct client_state *csp ) - _________________________________________________________________ - -4.3.3. Header file prototypes - - Explanation: - - Use a descriptive parameter name in the function prototype in header - files. Use the same parameter name in the header file that you use in - the c file. - - Example: -(.h) extern int load_aclfile( struct client_state *csp ); -(.c) int load_aclfile( struct client_state *csp ) - - Instead of: -(.h) extern int load_aclfile( struct client_state * ); or -(.h) extern int load_aclfile(); -(.c) int load_aclfile( struct client_state *csp ) - _________________________________________________________________ - -4.3.4. Enumerations, and #defines - - Explanation: - - Use all capital letters, with underscores between words. Do not start - an identifier with an underscore. (ANSI C reserves these for use by - the compiler and system headers.) - - Example: -(enumeration) : enum Boolean { FALSE, TRUE }; -(#define) : #define DEFAULT_SIZE 100; - - Note: We have a standard naming scheme for #defines that toggle a - feature in the preprocessor: FEATURE_>, where > is a short (preferably - 1 or 2 word) description. - - Example: -#define FEATURE_FORCE 1 - -#ifdef FEATURE_FORCE -#define FORCE_PREFIX blah -#endif /* def FEATURE_FORCE */ - _________________________________________________________________ - -4.3.5. Constants - - Explanation: - - Spell common words out entirely (do not remove vowels). - - Use only widely-known domain acronyms and abbreviations. Capitalize - all letters of an acronym. - - Use underscore (_) to separate adjacent acronyms and abbreviations. - Never terminate a name with an underscore. - - Example: -#define USE_IMAGE_LIST 1 - - Instead of: - -#define USE_IMG_LST 1 or -#define _USE_IMAGE_LIST 1 or -#define USE_IMAGE_LIST_ 1 or -#define use_image_list 1 or -#define UseImageList 1 - _________________________________________________________________ - -4.4. Using Space - -4.4.1. Put braces on a line by themselves. - - Explanation: - - The brace needs to be on a line all by itself, not at the end of the - statement. Curly braces should line up with the construct that they're - associated with. This practice makes it easier to identify the opening - and closing braces for a block. - - Example: -if ( this == that ) -{ - ... -} - - Instead of: - - if ( this == that ) { ... } - - or - - if ( this == that ) { ... } - - Note: In the special case that the if-statement is inside a loop, and - it is trivial, i.e. it tests for a condidtion that is obvious from the - purpose of the block, one-liners as above may optically preserve the - loop structure and make it easier to read. - - Status: developer-discrection. - - Example exception: -while ( more lines are read ) -{ - /* Please document what is/is not a comment line here */ - if ( it's a comment ) continue; - - do_something( line ); -} - _________________________________________________________________ - -4.4.2. ALL control statements should have a block - - Explanation: - - Using braces to make a block will make your code more readable and - less prone to error. All control statements should have a block - defined. - - Example: -if ( this == that ) -{ - DoSomething(); - DoSomethingElse(); -} - - Instead of: - - if ( this == that ) DoSomething(); DoSomethingElse(); - - or - - if ( this == that ) DoSomething(); - - Note: The first example in "Instead of" will execute in a manner other - than that which the developer desired (per indentation). Using code - braces would have prevented this "feature". The "explanation" and - "exception" from the point above also applies. - _________________________________________________________________ - -4.4.3. Do not belabor/blow-up boolean expressions - - Example: -structure->flag = ( condition ); - - Instead of: - - if ( condition ) { structure->flag = 1; } else { structure->flag = 0; - } - - Note: The former is readable and consice. The later is wordy and - inefficient. Please assume that any developer new to the project has - at least a "good" knowledge of C/C++. (Hope I do not offend by that - last comment ... 8-) - _________________________________________________________________ - -4.4.4. Use white space freely because it is free - - Explanation: - - Make it readable. The notable exception to using white space freely is - listed in the next guideline. - - Example: -int firstValue = 0; -int someValue = 0; -int anotherValue = 0; -int thisVariable = 0; - -if ( thisVariable == thatVariable ) - -firstValue = oldValue + ( ( someValue - anotherValue ) - whatever ) - _________________________________________________________________ - -4.4.5. Don't use white space around structure operators - - Explanation: - - - structure pointer operator ( "->" ) - member operator ( "." ) - - functions and parentheses - - It is a general coding practice to put pointers, references, and - function parentheses next to names. With spaces, the connection - between the object and variable/function name is not as clear. - - Example: -aStruct->aMember; -aStruct.aMember; -FunctionName(); - - Instead of: aStruct -> aMember; aStruct . aMember; FunctionName (); - _________________________________________________________________ - -4.4.6. Make the last brace of a function stand out - - Example: -int function1( ... ) -{ - ...code... - return( retCode ); - -} /* -END- function1 */ - - -int function2( ... ) -{ -} /* -END- function2 */ - - Instead of: - - int function1( ... ) { ...code... return( retCode ); } int function2( - ... ) { } - - Note: Use 1 blank line before the closing brace and 2 lines - afterwards. This makes the end of function standout to the most casual - viewer. Although function comments help seperate functions, this is - still a good coding practice. In fact, I follow these rules when using - blocks in "for", "while", "do" loops, and long if {} statements too. - After all whitespace is free! - - Status: developer-discrection on the number of blank lines. Enforced - is the end of function comments. - _________________________________________________________________ - -4.4.7. Use 3 character indentions - - Explanation: - - If some use 8 character TABs and some use 3 character TABs, the code - can look *very* ragged. So use 3 character indentions only. If you - like to use TABs, pass your code through a filter such as "expand -t3" - before checking in your code. - - Example: -static const char * const url_code_map[256] = -{ - NULL, ... -}; - - -int function1( ... ) -{ - if ( 1 ) - { - return( ALWAYS_TRUE ); - } - else - { - return( HOW_DID_YOU_GET_HERE ); - } - - return( NEVER_GETS_HERE ); - -} - _________________________________________________________________ - -4.5. Initializing - -4.5.1. Initialize all variables - - Explanation: - - Do not assume that the variables declared will not be used until after - they have been assigned a value somewhere else in the code. Remove the - chance of accidentally using an unassigned variable. - - Example: -short anShort = 0; -float aFloat = 0; -struct *ptr = NULL; - - Note: It is much easier to debug a SIGSEGV if the message says you are - trying to access memory address 00000000 and not 129FA012; or - arrayPtr[20] causes a SIGSEV vs. arrayPtr[0]. - - Status: developer-discrection if and only if the variable is assigned - a value "shortly after" declaration. - _________________________________________________________________ - -4.6. Functions - -4.6.1. Name functions that return a boolean as a question. - - Explanation: - - Value should be phrased as a question that would logically be answered - as a true or false statement - - Example: -ShouldWeBlockThis(); -ContainsAnImage(); -IsWebPageBlank(); - _________________________________________________________________ - -4.6.2. Always specify a return type for a function. - - Explanation: - - The default return for a function is an int. To avoid ambiguity, - create a return for a function when the return has a purpose, and - create a void return type if the function does not need to return - anything. - _________________________________________________________________ - -4.6.3. Minimize function calls when iterating by using variables - - Explanation: - - It is easy to write the following code, and a clear argument can be - made that the code is easy to understand: - - Example: -for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ ) -{ - .... -} - - Note: Unfortunately, this makes a function call for each and every - iteration. This increases the overhead in the program, because the - compiler has to look up the function each time, call it, and return a - value. Depending on what occurs in the blockListLength() call, it - might even be creating and destroying structures with each iteration, - even though in each case it is comparing "cnt" to the same value, over - and over. Remember too - even a call to blockListLength() is a - function call, with the same overhead. - - Instead of using a function call during the iterations, assign the - value to a variable, and evaluate using the variable. - - Example: -size_t len = blockListLength(); - -for ( size_t cnt = 0; cnt < len; cnt ++ ) -{ - .... -} - - Exceptions: if the value of blockListLength() *may* change or could - *potentially* change, then you must code the function call in the - for/while loop. - _________________________________________________________________ - -4.6.4. Pass and Return by Const Reference - - Explanation: - - This allows a developer to define a const pointer and call your - function. If your function does not have the const keyword, we may not - be able to use your function. Consider strcmp, if it were defined as: - extern int strcmp( char *s1, char *s2 ); - - I could then not use it to compare argv's in main: int main( int argc, - const char *argv[] ) { strcmp( argv[0], "privoxy" ); } - - Both these pointers are *const*! If the c runtime library maintainers - do it, we should too. - _________________________________________________________________ - -4.6.5. Pass and Return by Value - - Explanation: - - Most structures cannot fit onto a normal stack entry (i.e. they are - not 4 bytes or less). Aka, a function declaration like: int - load_aclfile( struct client_state csp ) - - would not work. So, to be consistent, we should declare all prototypes - with "pass by value": int load_aclfile( struct client_state *csp ) - _________________________________________________________________ - -4.6.6. Names of include files - - Explanation: - - Your include statements should contain the file name without a path. - The path should be listed in the Makefile, using -I as processor - directive to search the indicated paths. An exception to this would be - for some proprietary software that utilizes a partial path to - distinguish their header files from system or other header files. - - Example: -#include /* 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 - - Note: Please! do not add "-I." to the Makefile without a _very_ good - reason. This duplicates the #include "file.h" behaviour. - _________________________________________________________________ - -4.6.7. Provide multiple inclusion protection - - Explanation: - - Prevents compiler and linker errors resulting from redefinition of - items. - - Wrap each header file with the following syntax to prevent multiple - inclusions of the file. Of course, replace PROJECT_H with your file - name, with "." Changed to "_", and make it uppercase. - - Example: -#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED - ... -#endif /* ndef PROJECT_H_INCLUDED */ - _________________________________________________________________ - -4.6.8. Use `extern "C"` when appropriate - - Explanation: - - If our headers are included from C++, they must declare our functions - as `extern "C"`. This has no cost in C, but increases the potential - re-usability of our code. - - Example: -#ifdef __cplusplus -extern "C" -{ -#endif /* def __cplusplus */ - -... function definitions here ... - -#ifdef __cplusplus -} -#endif /* def __cplusplus */ - _________________________________________________________________ - -4.6.9. Where Possible, Use Forward Struct Declaration Instead of Includes - - Explanation: - - Useful in headers that include pointers to other struct's. - Modifications to excess header files may cause needless compiles. - - Example: -/********************************************************************* - * We're avoiding an include statement here! - *********************************************************************/ -struct file_list; -extern file_list *xyz; - - Note: If you declare "file_list xyz;" (without the pointer), then - including the proper header file is necessary. If you only want to - prototype a pointer, however, the header file is unneccessary. - - Status: Use with discrection. - _________________________________________________________________ - -4.7. General Coding Practices - -4.7.1. Turn on warnings - - Explanation - - Compiler warnings are meant to help you find bugs. You should turn on - as many as possible. With GCC, the switch is "-Wall". Try and fix as - many warnings as possible. - _________________________________________________________________ - -4.7.2. Provide a default case for all switch statements - - Explanation: - - What you think is guaranteed is never really guaranteed. The value - that you don't think you need to check is the one that someday will be - passed. So, to protect yourself from the unknown, always have a - default step in a switch statement. - - Example: -switch( hash_string( cmd ) ) -{ - case hash_actions_file : - ... code ... - break; - - case hash_confdir : - ... code ... - break; - - default : - log_error( ... ); - ... anomly code goes here ... - continue; / break; / exit( 1 ); / etc ... - -} /* end switch( hash_string( cmd ) ) */ - - Note: If you already have a default condition, you are obviously - exempt from this point. Of note, most of the WIN32 code calls - `DefWindowProc' after the switch statement. This API call *should* be - included in a default statement. - - Another Note: This is not so much a readability issue as a robust - programming issue. The "anomly code goes here" may be no more than a - print to the STDERR stream (as in load_config). Or it may really be an - ABEND condition. - - Status: Programmer discretion is advised. - _________________________________________________________________ - -4.7.3. Try to avoid falling through cases in a switch statement. - - Explanation: - - In general, you will want to have a 'break' statement within each - 'case' of a switch statement. This allows for the code to be more - readable and understandable, and furthermore can prevent unwanted - surprises if someone else later gets creative and moves the code - around. - - The language allows you to plan the fall through from one case - statement to another simply by omitting the break statement within the - case statement. This feature does have benefits, but should only be - used in rare cases. In general, use a break statement for each case - statement. - - If you choose to allow fall through, you should comment both the fact - of the fall through and reason why you felt it was necessary. - _________________________________________________________________ - -4.7.4. Use 'long' or 'short' Instead of 'int' - - Explanation: - - On 32-bit platforms, int usually has the range of long. On 16-bit - platforms, int has the range of short. - - Status: open-to-debate. In the case of most FSF projects (including - X/GNU-Emacs), there are typedefs to int4, int8, int16, (or equivalence - ... I forget the exact typedefs now). Should we add these to IJB now - that we have a "configure" script? - _________________________________________________________________ - -4.7.5. Don't mix size_t and other types - - Explanation: - - The type of size_t varies across platforms. Do not make assumptions - about whether it is signed or unsigned, or about how long it is. Do - not compare a size_t against another variable of a different type (or - even against a constant) without casting one of the values. Try to - avoid using size_t if you can. - _________________________________________________________________ - -4.7.6. Declare each variable and struct on its own line. - - Explanation: - - It can be tempting to declare a series of variables all on one line. - Don't. - - Example: -long a = 0; -long b = 0; -long c = 0; - - Instead of: - - long a, b, c; - - Explanation: - there is more room for comments on the individual - variables - easier to add new variables without messing up the - original ones - when searching on a variable to find its type, there - is less clutter to "visually" eliminate - - Exceptions: when you want to declare a bunch of loop variables or - other trivial variables; feel free to declare them on 1 line. You - should, although, provide a good comment on their functions. - - Status: developer-discrection. - _________________________________________________________________ - -4.7.7. Use malloc/zalloc sparingly - - Explanation: - - Create a local stuct (on the stack) if the variable will live and die - within the context of one function call. - - Only "malloc" a struct (on the heap) if the variable's life will - extend beyond the context of one function call. - - Example: -If a function creates a struct and stores a pointer to it in a -list, then it should definately be allocated via `malloc'. - _________________________________________________________________ - -4.7.8. The Programmer Who Uses 'malloc' is Responsible for Ensuring 'free' - - Explanation: - - If you have to "malloc" an instance, you are responsible for insuring - that the instance is `free'd, even if the deallocation event falls - within some other programmer's code. You are also responsible for - ensuring that deletion is timely (i.e. not too soon, not too late). - This is known as "low-coupling" and is a "good thing (tm)". You may - need to offer a free/unload/destuctor type function to accomodate - this. - - Example: -int load_re_filterfile( struct client_state *csp ) { ... } -static void unload_re_filterfile( void *f ) { ... } - - Exceptions: - - The developer cannot be expected to provide `free'ing functions for C - run-time library functions ... such as `strdup'. - - Status: developer-discrection. The "main" use of this standard is for - allocating and freeing data structures (complex or nested). - _________________________________________________________________ - -4.7.9. Add loaders to the `file_list' structure and in order - - Explanation: - - I have ordered all of the "blocker" file code to be in alpha order. It - is easier to add/read new blockers when you expect a certain order. - - Note: It may appear that the alpha order is broken in places by POPUP - tests coming before PCRS tests. But since POPUPs can also be referred - to as KILLPOPUPs, it is clear that it should come first. - _________________________________________________________________ - -4.7.10. "Uncertain" new code and/or changes to exitinst code, use FIXME - - Explanation: - - If you have enough confidence in new code or confidence in your - changes, but are not *quite* sure of the reprocussions, add this: - - /* FIXME: this code has a logic error on platform XYZ, * attempthing - to fix */ #ifdef PLATFORM ...changed code here... #endif - - or: - - /* FIXME: I think the original author really meant this... */ - ...changed code here... - - or: - - /* FIXME: new code that *may* break something else... */ ...new code - here... - - Note: If you make it clear that this may or may not be a "good thing - (tm)", it will be easier to identify and include in the project (or - conversly exclude from the project). - _________________________________________________________________ - -4.8. Addendum: Template for files and function comment blocks: - - Example for file comments: -const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16 -:41 hal9 Exp $"; -/********************************************************************* - * - * File : $Source$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log$ - * - *********************************************************************/ - - -#include "config.h" - - ...necessary include files for us to do our work... - -const char FILENAME_h_rcs[] = FILENAME_H_VERSION; - - Note: This declares the rcs variables that should be added to the - "show-proxy-args" page. If this is a brand new creation by you, you - are free to change the "Copyright" section to represent the rights you - wish to maintain. - - Note: The formfeed character that is present right after the comment - flower box is handy for (X|GNU)Emacs users to skip the verbige and get - to the heart of the code (via `forward-page' and `backward-page'). - Please include it if you can. - - Example for file header comments: -#ifndef _FILENAME_H -#define _FILENAME_H -#define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16: -41 hal9 Exp $" -/********************************************************************* - * - * File : $Source$ - * - * Purpose : (Fill me in with a good description!) - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log$ - * - *********************************************************************/ - - -#include "project.h" - -#ifdef __cplusplus -extern "C" { -#endif - - ... function headers here ... - - -/* Revision control strings from this header and associated .c file */ -extern const char FILENAME_rcs[]; -extern const char FILENAME_h_rcs[]; - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef _FILENAME_H */ - -/* - Local Variables: - tab-width: 3 - end: -*/ - - Example for function comments: -/********************************************************************* - * - * Function : FUNCTION_NAME - * - * Description : (Fill me in with a good description!) - * - * parameters : - * 1 : param1 = pointer to an important thing - * 2 : x = pointer to something else - * - * Returns : 0 => Ok, everything else is an error. - * - *********************************************************************/ -int FUNCTION_NAME( void *param1, const char *x ) -{ - ... - return( 0 ); - -} - - Note: If we all follow this practice, we should be able to parse our - code to create a "self-documenting" web page. - _________________________________________________________________ - -5. Version Control Guidelines - - To be filled. note on cvs comments. don't comment what you did, - comment why you did it. - _________________________________________________________________ - -6. Testing Guidelines - - To be filled. - _________________________________________________________________ - -6.1. Testplan for releases - - Explain release numbers. major, minor. developer releases. etc. - - 1. Remove any existing rpm with rpm -e - 2. Remove any file that was left over. This includes (but is not - limited to) - + /var/log/privoxy - + /etc/privoxy - + /usr/sbin/privoxy - + /etc/init.d/privoxy - + /usr/doc/privoxy* - 3. Install the rpm. Any error messages? - 4. start,stop,status Privoxy with the specific script (e.g. - /etc/rc.d/init/privoxy stop). Reboot your machine. Does autostart - work? - 5. Start browsing. Does Privoxy work? Logfile written? - 6. Remove the rpm. Any error messages? All files removed? - _________________________________________________________________ - -6.2. Test reports - - Please submit test reports only with the [59]test form at sourceforge. - Three simple steps: - - * Select category: the distribution you test on. - * Select group: the version of Privoxy that we are about to release. - * Fill the Summary and Detailed Description with something - intelligent (keep it short and precise). - - Do not mail to the mailinglist (we cannot keep track on issues there). - _________________________________________________________________ - -7. Contact the developers - - Please see the user manual for information on how to contact the - developers. - _________________________________________________________________ - -8. Copyright and History - - Please see the user manual for information on Copyright and History. - _________________________________________________________________ - -9. See also - - Please see the user manual for information on references. - -References - - 1. http://www.privoxy.org/developer-manual/ - 2. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INTRODUCTION - 3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUICKSTART - 4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DOCUMENTATION - 5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CODING - 6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S1 - 7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S2 - 8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S3 - 9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S4 - 10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S5 - 11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S6 - 12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S7 - 13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S8 - 14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S9 - 15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S10 - 16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S11 - 17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S12 - 18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S13 - 19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S14 - 20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S15 - 21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S16 - 22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S17 - 23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S18 - 24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S19 - 25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S20 - 26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S21 - 27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S22 - 28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S23 - 29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S24 - 30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S25 - 31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S26 - 32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S27 - 33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S28 - 34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S29 - 35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S30 - 36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S31 - 37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S32 - 38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S33 - 39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S34 - 40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S35 - 41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S36 - 42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S37 - 43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S38 - 44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S39 - 45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S40 - 46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S41 - 47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S42 - 48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S43 - 49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S44 - 50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S45 - 51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S46 - 52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CVS - 53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING - 54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-PLAN - 55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-REPORT - 56. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONTACT - 57. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT - 58. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO - 59. http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005 diff --git a/doc/text/faq.txt b/doc/text/faq.txt deleted file mode 100644 index 2e9bfbb9..00000000 --- a/doc/text/faq.txt +++ /dev/null @@ -1,881 +0,0 @@ - -Privoxy Frequently Asked Questions - - By: Privoxy Developers - - $Id: faq.sgml,v 1.32 2002/03/27 00:57:03 hal9 Exp $ - - This FAQ gives users and developers alike answers to frequently asked - questions about Privoxy. - - Privoxy is a web proxy with advanced filtering capabilities for - protecting privacy, filtering web page content, managing cookies, - controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very flexible configuration and - can be customized to suit individual needs and tastes. Privoxy has - application for both stand-alone systems and multi-user networks. - - Privoxy is based on the code of the Internet Junkbuster. Junkbuster - was originally written by JunkBusters Corporation, and was released as - free open-source software under the GNU GPL. Stefan Waldherr made many - improvements, and started the SourceForge project to continue - development. - - You can find the latest version of the document at - [1]http://www.privoxy.org/faq/. Please see the Contact section in the - [2]user-manual if you want to contact the developers. - _________________________________________________________________ - - Table of Contents - 1. [3]Frequently Asked Questions - - 1.1. [4]General Information - - 1.1.1. [5]What is this new version of Privoxy? - 1.1.2. [6]Why "Privoxy"? Why a name change at all? - 1.1.3. [7]How does it differ from the old Junkbuster? - 1.1.4. [8]What are some of the new features? - 1.1.5. [9]What is a "proxy"? How does Privoxy work? - 1.1.6. [10]My browser does the same things as Privoxy. Why - should I use Privoxy at all? - - 1.1.7. [11]Is there is a license or fee? What about a - warranty? Registration? - - 1.1.8. [12]I would like to help you, what do I do? - - 1.2. [13]Installation - - 1.2.1. [14]Which browsers are supported by Privoxy? - 1.2.2. [15]Which operating systems are supported? - 1.2.3. [16]Can I install Privoxy over Junkbuster? - 1.2.4. [17]I just installed Privoxy. Is there anything - special I have to do now? - - 1.2.5. [18]What is the proxy address of Privoxy? - 1.2.6. [19]I just installed Privoxy, and nothing is - happening. All the ads are there. What's wrong? - - 1.3. [20]Configuration - - 1.3.1. [21]Can I use my old config files? - 1.3.2. [22]What is an "actions" file? - 1.3.3. [23]The "actions"concept confuses me. Please list - some of these "actions". - - 1.3.4. [24]How are actions files configured? What is the - easiest way to do this? - - 1.3.5. [25]What are the differences between - intermediate.action, basic.action, etc.? - - 1.3.6. [26]Why can I change the configuration with a - browser? Does that not raise security issues? - - 1.3.7. [27]What is a "default.filter"? - 1.3.8. [28]How can I set up Privoxy to act as a proxy for - my LAN? - - 1.3.9. [29]Instead of ads, now I get a checkerboard - pattern. I don't want to see anything. - - 1.3.10. [30]Why would anybody want to see a checkerboard - pattern? - - 1.3.11. [31]I see large red banners on some pages that say - "Blocked". How do I get rid of this? - - 1.3.12. [32]How can I make Privoxy work with other proxies - like Squid? - - 1.4. [33]Miscellaneous - - 1.4.1. [34]How much does Privoxy slow my browsing down? - This has to add extra time to browsing. - - 1.4.2. [35]I noticed considerable delays in page requests - compared to the old Junkbuster. What's wrong? - - 1.4.3. [36]What is the "http://p.p/"? - 1.4.4. [37]Do you still maintain the blocklists? - 1.4.5. [38]How can I submit new ads? - 1.4.6. [39]How can I hide my IP address? - 1.4.7. [40]Can Privoxy guarantee I am anonymous? - 1.4.8. [41]Might some things break because header - information is being altered? - - 1.4.9. [42]Can Privoxy act as a "caching" proxy to speed up - web browsing? - - 1.4.10. [43]What about as a firewall? Can Privoxy protect - me? - - 1.4.11. [44]The Privoxy logo that replaces ads is very - blocky and ugly looking. Can't a better font be - used? - - 1.4.12. [45]I have large empty spaces now where ads used to - be. Why does Privoxy leave these large gaps? - - 1.4.13. [46]How can Privoxy filter Secure (HTTPS) URLs? - 1.4.14. [47]Privoxy runs as a "server". How secure is it? - Do I need to take any special precautions? - - 1.4.15. [48]How can I temporarily disable Privoxy? - - 1.5. [49]Troubleshooting - - 1.5.1. [50]I just upgraded and am getting "connection - refused" with every web page? - - 1.5.2. [51]I just added a new rule, but the steenkin ad is - still getting through. How? - - 1.5.3. [52]One of my favorite sites does not work with - Privoxy. What can I do? - - 1.5.4. [53]What time is it? - - 2. [54]Copyright and History - 3. [55]See also - -1. Frequently Asked Questions - -1.1. General Information - -1.1.1. What is this new version of Privoxy? - - The original Internet Junkbuster (tm) is a copyrighted product of - [56]Junkbusters Corporation. Development of this effort stopped some - time ago as of version 2.0.2. Stefan Waldherr started the ijbswa - project on [57]Sourceforge to rekindle development. Other developers - subsequently joined with Stefan, and have since added many new - features, refinements and enhancements. - - The new Privoxy started with the same Junkbuster code base, but has - changed significantly at this point. - _________________________________________________________________ - -1.1.2. Why "Privoxy"? Why a name change at all? - - Privoxy is for "Privacy Enhancing Proxy". There are possible legal - complications from the continued use of the Junkbuster name, which is - a trademark of [58]Junkbusters Corporation. (There are no objections - from Junkbusters Corporation to the Privoxy project itself though, and - they in fact still share our ideals and goals.) - - The developers also believed that there so many changes from the - original code, that it was time to make a clean break from the past - and make a name in their own right, especially now with the pending - release of version 3.0. - _________________________________________________________________ - -1.1.3. How does it differ from the old Junkbuster? - - All the old features remain. The new Privoxy still blocks ads and - banners, still manages cookies, and still helps protect your privacy. - But, these are all enhanced, and many new features have been added, - all in the same vein. - - The configuration has changed significantly as well. This is something - that users will notice right off the bat. The "blocklist" file does - not exist any more. This is replaced by "actions" files, such as - default.actions. This is where most of the per site configuration is - now. - _________________________________________________________________ - -1.1.4. What are some of the new features? - - * Integrated browser based configuration and control utility - ([59]http://p.p). Browser-based tracing of rule and filter - effects. - * Blocking of annoying pop-up browser windows. - * HTTP/1.1 compliant (most, but not all 1.1 features are supported). - * Support for Perl Compatible Regular Expressions in the - configuration files, and generally a more sophisticated and - flexible configuration syntax over previous versions. - * GIF de-animation. - * Web page content filtering (removes banners based on size, - invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.) - * Bypass many click-tracking scripts (avoids script redirection). - * Multi-threaded (POSIX and native threads). - * Auto-detection and re-reading of config file changes. - * User-customizable HTML templates (e.g. 404 error page). - * Improved cookie management features (e.g. session based cookies). - * Builds from source on most UNIX-like systems. Packages available - for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac - OSX, OS/2, HP-UX 11 and AmigaOS. - * In addition, the configuration is much more powerful and versatile - over-all. - _________________________________________________________________ - -1.1.5. What is a "proxy"? How does Privoxy work? - - When you connect to a web site with Privoxy, you are really connecting - to your locally running version of Privoxy. Privoxy intercepts your - requests for the web page, and relays that to the "real" web site. The - web site sends the HTTP data stream back to Privoxy, where Privoxy can - work its magic before it relays this data back to your web browser. - - Since Privoxy sits between you and the WWW, it is in a position to - intercept and completely manage all web traffic and HTTP content - before it gets to your browser. Privoxy uses various programming - methods to do this, all of which is under your control via the various - configuration files and options. - - There are many kinds of proxies. Privoxy best fits the "filtering - proxy" category. - _________________________________________________________________ - -1.1.6. My browser does the same things as Privoxy. Why should I use Privoxy -at all? - - Modern browsers do indeed have some of the same functionality as - Privoxy. Maybe this is adequate for you. But Privoxy is much more - versatile and powerful, and can do a number of things that browsers - just can't. - - In addition, a proxy is good choice if you use multiple browsers, or - have a LAN with multiple computers. This way all the configuration is - in one place, and you don't have to maintain a similar configuration - for possibly many browsers. - _________________________________________________________________ - -1.1.7. Is there is a license or fee? What about a warranty? Registration? - - Privoxy is licensed under the GNU General Public License (GPL). It is - free to use, copy, modify or distribute as you wish under the terms of - this license. See [60]http://www.gnu.org/copyleft/gpl.html for - specifics. - - There is no warranty of any kind, expressed, implied or otherwise. - That is something that would cost real money ;-) There is no - registration either. Privoxy really is free in every respect! - _________________________________________________________________ - -1.1.8. I would like to help you, what do I do? - -1.1.8.1. Money Money Money - - We, of course, welcome donations and use the money for domain - registering, regular world-wide get-togethers (hahaha). Anyway, we'll - soon describe the process how to donate money to the team. - _________________________________________________________________ - -1.1.8.2. You want to work with us? - - Well, helping the team is always a good idea. We welcome new - developers, RPM gurus or documentation makers. Simply get an account - on sourceforge.net and mail your id to the developer mailing list. - Then read the section Quickstart in the developers manual. - - Once we have added you to the team, you'll have write access to the - CVS repository, and together we'll find a suitable task for you. - _________________________________________________________________ - -1.2. Installation - -1.2.1. Which browsers are supported by Privoxy? - - Any browser that can be configured to use a "proxy", which is probably - almost all browsers. Direct browser support is not necessary since - Privoxy runs as a separate application and just exchanges standard - HTML data with your browser. - _________________________________________________________________ - -1.2.2. Which operating systems are supported? - - Right now Win32, Mac OSX, OS/2, AmigaOS, Linux, and many flavors of - Unix. - - Source code is available, so porting to other operating systems, is - always a possibility. - _________________________________________________________________ - -1.2.3. Can I install Privoxy over Junkbuster? - - We recommend you uninstall Junkbuster first to minimize conflicts and - confusion. You may want to save your old configuration files for - future reference. The configuration is substantially changed. - - See the [61]user-manual for platform specific installation - instructions. [FIXME: This is meant for after the name change for - 3.0!] - _________________________________________________________________ - -1.2.4. I just installed Privoxy. Is there anything special I have to do now? - - All browsers must be told to use Privoxy as a proxy by specifying the - correct proxy address and port number in the appropriate configuration - area for the browser. See below. - _________________________________________________________________ - -1.2.5. What is the proxy address of Privoxy? - - If you set up the Privoxy to run on the computer you browse from - (rather than your ISP's server or some networked computer on a LAN), - the proxy will be on "localhost" (which is the special name used by - every computer on the Internet to refer to itself) and the port will - be 8118 (unless you have Privoxy to run on a different port with the - listen-address config option). - - When configuring your browser's proxy settings you typically enter the - word "localhost" in the boxes next to "HTTP" and "Secure" (HTTPS) and - then the number "8118" for "port". This tells your browser to send all - web requests to Privoxy instead of directly to the Internet. - - Privoxy can also be used to proxy for a Local Area Network. In this - case, your would enter either the IP address of the LAN host where - Privoxy is running, or the equivalent hostname. Port assignment would - be same as above. - - Privoxy does not currently handle protocols such as FTP, SMTP, IM, - IRC, ICQ, or other Internet protocols. - _________________________________________________________________ - -1.2.6. I just installed Privoxy, and nothing is happening. All the ads are -there. What's wrong? - - Did you configure your browser to use Privoxy as a proxy? It does not - sound like it. See above. You might also try flushing the browser's - caches to force a full re-reading of pages. You can verify that - Privoxy is running, and your browser is correctly configured by - entering the special URL: [62]http://p.p/. This should give you a - banner that says "This is Privoxy" and access to Privoxy's internal - configuration. If you see this, then you are good to go. If not, the - browser or Privoxy are not set up correctly. - _________________________________________________________________ - -1.3. Configuration - -1.3.1. Can I use my old config files? - - There are major changes to Junkbuster configuration from version 2.0.x - to 2.9.x and later. The older files will not work at all. If this is - the case, you will need to re-enter your old data into the new - configuration structure. This is probably also a good recommendation - even if upgrading from 2.9.x to 3.x since there were many minor - changes along the way. - _________________________________________________________________ - -1.3.2. What is an "actions" file? - - "actions" files are where various actions that Privoxy might take, are - configured. Typically, you would define a set of default actions that - apply to all URLs, then add exceptions to these defaults. - - Actions can be defined on a per site basis, or for groups of sites. - Actions can also be grouped together and then applied to one or more - sites. There are many possible actions that might apply to any given - site. As an example, if we are blocking cookies as one of our default - actions, but need to accept cookies from a given site, we would define - this in our "actions" file. - - Privoxy comes with several default actions files, with varying degrees - of filtering and blocking, as starting points for your own - configuration (see below). - _________________________________________________________________ - -1.3.3. The "actions"concept confuses me. Please list some of these -"actions". - - These are all explained in the [63]user-manual. Please refer to that. - _________________________________________________________________ - -1.3.4. How are actions files configured? What is the easiest way to do this? - - The easiest way to do this, is to access Privoxy with your web browser - at [64]http://p.p/, and then select "[65]Edit the actions list" from - the selection list. You can also do this by editing the appropriate - file with a text editor. - - Please see the [66]user-manual for a detailed explanation of these and - other configuration files, and their various options and syntax. - _________________________________________________________________ - -1.3.5. What are the differences between intermediate.action, basic.action, -etc.? - - Configuring Privoxy is not easy. To help you get started, we provide - you with three different default configurations. The following table - shows you, which features are enabled in each configuration. - - Table 1. Default Configurations - Feature default.action basic.action intermediate.action - advanced.action - ad-filtering ? x x x - blank image ? x x x - de-animate GIFs ? x x x - referer forging ? x x x - jon's +no-cookies-keep (i.e. session cookies only) ? x x x - no-popup windows ? x x - fast redirects ? x x - hide-referrer ? x x - hide-useragent ? x x - content-modification ? x - feature-x ? - feature-y ? - feature-z ? - _________________________________________________________________ - -1.3.6. Why can I change the configuration with a browser? Does that not -raise security issues? - - What I don't understand, is how I can browser edit the config file as - a regular user, while the whole /etc/privoxy hierarchy belongs to the - user "privoxy", with only 644 perms. - - When you use the browser-based editor, Privoxy itself is writing to - the config files. Because Privoxy is running as the user "privoxy", it - can update the config files. - - If you don't like this, setting "enable-edit-actions 0" in the config - file will disable the browser-based editor. If you're that paranoid, - you should also consider setting "enable-remote-toggle 0" to prevent - browser-based enabling/disabling of Privoxy. - - Note that normally only local users can connect to Privoxy, so this is - not (normally) a security problem. - _________________________________________________________________ - -1.3.7. What is a "default.filter"? - - The "default.filter" file is used to "filter" any web page content. By - "filtering" we mean it can modify, remove, or change anything on the - page, including HTML tags, and JavaScript. Regular expressions are - used to accomplish this, and operate on a line by line basis. This is - potentially a very powerful feature, but requires some expertise. - - If you are familiar with regular expressions, and HTML, you can look - at the provided default.filter with a text editor and see some of - things it can be used for. - - Presently, there is no GUI editor option for this part of the - configuration, but you can disable/enable various sections of the - included default file with the "Actions List Editor" from your - browser. - _________________________________________________________________ - -1.3.8. How can I set up Privoxy to act as a proxy for my LAN? - - By default, Privoxy only responds to requests from localhost. To have - it act as a server for a network, this needs to be changed in the main - config file where the Privoxy configuration is located. In that file - is a "listen-address" option. It may be commented out with a "#" - symbol. Make sure it is uncommented, and assign it the address of the - LAN gateway interface, and port number to use: - - listen-address 192.168.1.1:8118 - - Save the file, and restart Privoxy. Configure all browsers on the - network then to use this address and port number. - _________________________________________________________________ - -1.3.9. Instead of ads, now I get a checkerboard pattern. I don't want to see -anything. - - This is a configuration option for images that Privoxy is stopping. - You have the choice a checkerboard pattern, a transparent 1x1 GIF - image (aka "blank"), or a custom URL or your choice. - - If you want to see nothing, then change the "+image-blocker" action to - "+image-blocker{blank}". This can be done from the "Edit Actions List" - selection at [67]http://p.p/. Or by hand editing the appropriate - actions file. This will only effect what is defined as "images" - though. - _________________________________________________________________ - -1.3.10. Why would anybody want to see a checkerboard pattern? - - This can be helpful for troubleshooting problems. It might also be - good for anyone new to Privoxy so that they can see if their favorite - pages are displaying correctly, and Privoxy is not inadvertently - removing something important. - _________________________________________________________________ - -1.3.11. I see large red banners on some pages that say "Blocked". How do I -get rid of this? - - These are URLs that match something in one of Privoxy's block actions - (+block). It is meant to be a warning so that you know something has - been blocked and an easy way for you to see why. These are handled - differently than what has been defined as "images" (e.g. ad banners). - If you want them to be treated as if they were images, so that they - can be made invisible, then move the offending URL from the "+block" - section to the "+imageblock" section of your actions file. - Alternately, you could modify the "block" HTML template that is used - by Privoxy to display this, and make it something more to your liking. - _________________________________________________________________ - -1.3.12. How can I make Privoxy work with other proxies like Squid? - - This can be done. See the [68]user manual, which describes how to do - this. - _________________________________________________________________ - -1.4. Miscellaneous - -1.4.1. How much does Privoxy slow my browsing down? This has to add extra -time to browsing. - - It should not slow you down any in real terms, and may actually help - speed things up since ads, banners and other junk are not being - displayed. The actual processing time required by Privoxy itself for - each page, is relatively small in the overall scheme of things, and - happens very quickly. This is typically more than offset by time saved - not downloading and rendering ad images. - - "Filtering" via the filterfile mechanism may cause a perceived - slowdown, since the entire page is buffered before displaying. See - below. - _________________________________________________________________ - -1.4.2. I noticed considerable delays in page requests compared to the old -Junkbuster. What's wrong? - - Using the default filtering configuration, I noticed considerable - delays in page requests compared to the old Junkbuster. Loading pages - with large contents seemed to take forever, then suddenly delivering - all the content at once. - - The whole content must be loaded in order to filter, and nothing is is - sent to the browser during this time. The loading time does not really - change in real numbers, but the feeling is different, because most - browsers are able to start rendering incomplete content, giving the - user a feeling of "it works". - - To modify the content of a page (i.e. make frames resizeable again, - etc.) and not just replace ads, Privoxy needs to download the entire - page first, do its content magic and then send the page to the - browser. - _________________________________________________________________ - -1.4.3. What is the "http://p.p/"? - - Since Privoxy sits between your web browser and the Internet, it can - be programmed to handle certain pages specially. - - With recent versions of Privoxy (version 2.9.x), you can get some - information about Privoxy and change some settings by going to - http://p.p/ or, equivalently, http://www.privoxy.org/config/ (Note - that p.p is far easier to type but may not work in some - configurations). - - These pages are *not* forwarded to a server on the Internet - instead - they are handled by a special web server which is built in to Privoxy. - - If you are not running Privoxy, then http://p.p/ will fail, and - http://www.privoxy.org/config/ will return a web page telling you - you're not running Privoxy. - - If you have version 2.0.2, then the equivalent is - http://example.com/show-proxy-args (but you get far less information, - and you should really consider upgrading to 2.9.x). - _________________________________________________________________ - -1.4.4. Do you still maintain the blocklists? - - No. The format of the blocklists has changed significantly in the - versions 2.9.x. Once we have released the new version, there will - again be blocklists that you can update automatically. - _________________________________________________________________ - -1.4.5. How can I submit new ads? - - As of now, please discontinue to submit new ad blocking infos. Once we - have released the new version, there will again be a form on the - website, which you can use to contribute new ads. - _________________________________________________________________ - -1.4.6. How can I hide my IP address? - - You cannot hide your IP address with Privoxy or any other software, - since the server needs to know your IP address to send the answer to - you. - - Fortunately there are many publicly usable anonymous proxies out - there, which solve the problem by providing a further level of - indirection between you and the web server, shared by many people and - thus letting your requests "drown" in white noise of unrelated - requests as far as user tracking is concerned. - - Most of them will, however, log your IP address and make it available - to the authorities in case you abuse that anonymity for criminal - purposes. In fact you can't even rule out that some of them only exist - to *collect* information on (those suspicious) people with a more than - average preference for privacy. - - You can find a list of anonymous public proxies at [69]multiproxy.org - and many more through Google. - _________________________________________________________________ - -1.4.7. Can Privoxy guarantee I am anonymous? - - No. Your chances of remaining anonymous are greatly improved, but - unless you are an expert on Internet security it would be safest to - assume that everything you do on the Web can be traced back to you. - - Privoxy can remove various information about you, and allows you more - freedom to decide which sites you can trust. But it's still possible - that web sites can find out who you are. Here's one way this can - happen. - - A few browsers disclose the user's email address in certain - situations, such as when transferring a file by FTP. Privoxy does not - filter FTP. If you need this feature, or are concerned about the mail - handler of your browser disclosing your email address, you might - consider products such as NSClean. - - Browsers available only as binaries could use non-standard headers to - give out any information they can have access to: see the - manufacturer's license agreement. It's impossible to anticipate and - prevent every breach of privacy that might occur. The professionally - paranoid prefer browsers available as source code, because - anticipating their behavior is easier. Trust the source, Luke! - _________________________________________________________________ - -1.4.8. Might some things break because header information is being altered? - - Definitely. More and more sites use HTTP header content to decide what - to display and how to display it. There is many ways that this can be - handled, so having hard and fast rules, is tricky. - - "USER AGENT" in particular is often used in this way to identify the - browser, and adjust content accordingly. Changing this now is not - recommended, since so many sites do look for this. You may get - undesirable results by changing this. - - For instance, different browsers use different encodings of Russian - and Czech characters, certain web servers convert pages on-the-fly - according to the User Agent header. Giving a "User Agent" with the - wrong operating system or browser manufacturer causes some sites in - these languages to be garbled; Surfers to Eastern European sites - should change it to something closer. And then some page access - counters work by looking at the "REFERER" header; they may fail or - break if unavailable. The weather maps of Intellicast have been - blocked by their server when no "REFERER" or cookie is provided, is - another example. There are many, many other ways things can go wrong - when trying to fool a web server. - - If you have problems with a site, you will have to adjust your - configuration accordingly. Cookies are probably the most likely - adjustment that may be required, but by no means the only one. - _________________________________________________________________ - -1.4.9. Can Privoxy act as a "caching" proxy to speed up web browsing? - - No, it does not have this ability at all. You want something like - [70]Squid for this. And, yes, before you ask, Privoxy can co-exist - with other kinds of proxies like "Squid". - _________________________________________________________________ - -1.4.10. What about as a firewall? Can Privoxy protect me? - - Not in the way you mean, or in the way a true firewall can, or a proxy - that has this specific capability. Privoxy can help protect your - privacy, but not really protect you from intrusion attempts. - _________________________________________________________________ - -1.4.11. The Privoxy logo that replaces ads is very blocky and ugly looking. -Can't a better font be used? - - This is not a font problem. The logo is an image that is created by - Privoxy on the fly. So as to not waste memory, the image is rather - small. The blockiness comes when the image is scaled to fill a largish - area. There is not much to be done about this, other than to use one - of the other "imageblock" directives: pattern, blank, or a URL of your - choosing. - - Given the above problem, we have decided to remove the logo option - entirely [as of v2.9.13]. - _________________________________________________________________ - -1.4.12. I have large empty spaces now where ads used to be. Why does Privoxy -leave these large gaps? - - It would be easy enough to just eliminate this space altogether, - rather than fill it with blank space. But, this would create problems - with many pages that use the overall size of the ad to help organize - the page layout and position the various components of the page where - they were intended to be. It is best left this way. - _________________________________________________________________ - -1.4.13. How can Privoxy filter Secure (HTTPS) URLs? - - This is a limitation since HTTPS transactions are encrypted SSL - sessions between your browser and the secure site, and are meant to be - reliably secure and private. This means that all cookies and HTTP - header information are also encrypted from the time they leave your - browser, to the site, and vice versa. Privoxy does not try to - unencrypt this information, so it just passes through as is. Privoxy - can still catch images and ads that are embedded in the SSL stream - though. - _________________________________________________________________ - -1.4.14. Privoxy runs as a "server". How secure is it? Do I need to take any -special precautions? - - There are no known exploits that might effect Privoxy. On Unix-like - systems, Privoxy can run as a non-privileged user, which is how we - recommend it be run. Also, by default Privoxy only listens to requests - from "localhost". It is not itself directly exposed to the Internet in - this configuration. If you want to have Privoxy serve as a LAN proxy, - this will have to be opened up to allow for LAN requests. In this - case, we'd recommend you specify only the LAN gateway address, e.g. - 192.168.1.1 in the main Privoxy config file. All LAN hosts can then - use this as their proxy address in the browser proxy configuration. In - this way, Privoxy will not listen on any external ports. Of course, a - firewall is always good too. Better safe than sorry. - _________________________________________________________________ - -1.4.15. How can I temporarily disable Privoxy? - - The easiest way is to access Privoxy with your browser by using the - special URL: [71]http://p.p/ and select "Toggle Privoxy on or off" - from that page. - _________________________________________________________________ - -1.5. Troubleshooting - -1.5.1. I just upgraded and am getting "connection refused" with every web -page? - - Either Privoxy is not running, or your browser is configured for a - different port than what Privoxy is using. - - The old Privoxy (and also Junkbuster) used port 8000 by default. This - has been changed to port 8118 now, due to a conflict with NAS (Network - Audio Service), which uses port 8000. If you haven't, you need to - change your browser to the new port number, or alternately change - Privoxy's "listen-address" setting in the config file used to start - Privoxy. - _________________________________________________________________ - -1.5.2. I just added a new rule, but the steenkin ad is still getting -through. How? - - If the ad had been displayed before you added its URL, it will - probably be held in the browser's cache for some time, so it will be - displayed without the need for any request to the server, and Privoxy - will not be in the picture. The best thing to do is try flushing the - browser's caches. And then try again. - - If this doesn't help, you probably have an error in the rule you - applied. Try pasting the full URL of the offending ad into - [72]http://www.privoxy.org/config/show-url-info and see if any actions - match your new rule. - _________________________________________________________________ - -1.5.3. One of my favorite sites does not work with Privoxy. What can I do? - - First verify that it is indeed a Privoxy problem, by disabling Privoxy - filtering and blocking. Go to [73]http://p.p/ and click on "Toggle - Privoxy On or Off", then disable it. Now try that page again. - - If still a problem, go to "Show which actions apply to a URL and why" - from [74]http://p.p/ and paste the full URL of the page in question - into the prompt. See which actions are being applied to the URL. Now, - armed with this information, go to "Edit the actions list". Here you - should see various sections that have various Privoxy features - disabled for specific sites. Disabled "actions" will have a "-" (minus - sign) in front of them. Add your problem page URL to one of these - sections that looks like it is disabling the feature that is causing - the problem. Re-try the page. There might be some trial and error - involved. This is discussed in a little more detail in the - [75]user-manual appendix. - - Alternately, if you are comfortable with a text editor, you can - accomplish the same thing by editing the appropriate "actions" file. - _________________________________________________________________ - -1.5.4. What time is it? - - Time for you to go! - _________________________________________________________________ - -2. Copyright and History - - Please see the user manual for information on Copyright and History. - _________________________________________________________________ - -3. See also - - Please see the user manual for information on references. - -References - - 1. http://www.privoxy.org/faq/ - 2. http://www.privoxy.org/user-manual/contact.html - 3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUESTIONS - 4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#GENERAL - 5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWJB - 6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN37 - 7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DIFFERS - 8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FEATURES - 9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#PROXYMORON - 10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSERS2 - 11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LICENSE - 12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#JOINTEAM - 13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION - 14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHBROWSERS - 15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHOS - 16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWINSTALL - 17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN151 - 18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOCALHOST - 19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN176 - 20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURATION - 21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWCONFIG - 22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN192 - 23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSS - 24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN210 - 25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGFILES - 26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSECONFIG - 27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN327 - 28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN339 - 29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN351 - 30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN362 - 31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN367 - 32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#OTHERPROXY - 33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#MISC - 34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN386 - 35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOADINGTIMES - 36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURL - 37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BLOCKLIST - 38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWADS - 39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#IP - 40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN427 - 41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN438 - 42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN448 - 43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN456 - 44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN461 - 45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN470 - 46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN474 - 47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN481 - 48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TURNOFF - 49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN499 - 50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN501 - 51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN514 - 52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN520 - 53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN538 - 54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT - 55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO - 56. http://www.junkbusters.com/ - 57. http://ijbswa.sourceforge.net/ - 58. http://junkbusters.com/ - 59. http://p.p/ - 60. http://www.gnu.org/copyleft/gpl.html - 61. http://www.privoxy.org/user-manual/ - 62. http://p.p/ - 63. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE - 64. http://p.p/ - 65. http://www.privoxy.org/config/edit-actions - 66. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE - 67. http://p.p/ - 68. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#FORWARDING - 69. http://www.multiproxy.org/anon_list.htm - 70. http://www.squid-cache.org/ - 71. http://p.p/ - 72. http://www.privoxy.org/config/show-url-info - 73. http://p.p/ - 74. http://p.p/ - 75. file://localhost/home/swa/sf/current-org/doc/user-manual/appendix.html#ACTIONSANAT diff --git a/doc/text/user-manual.txt b/doc/text/user-manual.txt deleted file mode 100644 index 5a33782e..00000000 --- a/doc/text/user-manual.txt +++ /dev/null @@ -1,2097 +0,0 @@ - -Privoxy User Manual - - By: Privoxy Developers - - $Id: user-manual.sgml,v 1.60 2002/03/27 01:57:34 hal9 Exp $ - - The user manual gives users information on how to install, configure - and use Privoxy. Privoxy is a web proxy with advanced filtering - capabilities for protecting privacy, filtering web page content, - managing cookies, controlling access, and removing ads, banners, - pop-ups and other obnoxious Internet Junk. Privoxy has a very flexible - configuration and can be customized to suit individual needs and - tastes. Privoxy has application for both stand-alone systems and - multi-user networks. - - You can find the latest version of the user manual at - [1]http://www.privoxy.org/user-manual/. - _________________________________________________________________ - - Table of Contents - 1. [2]Introduction - - 1.1. [3]New Features - - 2. [4]Installation - - 2.1. [5]Source - 2.2. [6]Red Hat - 2.3. [7]SuSE - 2.4. [8]OS/2 - 2.5. [9]Windows - 2.6. [10]Other - - 3. [11]Privoxy Configuration - - 3.1. [12]Controlling Privoxy with Your Web Browser - 3.2. [13]Configuration Files Overview - 3.3. [14]The Main Configuration File - - 3.3.1. [15]Defining Other Configuration Files - 3.3.2. [16]Other Configuration Options - 3.3.3. [17]Access Control List (ACL) - 3.3.4. [18]Forwarding - 3.3.5. [19]Windows GUI Options - - 3.4. [20]The Actions File - - 3.4.1. [21]URL Domain and Path Syntax - 3.4.2. [22]Actions - 3.4.3. [23]Aliases - - 3.5. [24]The Filter File - 3.6. [25]Templates - - 4. [26]Quickstart to Using Privoxy - - 4.1. [27]Command Line Options - - 5. [28]Contacting the Developers, Bug Reporting and Feature Requests - 6. [29]Copyright and History - - 6.1. [30]License - 6.2. [31]History - - 7. [32]See also - 8. [33]Appendix - - 8.1. [34]Regular Expressions - - 21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - - 8.2. [35]Privoxy's Internal Pages - 8.3. [36]Anatomy of an Action - -1. Introduction - - Privoxy is a web proxy with advanced filtering capabilities for - protecting privacy, filtering web page content, managing cookies, - controlling access, and removing ads, banners, pop-ups and other - obnoxious Internet junk. Privoxy has a very flexible configuration and - can be customized to suit individual needs and tastes. Privoxy has - application for both stand-alone systems and multi-user networks. - - Privoxy is based on the code of the Internet Junkbuster. Junkbuster - was originally written by JunkBusters Corporation, and was released as - free open-source software under the GNU GPL. Stefan Waldherr made many - improvements, and started the SourceForge project to continue - development. - - Privoxy continues the Junkbuster tradition, but adds many refinements - and enhancements. - - This documentation is included with the current BETA version of - Privoxy and is mostly complete at this point. The most up to date - reference for the time being is still the comments in the source files - and in the individual configuration files. Development of version 3.0 - is currently nearing completion, and includes many significant changes - and enhancements over earlier versions. The target release date for - stable v3.0 is "soon" ;-) - - Since this is a BETA version, not all new features are well tested. - This documentation may be slightly out of sync as a result (especially - with CVS sources). And there may be bugs, though hopefully not many! - _________________________________________________________________ - -1.1. New Features - - In addition to Internet Junkbuster's traditional feature of ad and - banner blocking and cookie management, Privoxy provides new features, - some of them currently under development: - - * Integrated browser based configuration and control utility - ([37]http://p.p). Browser-based tracing of rule and filter - effects. - * Blocking of annoying pop-up browser windows. - * HTTP/1.1 compliant (most, but not all 1.1 features are supported). - * Support for Perl Compatible Regular Expressions in the - configuration files, and generally a more sophisticated and - flexible configuration syntax over previous versions. - * GIF de-animation. - * Web page content filtering (removes banners based on size, - invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.) - * Bypass many click-tracking scripts (avoids script redirection). - * Multi-threaded (POSIX and native threads). - * Auto-detection and re-reading of config file changes. - * User-customizable HTML templates (e.g. 404 error page). - * Improved cookie management features (e.g. session based cookies). - * Builds from source on most UNIX-like systems. Packages available - for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac - OSX, OS/2, HP-UX 11 and AmigaOS. - * In addition, the configuration is much more powerful and versatile - over-all. - _________________________________________________________________ - -2. Installation - - Privoxy is available as raw source code, or pre-compiled binaries. See - the [38]Privoxy Home Page for binaries and current release info. - Privoxy is also available via [39]CVS. This is the recommended - approach at this time. But please be aware that CVS is constantly - changing, and it may break in mysterious ways. - _________________________________________________________________ - -2.1. Source - - For gzipped tar archives, unpack the source: - - tar xzvf privoxy-2.9.13-beta-src* [.tgz or .tar.gz] - cd privoxy-2.9.13-beta - - For retrieving the current CVS sources, you'll need the CVS package - installed first. To download CVS source: - - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co cu -rrent - cd current - - This will create a directory named current/, which will contain the - source tree. - - Then, in either case, to build from tarball/CVS source: - - ./configure (--help to see options) - make (the make from gnu, gmake for *BSD) - su - make -n install (to see where all the files will go) - make install (to really install) - - For Redhat and SuSE Linux RPM packages, see below. - _________________________________________________________________ - -2.2. Red Hat - - To build Redhat RPM packages, install source as above. Then: - - autoheader - autoconf - ./configure - make redhat-dist - - This will create both binary and src RPMs in the usual places. - Example: - - /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - /usr/src/redhat/SRPMS/privoxy-2.9.11-1.src.rpm - - To install, of course: - - rpm -Uvv /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - This will place the Privoxy configuration files in /etc/privoxy/, and - log files in /var/log/privoxy/. - _________________________________________________________________ - -2.3. SuSE - - To build SuSE RPM packages, install source as above. Then: - - autoheader - autoconf - ./configure - make suse-dist - - This will create both binary and src RPMs in the usual places. - Example: - - /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - /usr/src/packages/SRPMS/privoxy-2.9.11-1.src.rpm - - To install, of course: - - rpm -Uvv /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm - - This will place the Privoxy configuration files in /etc/privoxy/, and - log files in /var/log/privoxy/. - _________________________________________________________________ - -2.4. OS/2 - - Privoxy is packaged in a WarpIN self- installing archive. The - self-installing program will be named depending on the release - version, something like: ijbos2_setup_1.2.3.exe. In order to install - it, simply run this executable or double-click on its icon and follow - the WarpIN installation panels. A shadow of the Privoxy executable - will be placed in your startup folder so it will start automatically - whenever OS/2 starts. - - The directory you choose to install Privoxy into will contain all of - the configuration files. - - If you would like to build binary images on OS/2 yourself, you will - need a few Unix-like tools: autoconf, autoheader and sh. These tools - will be used to create the required config.h file, which is not part - of the source distribution because it differs based on platform. You - will also need a compiler. The distribution has been created using IBM - VisualAge compilers, but you can use any compiler you like. GCC/EMX - has the disadvantage of needing to be single-threaded due to a - limitation of EMX's implementation of the select() socket call. - - In addition to needing the source code distribution as outlined - earlier, you will want to extract the os2seutp directory from CVS: - cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login - - cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co os2 -setup - - This will create a directory named os2setup/, which will contain the - Makefile.vac makefile and os2build.cmd which is used to completely - create the binary distribution. The sequence of events for building - the executable for yourself goes something like this: - cd current - autoheader - autoconf - sh configure - cd ..\os2setup - nmake -f Makefile.vac - - You will see this sequence laid out in os2build.cmd. - _________________________________________________________________ - -2.5. Windows - - Click-click. (I need help on this. Not a clue here. Also for - configuration section below. HB.) - _________________________________________________________________ - -2.6. Other - - Some quick notes on other Operating Systems. - - For FreeBSD (and other *BSDs?), the build will require gmake instead - of the included make. gmake is available from [40]http://www.gnu.org. - The rest should be the same as above for Linux/Unix. - _________________________________________________________________ - -3. Privoxy Configuration - - All Privoxy configuration is kept in text files. These files can be - edited with a text editor. Many important aspects of Privoxy can also - be controlled easily with a web browser. - _________________________________________________________________ - -3.1. Controlling Privoxy with Your Web Browser - - Privoxy can be reached by the special URL [41]http://p.p/ (or - alternately [42]http://www.privoxy.org/config/), which is an internal - page. You will see the following section: - -Please choose from the following options: - - * Show information about the current configuration - * Show the source code version numbers - * Show the client's request headers. - * Show which actions apply to a URL and why - * Toggle Privoxy on or off - * Edit the actions list - - - This should be self-explanatory. Note the last item is an editor for - the "actions list", which is where much of the ad, banner, cookie, and - URL blocking magic is configured as well as other advanced features of - Privoxy. This is an easy way to adjust various aspects of Privoxy - configuration. The actions file, and other configuration files, are - explained in detail below. Privoxy will automatically detect any - changes to these files. - - "Toggle Privoxy On or Off" is handy for sites that might have problems - with your current actions and filters, or just to test if a site - misbehaves, whether it is Privoxy causing the problem or not. Privoxy - continues to run as a proxy in this case, but all filtering is - disabled. - _________________________________________________________________ - -3.2. Configuration Files Overview - - For Unix, *BSD and Linux, all configuration files are located in - /etc/privoxy/ by default. For MS Windows, OS/2, and AmigaOS these are - all in the same directory as the Privoxy executable. The name and - number of configuration files has changed from previous versions, and - is subject to change as development progresses. - - The installed defaults provide a reasonable starting point, though - possibly aggressive by some standards. For the time being, there are - only three default configuration files (this will change in time): - - * The main configuration file is named config on Linux, Unix, BSD, - OS/2, and AmigaOS and config.txt on Windows. - * The default.action file is used to define various "actions" - relating to images, banners, pop-ups, access restrictions, banners - and cookies. There is a CGI based editor for this file that can be - accessed via [43]http://p.p. (Other actions files are included as - well with differing levels of filtering and blocking, e.g. - ijb-basic.action.) - * The default.filter file can be used to re-write the raw page - content, including viewable text as well as embedded HTML and - JavaScript, and whatever else lurks on any given web page. - - default.action and default.filter can use Perl style regular - expressions for maximum flexibility. All files use the "#" character - to denote a comment. Such lines are not processed by Privoxy. After - making any changes, there is no need to restart Privoxy in order for - the changes to take effect. Privoxy should detect such changes - automatically. - - While under development, the configuration content is subject to - change. The below documentation may not be accurate by the time you - read this. Also, what constitutes a "default" setting, may change, so - please check all your configuration files on important issues. - _________________________________________________________________ - -3.3. The Main Configuration File - - Again, the main configuration file is named config on Linux/Unix/BSD - and OS/2, and config.txt on Windows. Configuration lines consist of an - initial keyword followed by a list of values, all separated by - whitespace (any number of spaces or tabs). For example: - - blockfile blocklist.ini - - Indicates that the blockfile is named "blocklist.ini". (A default - installation does not use this.) - - A "#" indicates a comment. Any part of a line following a "#" is - ignored, except if the "#" is preceded by a "\". - - Thus, by placing a "#" at the start of an existing configuration line, - you can make it a comment and it will be treated as if it weren't - there. This is called "commenting out" an option and can be useful to - turn off features: If you comment out the "logfile" line, Privoxy will - not log to a file at all. Watch for the "default:" section in each - explanation to see what happens if the option is left unset (or - commented out). - - Long lines can be continued on the next line by using a "\" as the - very last character. - - There are various aspects of Privoxy behavior that can be tuned. - _________________________________________________________________ - -3.3.1. Defining Other Configuration Files - - Privoxy can use a number of other files to tell it what ads to block, - what cookies to accept, etc. This section of the configuration file - tells Privoxy where to find all those other files. - - On Windows and AmigaOS, Privoxy looks for these files in the same - directory as the executable. On Unix and OS/2, Privoxy looks for these - files in the current working directory. In either case, an absolute - path name can be used to avoid problems. - - When development goes modular and multi-user, the blocker, filter, and - per-user config will be stored in subdirectories of "confdir". For - now, only confdir/templates is used for storing HTML templates for CGI - results. - - The location of the configuration files: - - confdir /etc/privoxy # No trailing /, please. - - The directory where all logging (i.e. logfile and jarfile) takes - place. No trailing "/", please: - - logdir /var/log/privoxy - - Note that all file specifications below are relative to the above two - directories! - - The "default.action" file contains patterns to specify the actions to - apply to requests for each site. Default: Cookies to and from all - destinations are kept only during the current browser session (i.e. - they are not saved to disk). Pop-ups are disabled for all sites. All - sites are filtered through selected sections of "default.filter". No - sites are blocked. Privoxy displays a checkboard type pattern for - filtered ads and other images. The syntax of this file is explained in - detail [44]below. Other "actions" files are included, and you are free - to use any of them. They have varying degrees of aggressiveness. - - actionsfile default.action - - The "default.filter" file contains content modification rules that use - "regular expressions". These rules permit powerful changes on the - content of Web pages, e.g., you could disable your favorite JavaScript - annoyances, re-write the actual displayed text, or just have some fun - replacing "Microsoft" with "MicroSuck" wherever it appears on a Web - page. Default: whatever the developers are playing with :-/ - - Filtering requires buffering the page content, which may appear to - slow down page rendering since nothing is displayed until all content - has passed the filters. (It does not really take longer, but seems - that way since the page is not incrementally displayed.) This effect - will be more noticeable on slower connections. - - filterfile default.filter - - The logfile is where all logging and error messages are written. The - logfile can be useful for tracking down a problem with Privoxy (e.g., - it's not blocking an ad you think it should block) but in most cases - you probably will never look at it. - - Your logfile will grow indefinitely, and you will probably want to - periodically remove it. On Unix systems, you can do this with a cron - job (see "man cron"). For Redhat, a logrotate script has been - included. - - On SuSE Linux systems, you can place a line like "/var/log/privoxy.* - +1024k 644 nobody.nogroup" in /etc/logfiles, with the effect that - cron.daily will automatically archive, gzip, and empty the log, when - it exceeds 1M size. - - Default: Log to the a file named logfile. Comment out to disable - logging. - - logfile logfile - - The "jarfile" defines where Privoxy stores the cookies it intercepts. - Note that if you use a "jarfile", it may grow quite large. Default: - Don't store intercepted cookies. - - #jarfile jarfile - - If you specify a "trustfile", Privoxy will only allow access to sites - that are named in the trustfile. You can also mark sites as trusted - referrers, with the effect that access to untrusted sites will be - granted, if a link from a trusted referrer was used. The link target - will then be added to the "trustfile". This is a very restrictive - feature that typical users most probably want to leave disabled. - Default: Disabled, don't use the trust mechanism. - - #trustfile trust - - If you use the trust mechanism, it is a good idea to write up some - on-line documentation about your blocking policy and to specify the - URL(s) here. They will appear on the page that your users receive when - they try to access untrusted content. Use multiple times for multiple - URLs. Default: Don't display links on the "untrusted" info page. - - trust-info-url http://www.your-site.com/why_we_block.html - trust-info-url http://www.your-site.com/what_we_allow.html - _________________________________________________________________ - -3.3.2. Other Configuration Options - - This part of the configuration file contains options that control how - Privoxy operates. - - "Admin-address" should be set to the email address of the proxy - administrator. It is used in many of the proxy-generated pages. - Default: fill@me.in.please. - - #admin-address fill@me.in.please - - "Proxy-info-url" can be set to a URL that contains more info about - this Privoxy installation, it's configuration and policies. It is used - in many of the proxy-generated pages and its use is highly recommended - in multi-user installations, since your users will want to know why - certain content is blocked or modified. Default: Don't show a link to - on-line documentation. - - proxy-info-url http://www.your-site.com/proxy.html - - "Listen-address" specifies the address and port where Privoxy will - listen for connections from your Web browser. The default is to listen - on the localhost port 8118, and this is suitable for most users. (In - your web browser, under proxy configuration, list the proxy server as - "localhost" and the port as "8118"). - - If you already have another service running on port 8118, or if you - want to serve requests from other machines (e.g. on your local - network) as well, you will need to override the default. The syntax is - "listen-address []:". 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 /, where both the - and 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 tag was a crime! - # - s*|**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/BING - O!/ig - - Kill those pesky little web-bugs: - - # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking) - FILTER: webbugs - s/]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\ - s*['"]?1(\D[^>]*?)?>//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 diff --git a/doc/obsolete/top.gif b/doc/top.gif similarity index 100% rename from doc/obsolete/top.gif rename to doc/top.gif diff --git a/doc/webserver/.gitignore b/doc/webserver/.gitignore deleted file mode 100644 index 7184d633..00000000 --- a/doc/webserver/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -developer-manual -faq -user-manual -man-page \ No newline at end of file diff --git a/doc/webserver/.htaccess b/doc/webserver/.htaccess deleted file mode 100644 index 0ecf688d..00000000 --- a/doc/webserver/.htaccess +++ /dev/null @@ -1,26 +0,0 @@ -# http://privoxy.org/.htaccess -# -# By Jon Foster -# -# Intercepts requests for these servers: -# http://ijbswa.sourceforge.net/ -# http://privoxy.com/ -# http://www.privoxy.com/ -# http://www.privoxy.org/ -# -# And redirects all requests to the canonical web server: -# http://privoxy.org/ -# -# -# Uses Apache's mod_rewrite -# See http://httpd.apache.org/docs/mod/mod_rewrite.html -# - -# Enable mod_rewrite -RewriteEngine on - - -RewriteCond %{HTTP_HOST} !^privoxy\.org\.?$ [NC] -RewriteCond %{HTTP_HOST} !^$ -RewriteRule ^(.*)$ http://privoxy.org/$1 [R,L] - diff --git a/doc/webserver/README.txt b/doc/webserver/README.txt index 4221e3a8..60680f9f 100644 --- a/doc/webserver/README.txt +++ b/doc/webserver/README.txt @@ -3,7 +3,6 @@ on the project's homepage ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/ -which is indeed http://ijbswa.sourceforge.net -and http://www.privoxy.org/. +which is indeed http://ijbswa.sourceforge.net. --Stefan, April 2002 \ No newline at end of file +-Stefan, June 2001 \ No newline at end of file diff --git a/doc/webserver/config/.htaccess b/doc/webserver/config/.htaccess deleted file mode 100644 index 0a2bfbf9..00000000 --- a/doc/webserver/config/.htaccess +++ /dev/null @@ -1,34 +0,0 @@ -# http://ijbswa.sourceforge.net/config/.htaccess -# -# By Jon Foster -# -# Redirects any request for any file in this directory tree -# to an error page. The error page is reached through the -# URL http://privoxy.org/config/ and is actually in -# the file index.php -# -# Uses Apache's mod_rewrite -# See http://httpd.apache.org/docs/mod/mod_rewrite.html -# - -# Enable mod_rewrite -RewriteEngine on - -# we are reached via /config/ prefix -RewriteBase /config/ - -# The only file which really exists is index.php - allow this -RewriteCond %{HTTP_HOST} ^privoxy\.org\.?$ [NC,OR] -RewriteCond %{HTTP_HOST} ^$ -RewriteRule index.php - [L] - -# Silently redirect the config dir to index.php -RewriteCond %{HTTP_HOST} ^privoxy\.org\.?$ [NC,OR] -RewriteCond %{HTTP_HOST} ^$ -RewriteRule ^$ index.php [L] - -# anything else gets redirected to the config dir, and we update -# the browser's location bar. -RewriteRule ^(.*)$ http://privoxy.org/config/ [R,L] - - diff --git a/doc/webserver/config/index.php b/doc/webserver/config/index.php deleted file mode 100644 index 38f59768..00000000 --- a/doc/webserver/config/index.php +++ /dev/null @@ -1,22 +0,0 @@ - - -Privoxy not running - - - - -

    Privoxy isn't working

    - -

    If you were redirected to this page, it means that you aren't using -Privoxy.   Please check your browser settings.

    - -

    Junkbuster 2.9.x was renamed Privoxy. If you recently upgraded, then -the web-based interface has moved - it is now at http://config.privoxy.org/ -(Short form: p.p [Privoxy Proxy]).

    - -

    Privoxy home page

    - - - - diff --git a/doc/webserver/default_page.php b/doc/webserver/default_page.php deleted file mode 100644 index 75a4fdcc..00000000 --- a/doc/webserver/default_page.php +++ /dev/null @@ -1,69 +0,0 @@ - - - -SourceForge: Welcome - - - - - - - - - - - -
       - Home | - About | - Partners | - Contact Us
    - - - - - - - - - -
    - - - VA Linux Systems -
    - - - - - - - -
    -

    -

    Welcome to http:///

    -

    We're Sorry but this Project hasn't yet uploaded their personal webpage yet.
    - Please check back soon for updates or visit SourceForge


    -
    -
    - - - - - - - -
    - 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. -
    - - - - diff --git a/doc/webserver/developer-manual.html b/doc/webserver/developer-manual.html new file mode 100644 index 00000000..2a74cd17 --- /dev/null +++ b/doc/webserver/developer-manual.html @@ -0,0 +1,71 @@ + + + + +Junkbuster|Developer Manual + + + + + + + +

    +

    +

    How to quickly dive into Junkbuster Development:

    +

    + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:49 CEST 2001 + + + + diff --git a/doc/webserver/documentation-guidelines.html b/doc/webserver/documentation-guidelines.html new file mode 100644 index 00000000..f6a23fe5 --- /dev/null +++ b/doc/webserver/documentation-guidelines.html @@ -0,0 +1,86 @@ + + + + +Junkbuster|Documentation Guidelines + + + + + + + +

    +

    +

    Documentation guideline:

    +

    +All docs should be ... +

      +
    • in a format that is widely used. I propose HTML. +
    • we either +
        +
      • generate man pages from the documentation (let's _NOT_ write them manually), or +
      • we have a man page that points to the documentation (I propose + this option) +
      +
    • have a consistent layout +
    • have a link to the latest version of the document (i.e. point to a URL at sf) +
    • 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) +
    • started from scratch but recycle parts from the original junkbuster documents +
    + +
    + +
    +

    the developers

    + +Last modified: Wed Jun 13 16:26:48 CEST 2001 + + + + diff --git a/doc/webserver/faq.html b/doc/webserver/faq.html new file mode 100644 index 00000000..a97c036c --- /dev/null +++ b/doc/webserver/faq.html @@ -0,0 +1,115 @@ + + + + +Junkbuster|FAQ + + + + + + + +

    +

    +

    Questions

    + +

    + +Please read the Junkbuster FAQ at Junkbuster Corp. and some other docs first. + +

    Installation

    +

    Mail accounts

    +

    +How can I make my Yahoo account work? +

    +How can I make my Hotmail account work? +

    +How can I make my GMX account work? +

    Misc

    +

    +How can I hide my IP address? +

    +What is the imagefile (simage.ini, etc.) for? +

    Removal

    + +

    Answers

    + +

    How can I make my Yahoo account work?

    +

    +to be filled +

    + +

    How can I make my Hotmail account work?

    +

    +to be filled +

    + +

    How can I make my GMX account work?

    +

    +to be filled + +

    How can I hide my IP address?

    +

    +You cannot hide your IP address with Junkbuster. + +

    What is the imagefile (simage.ini, etc.) for?

    +

    +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.. + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:47 CEST 2001 + + + + diff --git a/doc/webserver/index.html b/doc/webserver/index.html index e3bf7298..00bf0b73 100644 --- a/doc/webserver/index.html +++ b/doc/webserver/index.html @@ -1,131 +1,75 @@ - + - - - Privoxy|Project Homepage - - - - - - - + +Junkbuster|Project Homepage + -

    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.

    + -

    More infos ...

    +

    -

    - -

    Download

    -

    -

    - -

    Documentation

    -

    -

    - -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - -
    +



    -SourceForge Logo +You will be redirected in a couple of moments. This page will soon have more content.
    +
    +

    the developers

    + +Last modified: Wed Jun 13 16:26:46 CEST 2001 + - + + diff --git a/doc/webserver/p_doc.css b/doc/webserver/p_doc.css deleted file mode 100644 index 8eb2159a..00000000 --- a/doc/webserver/p_doc.css +++ /dev/null @@ -1,11 +0,0 @@ -hr { width: 95% } -body { background: #EEEEEE; } -h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif } -code { color: green } -pre { margin-left: 2% } -# p { margin-left:20px } -body { margin-left:20px } -h1 { color: #404; font-size: 175%; margin-left:0px } -h2 { color: #606; margin-left:0px } -h3, h4 { color: #806; margin-left:0px } -ul { list-style-type: square } diff --git a/doc/webserver/p_web.css b/doc/webserver/p_web.css deleted file mode 100644 index 8eb2159a..00000000 --- a/doc/webserver/p_web.css +++ /dev/null @@ -1,11 +0,0 @@ -hr { width: 95% } -body { background: #EEEEEE; } -h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif } -code { color: green } -pre { margin-left: 2% } -# p { margin-left:20px } -body { margin-left:20px } -h1 { color: #404; font-size: 175%; margin-left:0px } -h2 { color: #606; margin-left:0px } -h3, h4 { color: #806; margin-left:0px } -ul { list-style-type: square } diff --git a/doc/webserver/redirect.php b/doc/webserver/redirect.php index a85b2c64..70d7e0b9 100755 --- a/doc/webserver/redirect.php +++ b/doc/webserver/redirect.php @@ -1,11 +1,21 @@ - + +// This program is free software; you can redistribute it +// and/or modify it under the terms of the GNU General +// Public License as published by the Free Software +// Foundation; either version 2 of the License, or (at +// your option) any later version. +// +// This program is distributed in the hope that it will +// be useful, but WITHOUT ANY WARRANTY; without even the +// implied warranty of MERCHANTABILITY or FITNESS FOR A +// PARTICULAR PURPOSE. See the GNU General Public +// License for more details. +// +// The GNU General Public License should be included with +// this file. If not, you can view it at +// http://www.gnu.org/copyleft/gpl.html +// or write to the Free Software Foundation, Inc., 59 +// Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// +// $Log: Makefile.in,v $ +// diff --git a/doc/webserver/robots.txt b/doc/webserver/robots.txt deleted file mode 100644 index 790f3ffc..00000000 --- a/doc/webserver/robots.txt +++ /dev/null @@ -1,15 +0,0 @@ -# This is the Internet Junkbuster web site. -# -# If the robot is connecting through a JunkBuster, then the -# control interface is at /config. It isn't very useful -# to index it, and you're likely to break stuff. So go away! -# -# Even if you're not connected through a JunkBuster, the -# one "JunkBuster's not working" page there is not very -# interesting. - -User-agent: * -Disallow: /config/ - - - diff --git a/doc/webserver/swa.css b/doc/webserver/swa.css new file mode 100644 index 00000000..22489e52 --- /dev/null +++ b/doc/webserver/swa.css @@ -0,0 +1,9 @@ +body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px;} +h1 { margin-left:20px; font-family:Helvetica,Arial; font-size:18pt;} +h2 { margin-left:25px; font-family:Helvetica,Arial; font-size:14pt; } +h3 { margin-left:25px; font-family:Helvetica,Arial; font-size:12pt; } +p { margin-left:27px; margin-right:20px; font-size:10pt; } +# next definition removes bullets for netscape +# li { margin-left:27px; margin-right:20px; font-size:10pt; } +form,pre,ul,ol { margin-left:27px; margin-right:20px; font-size:10pt; } +div,td,th,address,nobr,b,i { font-size:10pt; } diff --git a/doc/webserver/testplan.html b/doc/webserver/testplan.html new file mode 100644 index 00000000..050a66d2 --- /dev/null +++ b/doc/webserver/testplan.html @@ -0,0 +1,102 @@ + + + + +Junkbuster|Testplan + + + + + + + +

    +

    +

    Testplan for releases:

    +

    +

      +
    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/junkbuster +
      • /etc/junkbuster +
      • /usr/sbin/junkbuster +
      • /etc/init.d/junkbuster +
      • /usr/doc/junkbuster* +
      +
    3. Install the rpm. Any error messages? +
    4. start,stop,status junkbuster with the specific script + (e.g. /etc/rc.d/init/junkbuster stop). Reboot your machine. Does + autostart work? +
    5. Start browsing. Does the junkbuster work? Logfile written? +
    6. Remove the rpm. Any error messages? All files removed? +
    + +

    Test reports:

    +

    +Please submit test reports only with the test form +at sourceforge. Three simple steps: +

      +
    • Select category: the distribution you test on. +
    • Select group: the version of Junkbuster 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). + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:44 CEST 2001 + + + + diff --git a/doc/webserver/user-manual.html b/doc/webserver/user-manual.html new file mode 100644 index 00000000..e90fad37 --- /dev/null +++ b/doc/webserver/user-manual.html @@ -0,0 +1,71 @@ + + + + +Junkbuster|User Manual + + + + + + + +

    +

    +

    To be filled:

    +

    + +
    + +


    +

    the developers

    + +Last modified: Wed Jun 13 16:26:43 CEST 2001 + + + + diff --git a/encode.c b/encode.c index 09c7b5f7..7e82acd8 100644 --- a/encode.c +++ b/encode.c @@ -1,4 +1,4 @@ -const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; +const char encode_rcs[] = "$Id: encode.c,v 1.1.1.1 2001/05/15 13:58:51 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/encode.c,v $ @@ -7,7 +7,7 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; * encode cookies and HTML text. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -33,27 +33,6 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; * * Revisions : * $Log: encode.c,v $ - * Revision 1.7 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.6 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.5 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.4 2002/01/22 23:28:07 jongfoster - * Adding convenience function html_encode_and_free_original() - * Making all functions accept NULL paramaters - in this case, they - * simply return NULL. This allows error-checking to be deferred. - * - * Revision 1.3 2001/11/13 00:16:40 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.2 2001/05/17 22:52:35 oes - * - Cleaned CRLF's from the sources and related files - * * Revision 1.1.1.1 2001/05/15 13:58:51 oes * Initial import of version 2.9.3 source tree * @@ -64,8 +43,8 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $"; #include "config.h" #include -#include #include +#include #include "encode.h" @@ -176,20 +155,12 @@ static const char * const cookie_code_map[256] = { * * Returns : Encoded string, newly allocated on the heap. * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. * *********************************************************************/ char * html_encode(const char *s) { - char * buf; - - if (s == NULL) - { - return NULL; - } - /* each input char can expand to at most 6 chars */ - buf = (char *) malloc((strlen(s) * 6) + 1); + char * buf = (char *) malloc((strlen(s) * 6) + 1); if (buf) { @@ -215,41 +186,6 @@ char * html_encode(const char *s) return(buf); } - -/********************************************************************* - * - * Function : html_encode_and_free_original - * - * Description : Encodes a string so it's not interpreted as - * containing HTML tags or entities. - * Replaces <, >, &, and " with the appropriate HTML - * entities. Free()s original string. - * If original string is NULL, simply returns NULL. - * - * Parameters : - * 1 : s = String to encode. Null-terminated. - * - * Returns : Encoded string, newly allocated on the heap. - * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. - * - *********************************************************************/ -char * html_encode_and_free_original(char *s) -{ - char * result; - - if (s == NULL) - { - return NULL; - } - - result = html_encode(s); - free(s); - - return result; -} - - /********************************************************************* * * Function : cookie_encode @@ -263,20 +199,12 @@ char * html_encode_and_free_original(char *s) * * Returns : Encoded string, newly allocated on the heap. * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. * *********************************************************************/ char * cookie_encode(const char *s) { - char * buf; - - if (s == NULL) - { - return NULL; - } - /* each input char can expand to at most 3 chars */ - buf = (char *) malloc((strlen(s) * 3) + 1); + char * buf = (char *) malloc((strlen(s) * 3) + 1); if (buf) { @@ -315,20 +243,12 @@ char * cookie_encode(const char *s) * * Returns : Encoded string, newly allocated on the heap. * Caller is responsible for freeing it with free(). - * If s is NULL, or on out-of memory, returns NULL. * *********************************************************************/ char * url_encode(const char *s) { - char * buf; - - if (s == NULL) - { - return NULL; - } - /* each input char can expand to at most 3 chars */ - buf = (char *) malloc((strlen(s) * 3) + 1); + char * buf = (char *) malloc((strlen(s) * 3) + 1); if (buf) { @@ -368,7 +288,7 @@ char * url_encode(const char *s) * Returns : The integer value, or -1 for non-hex characters. * *********************************************************************/ -static int xdtoi(const int d) +static int xdtoi(char d) { if ((d >= '0') && (d <= '9')) { @@ -406,10 +326,10 @@ static int xtoi(const char *s) { int d1, d2; - d1 = xdtoi(*s); + d1 = xdtoi(*s++); if(d1 >= 0) { - d2 = xdtoi(*(s+1)); + d2 = xdtoi(*s); if(d2 >= 0) { return (d1 << 4) + d2; @@ -451,7 +371,7 @@ char *url_decode(const char * s) break; case '%': - if ((*q = xtoi(s + 1)) != '\0') + if ((*q = xtoi(s + 1))) { s += 3; q++; diff --git a/encode.h b/encode.h index 875b9662..ba0b6cf0 100644 --- a/encode.h +++ b/encode.h @@ -1,15 +1,15 @@ -#ifndef ENCODE_H_INCLUDED -#define ENCODE_H_INCLUDED -#define ENCODE_H_VERSION "$Id: encode.h,v 1.4 2002/03/24 13:25:43 swa Exp $" +#ifndef _ENCODE_H +#define _ENCODE_H +#define ENCODE_H_VERSION "$Id: encode.h,v 1.1 2001/05/13 21:57:06 administrator Exp $" /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/encode.h,v $ + * File : $Source: /home/administrator/cvs/ijb/encode.h,v $ * * Purpose : Functions to encode and decode URLs, and also to * encode cookies and HTML text. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,21 +35,6 @@ * * 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 - * * *********************************************************************/ @@ -63,8 +48,6 @@ extern char * cookie_encode(const char *s); extern char * url_encode(const char *s); extern char * url_decode(const char *str); -extern char * html_encode_and_free_original(char *s); - /* Revision control strings from this header and associated .c file */ extern const char encode_rcs[]; extern const char encode_h_rcs[]; @@ -73,7 +56,7 @@ extern const char encode_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef ENCODE_H_INCLUDED */ +#endif /* ndef _ENCODE_H */ /* Local Variables: diff --git a/errlog.c b/errlog.c index ec623b8f..3832dbd7 100644 --- a/errlog.c +++ b/errlog.c @@ -1,4 +1,4 @@ -const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; +const char errlog_rcs[] = "$Id: errlog.c,v 1.11 2001/06/01 18:14:49 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/errlog.c,v $ @@ -7,7 +7,7 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; * printf-like fashion. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -33,96 +33,6 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; * * Revisions : * $Log: errlog.c,v $ - * Revision 1.36 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.35 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.34 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.33 2002/03/13 00:27:04 jongfoster - * Killing warnings - * - * Revision 1.32 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.31 2002/03/06 23:02:57 jongfoster - * Removing tabs - * - * Revision 1.30 2002/03/05 22:43:45 david__schmidt - * - Better error reporting on OS/2 - * - Fix double-slash comment (oops) - * - * Revision 1.29 2002/03/04 23:45:13 jongfoster - * Printing thread ID if using Win32 native threads - * - * Revision 1.28 2002/03/04 17:59:59 oes - * Deleted deletePidFile(), cosmetics - * - * Revision 1.27 2002/03/04 02:08:01 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.26 2002/01/09 19:05:45 steudten - * Fix big memory leak. - * - * Revision 1.25 2002/01/09 14:32:08 oes - * Added support for gmtime_r and localtime_r. - * - * Revision 1.24 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.23 2001/11/07 00:02:13 steudten - * Add line number in error output for lineparsing for - * actionsfile and configfile. - * Special handling for CLF added. - * - * Revision 1.22 2001/11/05 23:43:05 steudten - * Add time+date to log files. - * - * Revision 1.21 2001/10/25 03:40:47 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.20 2001/09/16 23:04:34 jongfoster - * Fixing a warning - * - * Revision 1.19 2001/09/13 20:08:06 jongfoster - * Adding support for LOG_LEVEL_CGI - * - * Revision 1.18 2001/09/10 11:27:24 oes - * Declaration of w32_socket_strerr now conditional - * - * Revision 1.17 2001/09/10 10:17:13 oes - * Removed unused variable; Fixed sprintf format - * - * Revision 1.16 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.15 2001/07/29 17:41:10 jongfoster - * Now prints thread ID for each message (pthreads only) - * - * Revision 1.14 2001/07/19 19:03:48 haroon - * - Added case for LOG_LEVEL_POPUPS - * - * Revision 1.13 2001/07/13 13:58:58 oes - * - Added case for LOG_LEVEL_DEANIMATE - * - Removed all #ifdef PCRS - * - * 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. @@ -206,22 +116,18 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; #include "config.h" -#include "miscutil.h" #include #include #include #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include -#endif /* !defined(_WIN32) && !defined(__OS2__) */ +#endif /* ndef _WIN32 */ #include -#include -#ifdef FEATURE_PTHREAD -#include -#endif /* def FEATURE_PTHREAD */ +/* #include */ #ifdef _WIN32 #include @@ -230,15 +136,8 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $"; #endif /* ndef _WIN_CONSOLE */ #endif /* def _WIN32 */ -#ifdef __OS2__ -#include /* For sock_errno */ -#define INCL_DOS -#include -#endif - #include "errlog.h" #include "project.h" -#include "jcc.h" const char errlog_h_rcs[] = ERRLOG_H_VERSION; @@ -253,14 +152,16 @@ const char errlog_h_rcs[] = ERRLOG_H_VERSION; /* where to log (default: stderr) */ static FILE *logfp = NULL; +/* where to log (NULL == stderr) */ +static char * logfilename = NULL; + /* logging detail level. */ static int debug = (LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO); /* static functions */ static void fatal_error(const char * error_message); -#ifdef _WIN32 -static char *w32_socket_strerr(int errcode, char *tmp_buf); -#endif +static char * w32_socket_strerr(int errcode, char * tmp_buf); + /********************************************************************* * @@ -279,7 +180,7 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf); static void fatal_error(const char * error_message) { #if defined(_WIN32) && !defined(_WIN_CONSOLE) - MessageBox(g_hwndLogFrame, error_message, "Privoxy Error", + MessageBox(g_hwndLogFrame, error_message, "Internet JunkBuster Error", MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); /* Cleanup - remove taskbar icon etc. */ @@ -289,17 +190,13 @@ static void fatal_error(const char * error_message) fputs(error_message, stderr); #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ -#if defined(unix) - unlink(pidfile); -#endif /* unix */ - exit(1); } /********************************************************************* * - * Function : init_error_log + * Function : init_errlog * * Description : Initializes the logging module. Must call before * calling log_error. @@ -323,7 +220,6 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) if ((logfp != NULL) && (logfp != stderr)) { - log_error(LOG_LEVEL_INFO, "(Re-)Open logfile %s", logfname ? logfname : "none"); fclose(logfp); } logfp = stderr; @@ -331,9 +227,9 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) /* set the designated log file */ if( logfname ) { - if( NULL == (fp = fopen(logfname, "a")) ) + if( !(fp = fopen(logfname, "a")) ) { - log_error(LOG_LEVEL_FATAL, "init_error_log(): can't open logfile: %s", logfname); + log_error(LOG_LEVEL_FATAL, "init_errlog(): can't open logfile: %s", logfname); } /* set logging to be completely unbuffered */ @@ -342,7 +238,7 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) logfp = fp; } - log_error(LOG_LEVEL_INFO, "Privoxy version " VERSION); + log_error(LOG_LEVEL_INFO, "Internet JunkBuster version " VERSION); if (prog_name != NULL) { log_error(LOG_LEVEL_INFO, "Program name: %s", prog_name); @@ -370,15 +266,10 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel) void log_error(int loglevel, char *fmt, ...) { va_list ap; - char *outbuf= NULL; - static char *outbuf_save = NULL; + char outbuf[BUFFER_SIZE]; char * src = fmt; int outc = 0; long this_thread = 1; /* was: pthread_t this_thread;*/ -#ifdef __OS2__ - PTIB ptib; - APIRET ulrc; -#endif /* __OS2__ */ #if defined(_WIN32) && !defined(_WIN_CONSOLE) /* @@ -399,95 +290,52 @@ void log_error(int loglevel, char *fmt, ...) } /* FIXME get current thread id */ -#ifdef FEATURE_PTHREAD - this_thread = (long)pthread_self(); -#elif defined(_WIN32) - this_thread = GetCurrentThreadId(); -#elif defined(__OS2__) - ulrc = DosGetInfoBlocks(&ptib, NULL); - if (ulrc == 0) - this_thread = ptib -> tib_ptib2 -> tib2_ultid; -#endif /* def FEATURE_PTHREAD */ - - if ( !outbuf_save ) - { - outbuf_save = outbuf = (char*)malloc(BUFFER_SIZE); - assert(outbuf); - } - outbuf = outbuf_save; - - { - /* - * Write timestamp into tempbuf. - * - * Complex because not all OSs have tm_gmtoff or - * the %z field in strftime() - */ - time_t now; - struct tm tm_now; - time (&now); -#ifdef HAVE_LOCALTIME_R - tm_now = *localtime_r(&now, &tm_now); -#else - tm_now = *localtime (&now); -#endif - strftime(outbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); - outbuf += strlen( outbuf ); - } + /* this_thread = (long)pthread_self(); */ + switch (loglevel) { case LOG_LEVEL_ERROR: - outc = sprintf(outbuf, "Privoxy(%ld) Error: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Error: ", this_thread); break; case LOG_LEVEL_FATAL: - outc = sprintf(outbuf, "Privoxy(%ld) Fatal error: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Fatal error: ", this_thread); break; case LOG_LEVEL_GPC: - outc = sprintf(outbuf, "Privoxy(%ld) Request: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Request: ", this_thread); break; case LOG_LEVEL_CONNECT: - outc = sprintf(outbuf, "Privoxy(%ld) Connect: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Connect: ", this_thread); break; case LOG_LEVEL_LOG: - outc = sprintf(outbuf, "Privoxy(%ld) Writing: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Writing: ", this_thread); break; case LOG_LEVEL_HEADER: - outc = sprintf(outbuf, "Privoxy(%ld) Header: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Header: ", this_thread); break; case LOG_LEVEL_INFO: - outc = sprintf(outbuf, "Privoxy(%ld) Info: ", this_thread); + outc = sprintf(outbuf, "IJB(%d) Info: ", this_thread); break; +#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; } @@ -498,7 +346,7 @@ void log_error(int loglevel, char *fmt, ...) while ((*src) && (outc < BUFFER_SIZE-2)) { char tempbuf[BUFFER_SIZE]; - char *sval = NULL; + char *sval; int ival; unsigned uval; long lval; @@ -562,7 +410,7 @@ void log_error(int loglevel, char *fmt, ...) else { /* Error */ - sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n" + sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n" "Format = \"%s\"\n" "Exiting.", this_thread, fmt); /* FIXME RACE HAZARD: should start critical section error_log_use here */ @@ -619,7 +467,7 @@ void log_error(int loglevel, char *fmt, ...) outc += ival; if (outc < BUFFER_SIZE-1) { - memcpy(outbuf + oldoutc, sval, (size_t) ival); + memcpy(outbuf + oldoutc, sval, ival); } else { @@ -631,11 +479,6 @@ void log_error(int loglevel, char *fmt, ...) #ifdef _WIN32 ival = WSAGetLastError(); sval = w32_socket_strerr(ival, tempbuf); -#elif __OS2__ - ival = sock_errno(); - if (ival == 0) - ival = errno; - sval = strerror(ival); #else /* ifndef _WIN32 */ ival = errno; #ifdef HAVE_STRERROR @@ -671,22 +514,11 @@ void log_error(int loglevel, char *fmt, ...) */ time_t now; struct tm *tm_now; - struct tm gmt; -#ifdef HAVE_LOCALTIME_R - struct tm dummy; -#endif + struct tm gmt; int days, hrs, mins; time (&now); -#ifdef HAVE_GMTIME_R - gmt = *gmtime_r(&now, &gmt); -#else - gmt = *gmtime(&now); -#endif -#ifdef HAVE_LOCALTIME_R - tm_now = localtime_r(&now, &dummy); -#else + gmt = *gmtime (&now); tm_now = localtime (&now); -#endif days = tm_now->tm_yday - gmt.tm_yday; hrs = ((days < -1 ? 24 : 1 < days ? -24 : days * 24) + tm_now->tm_hour - gmt.tm_hour); mins = hrs * 60 + tm_now->tm_min - gmt.tm_min; @@ -705,7 +537,7 @@ void log_error(int loglevel, char *fmt, ...) } break; default: - sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n" + sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n" "Format = \"%s\"\n" "Exiting.", this_thread, fmt); /* FIXME RACE HAZARD: should start critical section error_log_use here */ @@ -713,9 +545,9 @@ void log_error(int loglevel, char *fmt, ...) { logfp = stderr; } - fputs(outbuf_save, logfp); + fputs(outbuf, logfp); /* FIXME RACE HAZARD: should end critical section error_log_use here */ - fatal_error(outbuf_save); + fatal_error(outbuf); /* Never get here */ break; @@ -759,11 +591,11 @@ void log_error(int loglevel, char *fmt, ...) logfp = stderr; } - fputs(outbuf_save, logfp); + fputs(outbuf, logfp); if (loglevel == LOG_LEVEL_FATAL) { - fatal_error(outbuf_save); + fatal_error(outbuf); /* Never get here */ } @@ -771,7 +603,7 @@ void log_error(int loglevel, char *fmt, ...) #if defined(_WIN32) && !defined(_WIN_CONSOLE) /* Write to display */ - LogPutString(outbuf_save); + LogPutString(outbuf); #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ } @@ -795,7 +627,7 @@ void log_error(int loglevel, char *fmt, ...) * tmp_buf. * *********************************************************************/ -static char *w32_socket_strerr(int errcode, char *tmp_buf) +static char * w32_socket_strerr(int errcode, char * tmp_buf) { #define TEXT_FOR_ERROR(code,text) \ if (errcode == code) \ @@ -872,3 +704,4 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf) tab-width: 3 end: */ + diff --git a/errlog.h b/errlog.h index c3424dd0..b757d38e 100644 --- a/errlog.h +++ b/errlog.h @@ -1,6 +1,6 @@ -#ifndef ERRLOG_H_INCLUDED -#define ERRLOG_H_INCLUDED -#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.12 2002/03/24 13:25:43 swa Exp $" +#ifndef _ERRLOG_H +#define _ERRLOG_H +#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.4 2001/05/25 21:56:06 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/errlog.h,v $ @@ -9,7 +9,7 @@ * printf-like fashion. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,36 +35,6 @@ * * 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 * @@ -135,21 +105,17 @@ extern "C" { #define LOG_LEVEL_IO 0x0004 #define LOG_LEVEL_HEADER 0x0008 #define LOG_LEVEL_LOG 0x0010 -#ifdef FEATURE_FORCE_LOAD +#ifdef FORCE_LOAD #define LOG_LEVEL_FORCE 0x0020 -#endif /* def FEATURE_FORCE_LOAD */ +#endif /* def FORCE_LOAD */ +#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 @@ -167,7 +133,7 @@ extern const char errlog_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef ERRLOG_H_INCLUDED */ +#endif /* ndef _ERRLOG_H */ /* Local Variables: diff --git a/filters.c b/filters.c index 6f16d847..129efbfe 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster Exp $"; +const char filters_rcs[] = "$Id: filters.c,v 1.18 2001/06/29 13:27:38 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.c,v $ @@ -6,19 +6,19 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster * Purpose : Declares functions to parse/crunch headers and pages. * Functions declared include: * `acl_addr', `add_stats', `block_acl', `block_imageurl', - * `block_url', `url_actions', `domain_split', + * `block_url', `url_actions', `domaincmp', `dsplit', * `filter_popups', `forward_url', 'redirect_url', - * `ij_untrusted_url', `intercept_url', `pcrs_filter_respose', - * 'ijb_send_banner', and `trust_url' + * `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 @@ -38,172 +38,6 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster * * Revisions : * $Log: filters.c,v $ - * Revision 1.52 2002/03/24 16:35:57 jongfoster - * Removing logo - * - * Revision 1.51 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.50 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.49 2002/03/16 20:29:14 oes - * Cosmetics - * - * Revision 1.48 2002/03/13 20:25:34 oes - * Better logging for content filters - * - * Revision 1.47 2002/03/13 00:30:52 jongfoster - * Killing warnings - * Added option of always sending redirect for imageblock, - * currently disabled with #if 0. - * - * Revision 1.46 2002/03/12 01:42:49 oes - * Introduced modular filters - * - * Revision 1.45 2002/03/08 16:47:50 oes - * Added choice beween GIF and PNG built-in images - * - * Revision 1.44 2002/03/07 03:49:31 oes - * - Fixed compiler warnings etc - * - Changed built-in images from GIF to PNG - * (with regard to Unisys patent issue) - * - Added a 4x4 pattern PNG which is less intrusive - * than the logo but also clearly marks the deleted banners - * - * Revision 1.43 2002/01/22 23:51:59 jongfoster - * Replacing strsav() with the safer string_append(). - * - * Adding missing html_encode() to error message generators. Where encoded - * and unencoded versions of a string were provided, removing the unencoded - * one. - * - * Revision 1.42 2002/01/17 21:00:32 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Using a single, simple url_match(pattern,url) function - rather than - * the 3-line match routine which was repeated all over the place. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Using parse_http_url() to parse URLs without faking a HTTP - * request line for parse_http_request(). - * - * Revision 1.41 2001/11/13 00:14:07 jongfoster - * Fixing stupid bug now I've figured out what || means. - * (It always returns 0 or 1, not one of it's paramaters.) - * - * Revision 1.40 2001/10/26 17:37:55 oes - * - Re-enabled Netscape 200/404 bug workaround in block_url(): - * - Removed OS/2 special case - * - Made block_url() independant from sed() having been run - * - Made trust_url independant from sed() having been run - * - Made is_imageurl independant from sed() having been run. - * It now checks User-Agent: and Accept: by itself. - * - * - * Revision 1.39 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.38 2001/10/23 21:32:33 jongfoster - * Adding error-checking to selected functions - * - * Revision 1.37 2001/10/22 15:33:56 david__schmidt - * Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in - * filters.c. Added a FIXME in front of the offending code. I'll gladly - * put in a better/more robust fix for all parties if one is presented... - * It seems that just returning 200 instead of 404 would pretty much fix - * it for everyone, but I don't know all the history of the problem. - * - * Revision 1.36 2001/10/10 16:44:16 oes - * Added match_portlist function - * - * Revision 1.35 2001/10/07 15:41:23 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * New function remove_chunked_transfer_coding that strips chunked - * transfer coding to plain and is called by pcrs_filter_response - * and gif_deanimate_response if neccessary - * - * Improved handling of zero-change re_filter runs - * - * pcrs_filter_response and gif_deanimate_response now remove - * chunked transfer codeing before processing the body. - * - * Revision 1.34 2001/09/20 15:49:36 steudten - * - * Fix BUG: Change int size to size_t size in pcrs_filter_response(). - * See cgi.c fill_template(). - * - * Revision 1.33 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.32 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.31 2001/09/16 11:38:02 jongfoster - * Splitting fill_template() into 2 functions: - * template_load() loads the file - * template_fill() performs the PCRS regexps. - * This is because the CGI edit interface has a "table row" - * template which is used many times in the page - this - * change means it's only loaded from disk once. - * - * Revision 1.30 2001/09/16 11:00:10 jongfoster - * New function alloc_http_response, for symmetry with free_http_response - * - * Revision 1.29 2001/09/13 23:32:40 jongfoster - * Moving image data to cgi.c rather than cgi.h - * Fixing a GPF under Win32 (and any other OS that protects global - * constants from being written to). - * - * Revision 1.28 2001/09/10 10:18:51 oes - * Silenced compiler warnings - * - * Revision 1.27 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.26 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.25 2001/07/26 10:09:46 oes - * Made browser detection a little less naive - * - * Revision 1.24 2001/07/25 17:22:51 oes - * Added workaround for Netscape bug that prevents display of page when loading a component fails. - * - * Revision 1.23 2001/07/23 13:40:12 oes - * Fixed bug that caused document body to be dropped when pcrs joblist was empty. - * - * Revision 1.22 2001/07/18 12:29:34 oes - * - Made gif_deanimate_response respect - * csp->action->string[ACTION_STRING_DEANIMATE] - * - Logging cosmetics - * - * Revision 1.21 2001/07/13 13:59:53 oes - * - Introduced gif_deanimate_response which shares the - * generic content modification interface of pcrs_filter_response - * 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 @@ -386,34 +220,29 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster #include #include #include -#include #ifndef _WIN32 -#ifndef __OS2__ #include -#endif /* ndef __OS2__ */ #include #else #include -#endif /* ndef _WIN32 */ - -#ifdef __OS2__ -#include -#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" @@ -431,7 +260,7 @@ const char filters_h_rcs[] = FILTERS_H_VERSION; #define ijb_isdigit(__X) isdigit((int)(unsigned char)(__X)) -#ifdef FEATURE_ACL +#ifdef ACL_FILES /********************************************************************* * * Function : block_acl @@ -496,7 +325,7 @@ int block_acl(struct access_control_addr *dst, struct client_state *csp) * * Function : acl_addr * - * Description : Called from `load_config' to parse an ACL address. + * Description : Called from `load_aclfile' to parse an ACL address. * * Parameters : * 1 : aspec = String specifying ACL address. @@ -513,7 +342,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca) masklength = 32; port = 0; - if ((p = strchr(aspec, '/')) != NULL) + if ((p = strchr(aspec, '/'))) { *p++ = '\0'; @@ -529,7 +358,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca) return(-1); } - if ((p = strchr(aspec, ':')) != NULL) + if ((p = strchr(aspec, ':'))) { *p++ = '\0'; @@ -544,8 +373,9 @@ int acl_addr(char *aspec, struct access_control_addr *aca) aca->addr = ntohl(resolve_hostname_to_ip(aspec)); - if (aca->addr == INADDR_NONE) + if (aca->addr == -1) { + log_error(LOG_LEVEL_ERROR, "can't resolve address for %s", aspec); return(-1); } @@ -564,87 +394,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca) return(0); } -#endif /* def FEATURE_ACL */ - - -/********************************************************************* - * - * Function : match_portlist - * - * Description : Check if a given number is covered by a comma - * separated list of numbers and ranges (a,b-c,d,..) - * - * Parameters : - * 1 : portlist = String with list - * 2 : port = port to check - * - * Returns : 0 => no match - * 1 => match - * - *********************************************************************/ -int match_portlist(const char *portlist, int port) -{ - char *min, *max, *next, *portlist_copy; - - min = next = portlist_copy = strdup(portlist); - - /* - * Zero-terminate first item and remember offset for next - */ - if (NULL != (next = strchr(portlist_copy, (int) ','))) - { - *next++ = '\0'; - } - - /* - * Loop through all items, checking for match - */ - while(min) - { - if (NULL == (max = strchr(min, (int) '-'))) - { - /* - * No dash, check for equality - */ - if (port == atoi(min)) - { - free(portlist_copy); - return(1); - } - } - else - { - /* - * This is a range, so check if between min and max, - * or, if max was omitted, between min and 65K - */ - *max++ = '\0'; - if(port >= atoi(min) && port <= (atoi(max) ? atoi(max) : 65535)) - { - free(portlist_copy); - return(1); - } - - } - - /* - * Jump to next item - */ - min = next; - - /* - * Zero-terminate next item and remember offset for n+1 - */ - if ((NULL != next) && (NULL != (next = strchr(next, (int) ',')))) - { - *next++ = '\0'; - } - } - - free(portlist_copy); - return 0; - -} +#endif /* def ACL_FILES */ /********************************************************************* @@ -661,188 +411,90 @@ int match_portlist(const char *portlist, int port) *********************************************************************/ struct http_response *block_url(struct client_state *csp) { -#ifdef FEATURE_IMAGE_BLOCKING char *p; -#endif /* def FEATURE_IMAGE_BLOCKING */ struct http_response *rsp; + struct map *exports = NULL; - /* + /* * If it's not blocked, don't block it ;-) */ if ((csp->action->flags & ACTION_BLOCK) == 0) { - return NULL; + return(NULL); } - /* + /* * Else, prepare a response */ - if (NULL == (rsp = alloc_http_response())) + if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp)))) { - return cgi_error_memory(); + return NULL; } /* * If it's an image-url, send back an image or redirect * as specified by the relevant +image action */ -#ifdef FEATURE_IMAGE_BLOCKING +#ifdef IMAGE_BLOCKING if (((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0) && is_imageurl(csp)) { /* determine HOW images should be blocked */ p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER]; -#if 1 /* Two alternative strategies, use this one for now: */ - /* and handle accordingly: */ - if ((p == NULL) || (0 == strcmpic(p, "pattern"))) + if ((p == NULL) || (0 == strcmpic(p, "logo"))) { - rsp->body = bindup(image_pattern_data, image_pattern_length); - if (rsp->body == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->content_length = image_pattern_length; - - if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE)) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = bindup(JBGIF, sizeof(JBGIF)); + rsp->content_length = sizeof(JBGIF); + enlist_unique_header(rsp->headers, "Content-Type", "image/gif"); } else if (0 == strcmpic(p, "blank")) { - rsp->body = bindup(image_blank_data, image_blank_length); - if (rsp->body == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - rsp->content_length = image_blank_length; - - if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE)) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = bindup(BLANKGIF, sizeof(BLANKGIF)); + rsp->content_length = sizeof(BLANKGIF); + enlist_unique_header(rsp->headers, "Content-Type", "image/gif"); } else { - rsp->status = strdup("302 Local Redirect from Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - - if (enlist_unique_header(rsp->headers, "Location", p)) - { - free_http_response(rsp); - return cgi_error_memory(); - } - } - -#else /* Following code is disabled for now */ - - /* and handle accordingly: */ - if ((p == NULL) || (0 == strcmpic(p, "pattern"))) - { - p = CGI_PREFIX "send-banner?type=pattern"; - } - else if (0 == strcmpic(p, "blank")) - { - p = CGI_PREFIX "send-banner?type=blank"; - } - rsp->status = strdup("302 Local Redirect from Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); + rsp->status = strdup("302 Local Redirect from Junkbuster"); + enlist_unique_header(rsp->headers, "Location", p); } - - if (enlist_unique_header(rsp->headers, "Location", p)) - { - free_http_response(rsp); - return cgi_error_memory(); - } -#endif /* Preceeding code is disabled for now */ - } + } else -#endif /* def FEATURE_IMAGE_BLOCKING */ +#endif /* def IMAGE_BLOCKING */ - /* + /* * Else, generate an HTML "blocked" message: */ { - jb_err err; - struct map * exports; - /* - * Workaround for stupid Netscape bug which prevents - * pages from being displayed if loading a referenced - * JavaScript or style sheet fails. So make it appear - * as if it succeeded. - */ - if ( NULL != (p = get_header_value(csp->headers, "User-Agent:")) - && !strncmpic(p, "mozilla", 7) /* Catch Netscape but */ - && !strstr(p, "Gecko") /* save Mozilla, */ - && !strstr(p, "compatible") /* MSIE */ - && !strstr(p, "Opera")) /* and Opera. */ - { - rsp->status = strdup("200 Request for blocked URL"); - } - else - { - rsp->status = strdup("404 Request for blocked URL"); - } - - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - - exports = default_exports(csp, NULL); - if (exports == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - -#ifdef FEATURE_FORCE_LOAD - err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1); -#else /* ifndef FEATURE_FORCE_LOAD */ - err = map_block_killer(exports, "force-support"); -#endif /* ndef FEATURE_FORCE_LOAD */ + 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 @@ -859,12 +511,9 @@ struct http_response *block_url(struct client_state *csp) struct http_response *trust_url(struct client_state *csp) { struct http_response *rsp; - struct map * exports; - char buf[BUFFER_SIZE]; - char *p; - struct url_spec **tl; - struct url_spec *t; - jb_err err; + struct map *exports = NULL; + char buf[BUFFER_SIZE], *p = NULL; + struct url_spec **tl, *t; /* * Don't bother to work on trusted URLs @@ -874,120 +523,86 @@ struct http_response *trust_url(struct client_state *csp) return NULL; } - /* + /* * Else, prepare a response: */ - if (NULL == (rsp = alloc_http_response())) + if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp)))) { - return cgi_error_memory(); + return NULL; } - exports = default_exports(csp, NULL); - if (exports == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - /* + /* * Export the host, port, and referrer information */ - err = map(exports, "hostport", 1, csp->http->hostport, 1); - if (!err) err = map(exports, "path", 1, csp->http->path, 1); + exports = map(exports, "hostport", 1, csp->http->hostport, 1); + exports = map(exports, "path", 1, csp->http->path, 1); + exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0); + exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0); - if (NULL != (p = get_header_value(csp->headers, "Referer:"))) + if (csp->referrer && strlen(csp->referrer) > 9) { - if (!err) err = map(exports, "referrer", 1, html_encode(p), 0); + exports = map(exports, "referrer", 1, csp->referrer + 9, 1); + exports = map(exports, "referrer-html", 1, html_encode(csp->referrer + 9), 0); } else { - if (!err) err = map(exports, "referrer", 1, "unknown", 1); - } - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); + exports = map(exports, "referrer", 1, "unknown", 1); + exports = map(exports, "referrer-html", 1, "unknown", 1); } /* * Export the trust list */ - p = strdup(""); - for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++) + for (tl = csp->config->trust_list; (t = *tl) ; tl++) { sprintf(buf, "

  • %s
  • \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, "
  • %s
    \n",l->str, l->str); - string_append(&p, buf); + p = strsav(p, buf); } - err = map(exports, "trust-info", 1, p, 0); + exports = map(exports, "trust-info", 1, p, 0); } else { - err = map_block_killer(exports, "have-trust-info"); - } - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); + exports = map_block_killer(exports, "have-trust-info"); } - + /* * Export the force prefix or the force conditional block killer */ -#ifdef FEATURE_FORCE_LOAD - err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1); -#else /* ifndef FEATURE_FORCE_LOAD */ - err = map_block_killer(exports, "force-support"); -#endif /* ndef FEATURE_FORCE_LOAD */ - - if (err) - { - free_map(exports); - free_http_response(rsp); - return cgi_error_memory(); - } +#ifdef FORCE_LOAD + exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1); +#else + exports = map_block_killer(exports, "force-support"); +#endif /* ndef FORCE_LOAD */ /* * Build the response */ - err = template_fill_for_cgi(csp, "untrusted", exports, rsp); - if (err) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->body = fill_template(csp, "untrusted", exports); + free_map(exports); + + return(finish_http_response(rsp)); - return finish_http_response(rsp); } -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ -#ifdef FEATURE_FAST_REDIRECTS +#ifdef FAST_REDIRECTS /********************************************************************* * * Function : redirect_url @@ -1009,54 +624,50 @@ struct http_response *redirect_url(struct client_state *csp) p = q = csp->http->path; log_error(LOG_LEVEL_REDIRECTS, "checking path for redirects: %s", p); - /* + /* * find the last URL encoded in the request */ - while ((p = strstr(p, "http://")) != NULL) + while (p = strstr(p, "http://")) { q = p++; } - /* + /* * if there was any, generate and return a HTTP redirect */ if (q != csp->http->path) { log_error(LOG_LEVEL_REDIRECTS, "redirecting to: %s", q); - if (NULL == (rsp = alloc_http_response())) + if (NULL == ( rsp = zalloc(sizeof(*rsp)))) { - return cgi_error_memory(); + return NULL; } - if ( enlist_unique_header(rsp->headers, "Location", q) - || (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy"))) ) - { - free_http_response(rsp); - return cgi_error_memory(); - } + rsp->status = strdup("302 Local Redirect from Junkbuster"); + enlist_unique_header(rsp->headers, "Location", q); - return finish_http_response(rsp); + return(finish_http_response(rsp)); } else { - return NULL; + return(NULL); } } -#endif /* def FEATURE_FAST_REDIRECTS */ +#endif /* def FAST_REDIRECTS */ -#ifdef FEATURE_IMAGE_BLOCKING +#ifdef IMAGE_BLOCKING /********************************************************************* * * Function : is_imageurl * * Description : Given a URL, decide whether it is an image or not, * using either the info from a previous +image action - * or, #ifdef FEATURE_IMAGE_DETECT_MSIE, the info from - * the browser's accept header. - * + * or, #ifdef DETECT_MSIE_IMAGES, the info from the + * browser's accept header. + * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * @@ -1066,34 +677,28 @@ struct http_response *redirect_url(struct client_state *csp) *********************************************************************/ int is_imageurl(struct client_state *csp) { -#ifdef FEATURE_IMAGE_DETECT_MSIE - char *tmp; - - tmp = get_header_value(csp->headers, "User-Agent:"); - if (tmp && strstr(tmp, "MSIE")) +#ifdef DETECT_MSIE_IMAGES + if ((csp->accept_types + & (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE|ACCEPT_TYPE_MSIE_HTML)) + == (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE)) { - tmp = get_header_value(csp->headers, "Accept:"); - if (tmp && strstr(tmp, "image/gif")) - { - /* Client will accept HTML. If this seems counterintuitive, - * blame Microsoft. - */ - return(0); - } - else - { - return(1); - } + return 1; } -#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 @@ -1115,458 +720,530 @@ int is_untrusted_url(struct client_state *csp) { struct file_list *fl; struct block_spec *b; - struct url_spec **trusted_url; + struct url_spec url[1], **tl, *t; struct http_request rhttp[1]; - const char * referer; - jb_err err; + char *p, *h; - /* - * If we don't have a trustlist, we trust everybody - */ if (((fl = csp->tlist) == NULL) || ((b = fl->f) == NULL)) { - return 0; + return(0); } + *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; } diff --git a/filters.h b/filters.h index 82b59cef..67d6edf7 100644 --- a/filters.h +++ b/filters.h @@ -1,6 +1,6 @@ -#ifndef FILTERS_H_INCLUDED -#define FILTERS_H_INCLUDED -#define FILTERS_H_VERSION "$Id: filters.h,v 1.18 2002/03/25 22:12:45 oes Exp $" +#ifndef _FILTERS_H +#define _FILTERS_H +#define FILTERS_H_VERSION "$Id: filters.h,v 1.9 2001/06/07 23:10:53 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.h,v $ @@ -8,12 +8,13 @@ * Purpose : Declares functions to parse/crunch headers and pages. * Functions declared include: * `acl_addr', `add_stats', `block_acl', `block_imageurl', - * `block_url', `url_actions', `filter_popups', `forward_url' + * `block_url', `url_actions', `domaincmp', `dsplit', + * `filter_popups', `forward_url' * `ij_untrusted_url', `intercept_url', `re_process_buffer', * `show_proxy_args', and `trust_url' * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -39,40 +40,6 @@ * * 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 * @@ -195,43 +162,32 @@ extern "C" { #endif - -struct access_control_addr; -struct client_state; -struct http_request; -struct http_response; -struct current_action_spec; -struct url_actions; -struct url_spec; - - /* * ACL checking */ -#ifdef FEATURE_ACL +#ifdef ACL_FILES extern int block_acl(struct access_control_addr *dst, struct client_state *csp); extern int acl_addr(char *aspec, struct access_control_addr *aca); -#endif /* def FEATURE_ACL */ -extern int match_portlist(const char *portlist, int port); +#endif /* def ACL_FILES */ /* * Interceptors */ extern struct http_response *block_url(struct client_state *csp); extern struct http_response *redirect_url(struct client_state *csp); -#ifdef FEATURE_COOKIE_JAR +#ifdef TRUST_FILES extern struct http_response *trust_url(struct client_state *csp); -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def TRUST_FILES */ /* * Request inspectors */ -#ifdef FEATURE_COOKIE_JAR +#ifdef TRUST_FILES extern int is_untrusted_url(struct client_state *csp); -#endif /* def FEATURE_COOKIE_JAR */ -#ifdef FEATURE_IMAGE_BLOCKING +#endif /* def TRUST_FILES */ +#ifdef IMAGE_BLOCKING extern int is_imageurl(struct client_state *csp); -#endif /* def FEATURE_IMAGE_BLOCKING */ +#endif /* def IMAGE_BLOCKING */ /* * Determining applicable actions @@ -246,23 +202,17 @@ extern void apply_url_actions(struct current_action_spec *action, */ extern const struct forward_spec *forward_url(struct http_request *http, struct client_state *csp); -/* - * 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[]; @@ -270,7 +220,7 @@ extern const char filters_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef FILTERS_H_INCLUDED */ +#endif /* ndef _FILTERS_H */ /* Local Variables: diff --git a/gateway.c b/gateway.c index cff71726..13273f6c 100644 --- a/gateway.c +++ b/gateway.c @@ -1,4 +1,4 @@ -const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; +const char gateway_rcs[] = "$Id: gateway.c,v 1.2 2001/06/07 23:11:38 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/gateway.c,v $ @@ -8,13 +8,13 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" * proxy). * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at @@ -34,68 +34,6 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: gateway.c,v $ - * Revision 1.14 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.13 2002/03/13 00:29:59 jongfoster - * Killing warnings - * - * Revision 1.12 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.11 2002/03/08 17:46:04 jongfoster - * Fixing int/size_t warnings - * - * Revision 1.10 2002/03/07 03:50:19 oes - * - Improved handling of failed DNS lookups - * - Fixed compiler warnings - * - * Revision 1.9 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.8 2001/09/13 20:10:12 jongfoster - * Fixing missing #include under Windows - * - * Revision 1.7 2001/09/12 17:58:26 steudten - * - * add #include - * - * Revision 1.6 2001/09/10 10:41:16 oes - * Added #include in.h - * - * Revision 1.5 2001/07/29 18:47:57 jongfoster - * Adding missing #include project.h - * - * Revision 1.4 2001/07/24 12:47:06 oes - * Applied BeOS support update by Eugenia - * - * Revision 1.3 2001/06/09 10:55:28 jongfoster - * Changing BUFSIZ ==> BUFFER_SIZE - * * Revision 1.2 2001/06/07 23:11:38 jongfoster * Removing gateways[] list - no longer used. * Replacing function pointer in struct gateway with a directly @@ -118,27 +56,12 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" #include #include - -#ifndef _WIN32 -#include -#endif - #include -#include #ifdef _WIN32 #include #endif /* def _WIN32 */ -#ifdef __BEOS__ -#include -#endif /* def __BEOS__ */ - -#ifdef __OS2__ -#include -#endif /* def __OS2__ */ - -#include "project.h" #include "jcc.h" #include "errlog.h" #include "jbsockets.h" @@ -146,10 +69,10 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $" const char gateway_h_rcs[] = GATEWAY_H_VERSION; -static jb_socket socks4_connect(const struct forward_spec * fwd, - const char * target_host, - int target_port, - struct client_state *csp); +static int socks4_connect(const struct forward_spec * fwd, + const char * target_host, + int target_port, + struct client_state *csp); #define SOCKS_REQUEST_GRANTED 90 @@ -193,9 +116,9 @@ static const char socks_userid[] = "anonymous"; * Returns : -1 => failure, else it is the socket file descriptor. * *********************************************************************/ -jb_socket forwarded_connect(const struct forward_spec * fwd, - struct http_request *http, - struct client_state *csp) +int forwarded_connect(const struct forward_spec * fwd, + struct http_request *http, + struct client_state *csp) { const char * dest_host; int dest_port; @@ -228,7 +151,7 @@ jb_socket forwarded_connect(const struct forward_spec * fwd, /* Should never get here */ log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type."); errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } } @@ -251,19 +174,19 @@ jb_socket forwarded_connect(const struct forward_spec * fwd, * Returns : -1 => failure, else a socket file descriptor. * *********************************************************************/ -static jb_socket socks4_connect(const struct forward_spec * fwd, - const char * target_host, - int target_port, - struct client_state *csp) +static int socks4_connect(const struct forward_spec * fwd, + const char * target_host, + int target_port, + struct client_state *csp) { int web_server_addr; - char cbuf[BUFFER_SIZE]; - char sbuf[BUFFER_SIZE]; + unsigned char cbuf[BUFFER_SIZE]; + unsigned char sbuf[BUFFER_SIZE]; struct socks_op *c = (struct socks_op *)cbuf; struct socks_reply *s = (struct socks_reply *)sbuf; - size_t n; - size_t csiz; - jb_socket sfd; + int n; + int csiz; + int sfd; int err = 0; char *errstr; @@ -282,7 +205,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, if (err) { errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } /* build a socks request for connection to the web server */ @@ -295,11 +218,6 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, { case SOCKS_4: web_server_addr = htonl(resolve_hostname_to_ip(target_host)); - if (web_server_addr == INADDR_NONE) - { - log_error(LOG_LEVEL_CONNECT, "socks4_connect: could not resolve target host %s", target_host); - return(JB_INVALID_SOCKET); - } break; case SOCKS_4A: web_server_addr = 0x00000001; @@ -307,16 +225,16 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, if (n > sizeof(cbuf)) { errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } - strcpy(cbuf + csiz, target_host); + strcpy(((char *)cbuf) + csiz, target_host); csiz = n; break; default: /* Should never get here */ log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type."); errno = EINVAL; - return(JB_INVALID_SOCKET); + return(-1); } c->vn = 4; @@ -331,23 +249,23 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, /* pass the request to the socks server */ sfd = connect_to(fwd->gateway_host, fwd->gateway_port, csp); - if (sfd == JB_INVALID_SOCKET) + if (sfd < 0) { - return(JB_INVALID_SOCKET); + return(-1); } - if (write_socket(sfd, (char *)c, csiz)) + if ((n = write_socket(sfd, (char *)c, csiz)) != csiz) { log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation write failed..."); close_socket(sfd); - return(JB_INVALID_SOCKET); + return(-1); } - if (read_socket(sfd, sbuf, sizeof(sbuf)) != sizeof(*s)) + if ((n = read_socket(sfd, sbuf, sizeof(sbuf))) != sizeof(*s)) { log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation read failed..."); close_socket(sfd); - return(JB_INVALID_SOCKET); + return(-1); } switch (s->cd) @@ -371,7 +289,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, errno = EACCES; break; default: - errstr = cbuf; + errstr = (char *) cbuf; errno = ENOENT; sprintf(errstr, "SOCKS request rejected for reason code %d\n", s->cd); @@ -380,7 +298,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd, log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s ...", errstr); close_socket(sfd); - return(JB_INVALID_SOCKET); + return(-1); } diff --git a/gateway.h b/gateway.h index d96bc58d..5f1eb826 100644 --- a/gateway.h +++ b/gateway.h @@ -1,6 +1,6 @@ -#ifndef GATEWAY_H_INCLUDED -#define GATEWAY_H_INCLUDED -#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.6 2002/03/25 22:12:45 oes Exp $" +#ifndef _GATEWAY_H +#define _GATEWAY_H +#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/gateway.h,v $ @@ -10,7 +10,7 @@ * proxy). Also contains the list of gateway types. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -36,48 +36,6 @@ * * 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 * @@ -85,28 +43,17 @@ *********************************************************************/ +#include "project.h" + #ifdef __cplusplus extern "C" { #endif -struct forward_spec; -struct http_request; -struct client_state; +extern int forwarded_connect(const struct forward_spec * fwd, + struct http_request *http, + struct client_state *csp); -extern jb_socket forwarded_connect(const struct forward_spec * fwd, - struct http_request *http, - struct client_state *csp); - -/* - * Solaris fix - */ -#ifndef INADDR_NONE -#define INADDR_NONE -1 -#endif - -/* - * Revision control strings from this header and associated .c file - */ +/* Revision control strings from this header and associated .c file */ extern const char gateway_rcs[]; extern const char gateway_h_rcs[]; @@ -114,7 +61,7 @@ extern const char gateway_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef GATEWAY_H_INCLUDED */ +#endif /* ndef _GATEWAY_H */ /* Local Variables: diff --git a/icons/denyrule.ico b/icons/denyrule.ico new file mode 100644 index 0000000000000000000000000000000000000000..e5aa250604fb73ae2bedf554aed994cdac982f02 GIT binary patch literal 318 zcmZvXF%H5o6hmJnB$SCxtT1xSGBMIMw~5pP^bClhbH##0rC=vy!-?%L|No@~I-S1n zF)ke(?V^*j*s+sBD*8_b&}A5^NmY_klDm=1C1+Qnjw4G$7*z#`Q7$$Qs@)55ERNhG z3fvN+5+TI8BJ-$4f!8$h+o_wLZtxS94@|Gh=K>FLo#B0l?Ib_wFMGI7a9d&C{PxN( D6JJL~ literal 0 HcmV?d00001 diff --git a/icons/icon1.ico b/icons/icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..b96fe7c27d160d8fd002a84ab474d95dc5124340 GIT binary patch literal 318 zcmZvW!3{zo5JVru0yuf~hm&1cnso3>uoZ5<4HFyCn_k2j_(n|}csrBbB>{p?N(pNp zU~3odOd_yRh1%=CQb3ndhN&u2Yn6M@`lU4|q2rdzM{&fMryg?7_PDyb9z-?Y?i|;i oSNq`Gz0l;vw4L1;~mrO#lD@ literal 0 HcmV?d00001 diff --git a/icons/idle.ico b/icons/idle.ico index 5ef20fc1391b376205c3c83346a7754fc6f4df97..99470b54e0402ab4b18229f78ee0eb5121583796 100644 GIT binary patch delta 102 zcmdnTw2x`Rgcv0dU|`T%rL=055(CpJtwlhjpah|nFlZ&PJWvaeUIo$$;WI&K1qKMs L0H#+>d=mr!__HIV delta 102 zcmdnTw2x`Rgcz+wN=ix$3`!812|_C^9SR6#JS_M)GqE~_GMM_9C6GU7AXbwmn L&^!>B_$CMdJ?tAS diff --git a/icons/privoxy.ico b/icons/junkbust.ico similarity index 59% rename from icons/privoxy.ico rename to icons/junkbust.ico index 4c96d0b1a9d1f10fb1494c06c6ff05cd936a0710..41aafd0a203a7c7e451b068f5a08b265e775b72b 100644 GIT binary patch delta 102 zcmdnTw2x`RgqSlRz`$_+|C#^)&oJ=(KmP}a4xE9|XE5k9V0oYxApIYt6~gC%&<7YG MGy|CaKk-cv0Cy};9smFU delta 102 zcmdnTw2x`RgqZVx&YU^Jz;Fga^FZhWXCO3C3M>wy|NjT61kwM&^q(_GG!I1l0MHze MI-q$VF!46nx4Guxtph3RP*8Qe|#n#HrHd7%o$$GmoHFmD?PH2Us9iaOqM=WdTB% znRz75T?B;|4{R?=f z^qU3zEChCf7^6nXlG4$!3cqXV?wB>T&g(91X*X|NcWs}a>C*o&E&g@Ug`D&V(4}$+ zecwYoe^oK~p?lkiHVf z9OhzmeIJR~nV#_dAS2`4G4_sd$xlp)k;EiC^bO9PkEq8uFYf{frrtd3(k|^sHp(Ij z7XSakkcCGWqw@uEoz%wY?8|$cm0H23QhKzNE_Ad`2w%co_zAoP9)MR7XAN8d`LZs7 z_rNn81WfB13>Z&vLIcFPf=1zI7&Gsf-MC7kEBff9J|LQ>KgI|S%kp^x@9~{w3F-U1&f|bp%hEpH|8jdom z)^Z3`ot8u35zZ$vh}--vr*eb2I5V8z>74#pOPWv&x|aMMw{HSVT$_BHW7ge3#P{V? zuHCf22@BaahT&&@f8;Vko+ixY)2cVUgZ<0Wc_G9-UC69vi5e;Xb&#~XO^vA;$ z4X5*kj}7ffoyZ;O$${2`>lMFhIcK!3H!hjj)mCx9nsEvBej@;MgiwW%DN;&QHF9zA zIx~`{lER;O?SaRZw^o&*|6|G(^*-NeMzer3^HL*bQ8Gr0(ct2Er+cev3$@bcEH!FJ QeY>h2Rk^Q4KNmS@c4K68GY3E^T+pKH^)@F2e P9o)~%e1Qv{?GC&F|Die+ diff --git a/icons/os22.ico b/icons/os22.ico deleted file mode 100644 index d357dfba4eaefb36918d3f104f07017d465a5afa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmbtQu?@m75WE-)I@kcqWu^$EqG1B2U;>XqohdvLqM|c*ej_7c(Qxnkd;i7%QjUiU z8s^iPmkr}VoyZ;O$$`;>>oq@mIcKz~R}PuzYN|M3&HN2{zYzf*#Aw3I5-BCBj9d=5 zofXMYOX*KM_rQJ2T`Obk|Cq8x-upYf(ObZU;H816qC!`yD-yg(KQDxwv1*_?Yus$k LQs<3rPu=?hUAQ={ diff --git a/icons/os23.ico b/icons/os23.ico deleted file mode 100644 index 8ac037f045701b0bed5cadc3586b3d31ecfb3755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmbtQu?+$-5c3BLI@o~Mm6_s!iiQc8f(bGTb*9Kjh>9-QNzfyRXz<17obPid{eE}G zjKlH7V#T;qCvroM}sksV9EGx>ixC^@F1lIMy8miiBzNd z0k<=w=qf4vX^$;%TXWZdk_3Vb;*nzIUzc N(G+j3f%fr+2VT1WI5hwO diff --git a/icons/os26.ico b/icons/os26.ico deleted file mode 100644 index 408d89efd66fed1304cfe0cfa40295a27fba7ad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmbu5!41MN3`O0-0dav1h&oAu6Bj063MR-bJ!XoIgg9{v@5i7Z5pm%=-{1LeY^jI+ z#VU@cGnW-{M@P7Y0d_RETup3*qPln>{>Wu`^S_m>b<|y8@)B_hapG@fJ{<~EEJN;*UE72PLF, 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 @@ -179,9 +90,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex #else -#ifndef __OS2__ #include -#endif #include #include #include @@ -190,20 +99,11 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex #ifndef __BEOS__ #include -#ifndef __OS2__ #include -#endif #else #include #endif -#if defined(__EMX__) || defined (__OS2__) -#include /* OS/2/EMX needs a little help with select */ -#ifdef __OS2__ -#include -#endif -#endif - #endif #include "project.h" @@ -227,72 +127,58 @@ const char jbsockets_h_rcs[] = JBSOCKETS_H_VERSION; * 3 : csp = Current client state (buffers, headers, etc...) * Not modified, only used for source IP and ACL. * - * Returns : JB_INVALID_SOCKET => failure, else it is the socket - * file descriptor. + * Returns : -1 => failure, else it is the socket file descriptor. * *********************************************************************/ -jb_socket connect_to(const char *host, int portnum, struct client_state *csp) +int connect_to(const char *host, int portnum, struct client_state *csp) { struct sockaddr_in inaddr; - jb_socket fd; - int addr; + int fd, addr; fd_set wfds; struct timeval tv[1]; #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) int flags; #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ -#ifdef FEATURE_ACL +#ifdef ACL_FILES struct access_control_addr dst[1]; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ memset((char *)&inaddr, 0, sizeof inaddr); - if ((addr = resolve_hostname_to_ip(host)) == INADDR_NONE) + if ((addr = resolve_hostname_to_ip(host)) == -1) { csp->http->host_ip_addr_str = strdup("unknown"); - return(JB_INVALID_SOCKET); + return(-1); } -#ifdef FEATURE_ACL - dst->addr = ntohl((unsigned long) addr); +#ifdef ACL_FILES + dst->addr = ntohl(addr); dst->port = portnum; if (block_acl(dst, csp)) { -#ifdef __OS2__ - errno = SOCEPERM; -#else errno = EPERM; -#endif - return(JB_INVALID_SOCKET); + return(-1); } -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ inaddr.sin_addr.s_addr = addr; inaddr.sin_family = AF_INET; csp->http->host_ip_addr_str = strdup(inet_ntoa(inaddr.sin_addr)); -#ifndef _WIN32 if (sizeof(inaddr.sin_port) == sizeof(short)) -#endif /* ndef _WIN32 */ { - inaddr.sin_port = htons((unsigned short) portnum); + inaddr.sin_port = htons((short)portnum); } -#ifndef _WIN32 else { - inaddr.sin_port = htonl((unsigned long)portnum); + inaddr.sin_port = htonl(portnum); } -#endif /* ndef _WIN32 */ -#ifdef _WIN32 - if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) == JB_INVALID_SOCKET) -#else if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) < 0) -#endif { - return(JB_INVALID_SOCKET); + return(-1); } #ifdef TCP_NODELAY @@ -302,45 +188,39 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) } #endif /* def TCP_NODELAY */ -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) if ((flags = fcntl(fd, F_GETFL, 0)) != -1) { flags |= O_NDELAY; fcntl(fd, F_SETFL, flags); } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ - while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == JB_INVALID_SOCKET) + while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == -1) { #ifdef _WIN32 if (errno == WSAEINPROGRESS) -#elif __OS2__ - if (sock_errno() == EINPROGRESS) #else /* ifndef _WIN32 */ if (errno == EINPROGRESS) -#endif /* ndef _WIN32 || __OS2__ */ +#endif /* ndef _WIN32 */ { break; } -#ifdef __OS2__ - if (sock_errno() != EINTR) -#else if (errno != EINTR) -#endif /* __OS2__ */ { close_socket(fd); - return(JB_INVALID_SOCKET); + return(-1); } } -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) if (flags != -1) { flags &= ~O_NDELAY; fcntl(fd, F_SETFL, flags); } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */ /* wait for connection to complete */ FD_ZERO(&wfds); @@ -349,11 +229,10 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) tv->tv_sec = 30; tv->tv_usec = 0; - /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */ - if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0) + if (select(fd + 1, NULL, &wfds, NULL, tv) <= 0) { close_socket(fd); - return(JB_INVALID_SOCKET); + return(-1); } return(fd); @@ -371,51 +250,24 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp) * 2 : buf = pointer to data to be written. * 3 : len = length of data to be written to the socket "fd". * - * Returns : 0 on success (entire buffer sent). - * nonzero on error. + * Returns : Win32 & Unix: If no error occurs, returns the total number of + * bytes sent, which can be less than the number + * indicated by len. Otherwise, returns (-1). * *********************************************************************/ -int write_socket(jb_socket fd, const char *buf, size_t len) +int write_socket(int fd, const char *buf, int len) { - if (len == 0) - { - return 0; - } - - if (len < 0) + if (len <= 0) { - return 1; + return(0); } log_error(LOG_LEVEL_LOG, "%N", len, buf); -#if defined(_WIN32) - return (send(fd, buf, (int)len, 0) != (int)len); -#elif defined(__BEOS__) || defined(AMIGA) - return (send(fd, buf, len, 0) != len); -#elif defined(__OS2__) - /* - * Break the data up into SOCKET_SEND_MAX chunks for sending... - * OS/2 seemed to complain when the chunks were too large. - */ -#define SOCKET_SEND_MAX 65000 - { - int write_len = 0, send_len, send_rc = 0, i = 0; - while ((i < len) && (send_rc != -1)) - { - if ((i + SOCKET_SEND_MAX) > len) - send_len = len - i; - else - send_len = SOCKET_SEND_MAX; - send_rc = send(fd,(char*)buf + i, send_len, 0); - if (send_rc == -1) - return 1; - i = i + send_len; - } - return 0; - } +#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA) + return( send(fd, buf, len, 0)); #else - return (write(fd, buf, len) != len); + return( write(fd, buf, len)); #endif } @@ -439,26 +291,24 @@ int write_socket(jb_socket fd, const char *buf, size_t len) * smaller than the number of bytes requested; this may hap- * pen for example because fewer bytes are actually available * right now (maybe because we were close to end-of-file, or - * because we are reading from a pipe, or from a terminal, - * or because read() was interrupted by a signal). On error, + * because we are reading from a pipe, or from a terminal), + * or because read() was interrupted by a signal. On error, * -1 is returned, and errno is set appropriately. In this * case it is left unspecified whether the file position (if * any) changes. * *********************************************************************/ -int read_socket(jb_socket fd, char *buf, int len) +int read_socket(int fd, char *buf, int len) { if (len <= 0) { return(0); } -#if defined(_WIN32) - return(recv(fd, buf, len, 0)); -#elif defined(__BEOS__) || defined(AMIGA) || defined(__OS2__) - return(recv(fd, buf, (size_t)len, 0)); +#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA) + return( recv(fd, buf, len, 0)); #else - return(read(fd, buf, (size_t)len)); + return( read(fd, buf, len)); #endif } @@ -475,14 +325,12 @@ int read_socket(jb_socket fd, char *buf, int len) * Returns : void * *********************************************************************/ -void close_socket(jb_socket fd) +void close_socket(int fd) { #if defined(_WIN32) || defined(__BEOS__) closesocket(fd); #elif defined(AMIGA) CloseSocket(fd); -#elif defined(__OS2__) - soclose(fd); #else close(fd); #endif @@ -500,69 +348,44 @@ void close_socket(jb_socket fd) * Parameters : * 1 : hostnam = TCP/IP address to bind/listen to * 2 : portnum = port to listen on - * 3 : pfd = pointer used to return file descriptor. * - * Returns : if success, returns 0 and sets *pfd. - * if failure, returns -3 if address is in use, - * -2 if address unresolvable, - * -1 otherwise + * Returns : if success, return file descriptor + * if failure, returns -2 if address is in use, otherwise -1 + * *********************************************************************/ -int bind_port(const char *hostnam, int portnum, jb_socket *pfd) +int bind_port(const char *hostnam, int portnum) { struct sockaddr_in inaddr; - jb_socket fd; -#ifndef _WIN32 + int fd; int one = 1; -#endif /* ndef _WIN32 */ - - *pfd = JB_INVALID_SOCKET; memset((char *)&inaddr, '\0', sizeof inaddr); inaddr.sin_family = AF_INET; inaddr.sin_addr.s_addr = resolve_hostname_to_ip(hostnam); - if (inaddr.sin_addr.s_addr == INADDR_NONE) - { - return(-2); - } - -#ifndef _WIN32 if (sizeof(inaddr.sin_port) == sizeof(short)) -#endif /* ndef _WIN32 */ { - inaddr.sin_port = htons((unsigned short) portnum); + inaddr.sin_port = htons((short)portnum); } -#ifndef _WIN32 else { - inaddr.sin_port = htonl((unsigned long) portnum); + inaddr.sin_port = htonl(portnum); } -#endif /* ndef _WIN32 */ fd = socket(AF_INET, SOCK_STREAM, 0); -#ifdef _WIN32 - if (fd == JB_INVALID_SOCKET) -#else if (fd < 0) -#endif { return(-1); } #ifndef _WIN32 /* - * This is not needed for Win32 - in fact, it stops + * FIXME: This is not needed for Win32 - in fact, it stops * duplicate instances of JunkBuster from being caught. - * - * On UNIX, we assume the user is sensible enough not - * to start JunkBuster multiple times on the same IP. - * Without this, stopping and restarting JunkBuster - * from a script fails. - * Note: SO_REUSEADDR is meant to only take over - * sockets which are *not* in listen state in Linux, - * e.g. sockets in TIME_WAIT. YMMV. + * Is this really needed under UNIX, or should it be taked out? + * -- Jon */ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); #endif /* ndef _WIN32 */ @@ -576,7 +399,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) if (errno == EADDRINUSE) #endif { - return(-3); + return(-2); } else { @@ -592,8 +415,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) } } - *pfd = fd; - return 0; + return fd; } @@ -614,80 +436,39 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd) * On an error it returns 0 (FALSE). * *********************************************************************/ -int accept_connection(struct client_state * csp, jb_socket fd) +int accept_connection(struct client_state * csp, int fd) { - struct sockaddr_in client, server; + struct 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 { @@ -696,8 +477,8 @@ int accept_connection(struct client_state * csp, jb_socket fd) } 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; @@ -714,22 +495,13 @@ int accept_connection(struct client_state * csp, jb_socket fd) * Parameters : * 1 : host = hostname to resolve * - * Returns : INADDR_NONE => failure, INADDR_ANY or tcp/ip address if succesful. + * Returns : -1 => failure, INADDR_ANY or tcp/ip address if succesful. * *********************************************************************/ -unsigned long resolve_hostname_to_ip(const char *host) +int resolve_hostname_to_ip(const char *host) { struct sockaddr_in inaddr; struct hostent *hostp; -#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS) - struct hostent result; -#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) - char hbuf[HOSTENT_BUFFER_SIZE]; - int thd_err; -#else /* defined(HAVE_GETHOSTBYNAME_R_3_ARGS) */ - struct hostent_data hdata; -#endif /* def HAVE_GETHOSTBYNAME_R_(6|5)_ARGS */ -#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */ if ((host == NULL) || (*host == '\0')) { @@ -740,29 +512,10 @@ unsigned long resolve_hostname_to_ip(const char *host) if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1) { -#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) - gethostbyname_r(host, &result, hbuf, - HOSTENT_BUFFER_SIZE, &hostp, &thd_err); -#elif defined(HAVE_GETHOSTBYNAME_R_5_ARGS) - hostp = gethostbyname_r(host, &result, hbuf, - HOSTENT_BUFFER_SIZE, &thd_err); -#elif defined(HAVE_GETHOSTBYNAME_R_3_ARGS) - if (0 == gethostbyname_r(host, &result, &hdata)) - { - hostp = &result; - } - else - { - hostp = NULL; - } -#else - hostp = gethostbyname(host); -#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */ - if (hostp == NULL) + if ((hostp = gethostbyname(host)) == NULL) { errno = EINVAL; - log_error(LOG_LEVEL_ERROR, "could not resolve hostname %s", host); - return(INADDR_NONE); + return(-1); } if (hostp->h_addrtype != AF_INET) { @@ -770,9 +523,8 @@ unsigned long resolve_hostname_to_ip(const char *host) errno = WSAEPROTOTYPE; #else errno = EPROTOTYPE; -#endif - log_error(LOG_LEVEL_ERROR, "hostname %s resolves to unknown address type.", host); - return(INADDR_NONE); +#endif + return(-1); } memcpy( (char *) &inaddr.sin_addr, diff --git a/jbsockets.h b/jbsockets.h index 31393301..7c1ee588 100644 --- a/jbsockets.h +++ b/jbsockets.h @@ -1,6 +1,6 @@ -#ifndef JBSOCKETS_H_INCLUDED -#define JBSOCKETS_H_INCLUDED -#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.7 2002/03/24 13:25:43 swa Exp $" +#ifndef _JBSOCKETS_H +#define _JBSOCKETS_H +#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jbsockets.h,v $ @@ -11,7 +11,7 @@ * on many platforms. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,47 +37,6 @@ * * 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 * @@ -85,23 +44,19 @@ *********************************************************************/ -#include "project.h" - #ifdef __cplusplus extern "C" { #endif -struct client_state; - -extern jb_socket connect_to(const char *host, int portnum, struct client_state *csp); -extern int write_socket(jb_socket fd, const char *buf, size_t n); -extern int read_socket(jb_socket fd, char *buf, int n); -extern void close_socket(jb_socket fd); +extern int connect_to(const char *host, int portnum, struct client_state *csp); +extern int write_socket(int fd, const char *buf, int n); +extern int read_socket(int fd, char *buf, int n); +extern void close_socket(int fd); -extern int bind_port(const char *hostnam, int portnum, jb_socket *pfd); -extern int accept_connection(struct client_state * csp, jb_socket fd); +extern int bind_port(const char *hostnam, int portnum); +extern int accept_connection(struct client_state * csp, int fd); -extern unsigned long resolve_hostname_to_ip(const char *host); +extern int resolve_hostname_to_ip(const char *host); /* Revision control strings from this header and associated .c file */ extern const char jbsockets_rcs[]; @@ -111,7 +66,7 @@ extern const char jbsockets_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef JBSOCKETS_H_INCLUDED */ +#endif /* ndef _JBSOCKETS_H */ /* Local Variables: diff --git a/jcc.c b/jcc.c index f3cd6e96..cbc88ce0 100644 --- a/jcc.c +++ b/jcc.c @@ -1,19 +1,19 @@ -const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; +const char jcc_rcs[] = "$Id: jcc.c,v 1.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 @@ -33,310 +33,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; * * Revisions : * $Log: jcc.c,v $ - * Revision 1.87 2002/03/26 22:29:54 swa - * we have a new homepage! - * - * Revision 1.86 2002/03/25 17:04:55 david__schmidt - * Workaround for closing the jarfile before load_config() comes around again - * - * Revision 1.85 2002/03/24 15:23:33 jongfoster - * Name changes - * - * Revision 1.84 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.83 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.82 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.81 2002/03/12 01:42:50 oes - * Introduced modular filters - * - * Revision 1.80 2002/03/11 22:07:05 david__schmidt - * OS/2 port maintenance: - * - Fixed EMX build - it had decayed a little - * - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro. - * substituted a memset for now. - * - * Revision 1.79 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.78 2002/03/08 21:35:04 oes - * Added optional group supplement to --user option. Will now use default group of user if no group given - * - * Revision 1.77 2002/03/07 03:52:06 oes - * - Fixed compiler warnings etc - * - Improved handling of failed DNS lookups - * - * Revision 1.76 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.75 2002/03/06 10:02:19 oes - * Fixed stupid bug when --user was not given - * - * Revision 1.74 2002/03/06 00:49:31 jongfoster - * Fixing warning on Windows - * Making #ifdefs that refer to the same variable consistently - * use #ifdef unix rather than mixing #ifdef unix & #ifndef OS2 - * - * Revision 1.73 2002/03/05 23:57:30 hal9 - * Stray character 's' on line 1618 was breaking build. - * - * Revision 1.72 2002/03/05 21:33:45 david__schmidt - * - Re-enable OS/2 building after new parms were added - * - Fix false out of memory report when resolving CGI templates when no IP - * address is available of failed attempt (a la no such domain) - * - * Revision 1.71 2002/03/05 18:13:56 oes - * Added --user option - * - * Revision 1.70 2002/03/05 04:52:42 oes - * Deleted non-errlog debugging code - * - * Revision 1.69 2002/03/04 23:50:00 jongfoster - * Splitting off bind_port() call into bind_port_helper(), with - * improved logging. - * - * Revision 1.68 2002/03/04 20:17:32 oes - * Fixed usage info - * - * Revision 1.67 2002/03/04 18:18:57 oes - * - Removed _DEBUG mode - * - Cleand up cmdline parsing - * - Introduced --no-daemon, --pidfile options - * - Cleaned up signal handling: - * - Terminate cleanly on INT, TERM and ABRT - * - Schedule logfile for re-opening on HUP - * - Ignore CHLD and PIPE - * - Leave the rest with their default handlers - * - Uniform handler registration - * - Added usage() function - * - Played styleguide police - * - * Revision 1.66 2002/03/03 15:06:55 oes - * Re-enabled automatic config reloading - * - * Revision 1.65 2002/03/03 14:49:11 oes - * Fixed CLF logging: Now uses client's original HTTP request - * - * Revision 1.64 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.63 2002/03/02 04:14:50 david__schmidt - * Clean up a little CRLF unpleasantness that suddenly appeared - * - * Revision 1.62 2002/02/20 23:17:23 jongfoster - * Detecting some out-of memory conditions and exiting with a log message. - * - * Revision 1.61 2002/01/17 21:01:52 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Revision 1.60 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.59 2001/12/13 14:07:18 oes - * Fixed Bug: 503 error page now sent OK - * - * Revision 1.58 2001/11/30 23:37:24 jongfoster - * Renaming the Win32 config file to config.txt - this is almost the - * same as the corresponding UNIX name "config" - * - * Revision 1.57 2001/11/16 00:47:43 jongfoster - * Changing the tty-disconnection code to use setsid(). - * - * Revision 1.56 2001/11/13 20:20:54 jongfoster - * Tabs->spaces, fixing a bug with missing {} around an if() - * - * Revision 1.55 2001/11/13 20:14:53 jongfoster - * Patch for FreeBSD setpgrp() as suggested by Alexander Lazic - * - * Revision 1.54 2001/11/07 00:03:14 steudten - * Give reliable return value if an error - * occurs not just 0 with new daemon mode. - * - * Revision 1.53 2001/11/05 21:41:43 steudten - * Add changes to be a real daemon just for unix os. - * (change cwd to /, detach from controlling tty, set - * process group and session leader to the own process. - * Add DBG() Macro. - * Add some fatal-error log message for failed malloc(). - * Add '-d' if compiled with 'configure --with-debug' to - * enable debug output. - * - * Revision 1.52 2001/10/26 20:11:20 jongfoster - * Fixing type mismatch - * - * Revision 1.51 2001/10/26 17:38:28 oes - * Cosmetics - * - * Revision 1.50 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.49 2001/10/23 21:41:35 jongfoster - * Added call to initialize the (statically-allocated of course) - * "out of memory" CGI response. - * - * Revision 1.48 2001/10/10 19:56:46 jongfoster - * Moving some code that wasn't cookie-related out of an #ifdef - * FEATURE_COOKIE_JAR - * - * Revision 1.47 2001/10/10 16:44:36 oes - * Added CONNECT destination port limitation check - * - * Revision 1.46 2001/10/08 15:17:41 oes - * Re-enabled SSL forwarding - * - * Revision 1.45 2001/10/07 15:42:11 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Moved downgrading of the HTTP version from parse_http_request to - * chat(), since we can't decide if it is necessary before we have - * determined the actions for the URL. The HTTP command is now - * *always* re-built so the repairs need no longer be special-cased. - * - * filter_popups now gets a csp pointer so it can raise the new - * CSP_FLAG_MODIFIED flag. - * - * Bugfix - * - * Added configurable size limit for the IOB. If the IOB grows so - * large that the next read would exceed the limit, the header - * is generated, and the header & unfiltered buffer are flushed - * to the client. Chat then continues in non-buffering, - * non-filtering body mode. - * - * Revision 1.44 2001/10/02 18:13:57 oes - * Ooops - * - * Revision 1.43 2001/10/02 15:32:13 oes - * Moved generation of hdr - * - * Revision 1.42 2001/09/21 23:02:02 david__schmidt - * Cleaning up 2 compiler warnings on OS/2. - * - * Revision 1.41 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.40 2001/09/16 15:41:45 jongfoster - * Fixing signed/unsigned comparison warning. - * - * Revision 1.39 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.38 2001/09/16 13:01:46 jongfoster - * Removing redundant function call that zeroed zalloc()'d memory. - * - * Revision 1.37 2001/09/10 11:12:24 oes - * Deleted unused variable - * - * Revision 1.36 2001/09/10 10:56:15 oes - * Silenced compiler warnings - * - * Revision 1.35 2001/07/31 14:44:22 oes - * Deleted unused size parameter from filter_popups() - * - * Revision 1.34 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.33 2001/07/29 19:32:00 jongfoster - * Renaming _main() [mingw32 only] to real_main(), for ANSI compliance. - * - * Revision 1.32 2001/07/29 18:47:05 jongfoster - * Adding missing #include "loadcfg.h" - * - * Revision 1.31 2001/07/29 12:17:48 oes - * Applied pthread fix by Paul Lieverse - * - * Revision 1.30 2001/07/25 22:57:13 jongfoster - * __BEOS__ no longer overrides FEATURE_PTHREAD. - * This is because FEATURE_PTHREAD will soon be widely used, so I - * want to keep it simple. - * - * Revision 1.29 2001/07/24 12:47:06 oes - * Applied BeOS support update by Eugenia - * - * Revision 1.28 2001/07/23 13:26:12 oes - * Fixed bug in popup-killing for the first read that caused binary garbage to be sent between headers and body - * - * Revision 1.27 2001/07/19 19:09:47 haroon - * - Added code to take care of the situation where while processing the first - * server response (which includes the server header), after finding the end - * of the headers we were not looking past the end of the headers for - * content modification. I enabled it for filter_popups. - * Someone else should look to see if other similar operations should be - * done to the discarded portion of the buffer. - * - * Note 2001/07/20: No, the other content modification mechanisms will process - * the whole iob later anyway. --oes - * - * Revision 1.26 2001/07/18 12:31:36 oes - * cosmetics - * - * 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, @@ -521,15 +217,15 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #include #include -#ifdef FEATURE_PTHREAD -#include -#endif /* def FEATURE_PTHREAD */ - #ifdef _WIN32 -# ifndef FEATURE_PTHREAD -# include -# include -# endif /* ndef FEATURE_PTHREAD */ + +# include +# include +# include +# include +# ifdef TOGGLE +# include +# endif /* def TOGGLE */ # include "win32.h" # ifndef _WIN_CONSOLE @@ -538,23 +234,10 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #else /* ifndef _WIN32 */ -# if !defined (__OS2__) # include -# include -# endif /* ndef __OS2__ */ # include +# include # include -# include - -#ifdef sun -#include -#endif /* sun */ - -#ifdef unix -#include -#include -#endif - # include # ifdef __BEOS__ @@ -562,15 +245,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; # include /* declarations for threads and stuff. */ # endif -# if defined(__EMX__) || defined(__OS2__) -# include /* OS/2/EMX needs a little help with select */ -# endif -# ifdef __OS2__ -#define INCL_DOS -# include -#define bzero(B,N) memset(B,0x00,n) -# endif - # ifndef FD_ZERO # include # endif @@ -582,6 +256,7 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #include "jcc.h" #include "filters.h" #include "loaders.h" +#include "showargs.h" #include "parsers.h" #include "killpopup.h" #include "miscutil.h" @@ -590,24 +265,18 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $"; #include "gateway.h" #include "actions.h" #include "cgi.h" -#include "loadcfg.h" -#include "urlmatch.h" const char jcc_h_rcs[] = JCC_H_VERSION; const char project_h_rcs[] = PROJECT_H_VERSION; -int no_daemon = 0; struct client_state clients[1]; struct file_list files[1]; -#ifdef FEATURE_STATISTICS +#ifdef STATISTICS int urls_read = 0; /* total nr of urls read inc rejected */ int urls_rejected = 0; /* total nr of urls rejected */ -#endif /* def FEATURE_STATISTICS */ +#endif /* def STATISTICS */ -#ifdef FEATURE_GRACEFUL_TERMINATION -int g_terminate = 0; -#endif static void listen_loop(void); static void chat(struct client_state *csp); @@ -625,15 +294,6 @@ static int32 server_thread(void *data); #define sleep(N) Sleep(((N) * 1000)) #endif -#ifdef __OS2__ -#define sleep(N) DosSleep(((N) * 100)) -#endif - -#if defined(unix) || defined(__EMX__) -const char *basedir; -const char *pidfile = NULL; -int received_hup_signal = 0; -#endif /* defined unix */ /* The vanilla wafer. */ static const char VANILLA_WAFER[] = @@ -646,60 +306,13 @@ static const char VANILLA_WAFER[] = "(copyright_or_otherwise)_applying_to_any_cookie._"; -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) -/********************************************************************* - * - * Function : sig_handler - * - * Description : Signal handler for different signals. - * Exit gracefully on ABRT, TERM and INT - * or set a flag that will cause the errlog - * to be reopened by the main thread on HUP. - * - * Parameters : - * 1 : the_signal = the signal cause this function to call - * - * Returns : - - * - *********************************************************************/ -static void sig_handler(int the_signal) -{ - switch(the_signal) - { - case SIGABRT: - case SIGTERM: - case SIGINT: - log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal); -#if defined(unix) - unlink(pidfile); -#endif /* unix */ - exit(the_signal); - break; - - case SIGHUP: - received_hup_signal = 1; - break; - - default: - /* - * We shouldn't be here, unless we catch signals - * in main() that we can't handle here! - */ - log_error(LOG_LEVEL_FATAL, "sig_handler: exiting on unexpected signal %d", the_signal); - } - return; - -} -#endif - - /********************************************************************* * * Function : chat * * Description : Once a connection to the client has been accepted, * this function is called (via serve()) to handle the - * main business of the communication. When this + * main business of the communication. When this * function returns, the caller must close the client * socket handle. * @@ -717,49 +330,40 @@ static void sig_handler(int the_signal) static void chat(struct client_state *csp) { /* - * This next lines are a little ugly, but they simplifies the if statements - * below. Basically if TOGGLE, then we want the if to test if the - * CSP_FLAG_TOGGLED_ON flag ist set, else we don't. And if FEATURE_FORCE_LOAD, - * then we want the if to test for CSP_FLAG_FORCED , else we don't + * This next lines are a little ugly, but they simplifies the if statements below. + * Basically if TOGGLE, then we want the if to test "csp->toggled_on", else we don't + * And if FORCE_LOAD, then we want the if to test "csp->toggled_on", else we don't */ -#ifdef FEATURE_TOGGLE -# define IS_TOGGLED_ON_AND (csp->flags & CSP_FLAG_TOGGLED_ON) && -#else /* ifndef FEATURE_TOGGLE */ +#ifdef TOGGLE +# define IS_TOGGLED_ON_AND (csp->toggled_on) && +#else /* ifndef TOGGLE */ # define IS_TOGGLED_ON_AND -#endif /* ndef FEATURE_TOGGLE */ -#ifdef FEATURE_FORCE_LOAD -# define IS_NOT_FORCED_AND !(csp->flags & CSP_FLAG_FORCED) && -#else /* ifndef FEATURE_FORCE_LOAD */ +#endif /* ndef TOGGLE */ +#ifdef FORCE_LOAD +# define IS_NOT_FORCED_AND (!csp->force) && +#else /* ifndef FORCE_LOAD */ # define IS_NOT_FORCED_AND -#endif /* def FEATURE_FORCE_LOAD */ +#endif /* def FORCE_LOAD */ #define IS_ENABLED_AND IS_TOGGLED_ON_AND IS_NOT_FORCED_AND char buf[BUFFER_SIZE]; - char *hdr; - char *p; - char *req; + char *hdr, *p, *req; + char *err = NULL; fd_set rfds; - int n; - jb_socket maxfd; - int server_body; + int n, maxfd, server_body; int ms_iis5_hack = 0; int byte_count = 0; const struct forward_spec * fwd; struct http_request *http; - int len; /* for buffer sizes */ -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS int block_popups; /* bool, 1==will block popups */ int block_popups_now = 0; /* bool, 1==currently blocking popups */ -#endif /* def FEATURE_KILL_POPUPS */ - - 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; @@ -769,13 +373,13 @@ static void chat(struct client_state *csp) * could get blocked here if a client connected, then didn't say anything! */ - for (;;) + while (FOREVER) { - len = read_socket(csp->cfd, buf, sizeof(buf)); + n = read_socket(csp->cfd, buf, sizeof(buf)); - if (len <= 0) break; /* error! */ + if (n <= 0) break; /* error! */ - add_to_iob(csp, buf, len); + add_to_iob(csp, buf, n); req = get_header(csp); @@ -788,8 +392,8 @@ static void chat(struct client_state *csp) { continue; /* more to come! */ } - -#ifdef FEATURE_FORCE_LOAD + +#ifdef FORCE_LOAD /* If this request contains the FORCE_PREFIX, * better get rid of it now and set the force flag --oes */ @@ -798,11 +402,14 @@ static void chat(struct client_state *csp) { strclean(req, FORCE_PREFIX); log_error(LOG_LEVEL_FORCE, "Enforcing request \"%s\".\n", req); - csp->flags |= CSP_FLAG_FORCED; + csp->force = 1; + } + else + { + csp->force = 0; } - -#endif /* def FEATURE_FORCE_LOAD */ - +#endif /* def FORCE_LOAD */ + parse_http_request(req, http, csp); freez(req); break; @@ -830,171 +437,98 @@ static void chat(struct client_state *csp) * we have to do one of the following: * * create = use the original HTTP request to create a new - * HTTP request that has either the path component - * without the http://domainspec (w/path) or the - * full orininal URL (w/url) - * Note that the path and/or the HTTP version may - * have been altered by now. - * - * 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; } @@ -1003,52 +537,59 @@ static void chat(struct client_state *csp) enlist(csp->headers, p); freez(p); } - /* - * We have a request. Now, check to see if we need to - * intercept it, i.e. If .. - */ + /* We have a request. */ + + hdr = sed(client_patterns, add_client_headers, csp); + destroy_list(csp->headers); + + /* + * Now, check to see if we need to intercept it, i.e. + * If + */ + if ( /* a CGI call was detected and answered */ - (NULL != (rsp = dispatch_cgi(csp))) + (NULL != (rsp = dispatch_cgi(csp))) /* or we are enabled and... */ || (IS_ENABLED_AND ( /* ..the request was blocked */ - ( NULL != (rsp = block_url(csp))) + ( NULL != (rsp = block_url(csp))) /* ..or untrusted */ -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES || ( NULL != (rsp = trust_url(csp))) -#endif /* def FEATURE_TRUST */ +#endif /* ..or a fast redirect kicked in */ -#ifdef FEATURE_FAST_REDIRECTS - || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) && - (NULL != (rsp = redirect_url(csp)))) -#endif /* def FEATURE_FAST_REDIRECTS */ - )) - ) +#ifdef FAST_REDIRECTS + || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) && + (NULL != (rsp = redirect_url(csp)))) +#endif /* def FAST_REDIRECTS */ + )) + ) { /* Write the answer to the client */ - if (write_socket(csp->cfd, rsp->head, rsp->head_length) - || write_socket(csp->cfd, rsp->body, rsp->content_length)) - { + if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length) + || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) + { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); } -#ifdef FEATURE_STATISTICS +#ifdef STATISTICS /* Count as a rejected request */ - csp->flags |= CSP_FLAG_REJECTED; -#endif /* def FEATURE_STATISTICS */ + csp->rejected = 1; +#endif /* def STATISTICS */ /* Log (FIXME: All intercept reasons apprear as "crunch" with Status 200) */ log_error(LOG_LEVEL_GPC, "%s%s crunch!", http->hostport, http->path); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->cmd); /* Clean up and return */ free_http_response(rsp); + freez(hdr); return; } @@ -1068,74 +609,67 @@ static void chat(struct client_state *csp) csp->sfd = forwarded_connect(fwd, http, csp); - if (csp->sfd == JB_INVALID_SOCKET) + if (csp->sfd < 0) { log_error(LOG_LEVEL_CONNECT, "connect to: %s failed: %E", http->hostport); if (errno == EINVAL) { - rsp = error_response(csp, "no-such-domain", errno); + rsp = error_response(csp, "no-such-domain", errno); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0", + csp->ip_addr_str, http->cmd); } else { - rsp = error_response(csp, "connect-failed", errno); + rsp = error_response(csp, "connect-failed", errno); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", + csp->ip_addr_str, http->cmd); } - /* Write the answer to the client */ if(rsp) - { - if (write_socket(csp->cfd, rsp->head, rsp->head_length) - || write_socket(csp->cfd, rsp->body, rsp->content_length)) - { + { + if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length) + || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) + { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); } } free_http_response(rsp); + freez(hdr); return; } log_error(LOG_LEVEL_CONNECT, "OK"); - hdr = sed(client_patterns, add_client_headers, csp); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header"); - } - - list_remove_all(csp->headers); - if (fwd->forward_host || (http->ssl == 0)) { /* write the client's (modified) header to the server * (along with anything else that may be in the buffer) */ - if (write_socket(csp->sfd, hdr, strlen(hdr)) - || (flush_socket(csp->sfd, csp) < 0)) + n = strlen(hdr); + + if ((write_socket(csp->sfd, hdr, n) != n) + || (flush_socket(csp->sfd, csp ) < 0)) { log_error(LOG_LEVEL_CONNECT, "write header to: %s failed: %E", http->hostport); - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", + csp->ip_addr_str, http->cmd); rsp = error_response(csp, "connect-failed", errno); if(rsp) { - if (write_socket(csp->cfd, rsp->head, rsp->head_length) - || write_socket(csp->cfd, rsp->body, rsp->content_length)) - { + if ((write_socket(csp->cfd, rsp->head, n) != n) + || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length)) + { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); } } @@ -1152,10 +686,10 @@ static void chat(struct client_state *csp) * so just send the "connect succeeded" message to the * client, flush the rest, and get out of the way. */ - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n", - csp->ip_addr_str, http->ocmd); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n", + csp->ip_addr_str, http->cmd); - if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1)) + if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1) < 0) { freez(hdr); return; @@ -1174,21 +708,14 @@ static void chat(struct client_state *csp) server_body = 0; - for (;;) + while (FOREVER) { -#ifdef __OS2__ - /* - * FD_ZERO here seems to point to an errant macro which crashes. - * So do this by hand for now... - */ - memset(&rfds,0x00,sizeof(fd_set)); -#else FD_ZERO(&rfds); -#endif + FD_SET(csp->cfd, &rfds); FD_SET(csp->sfd, &rfds); - n = select((int)maxfd+1, &rfds, NULL, NULL, NULL); + n = select(maxfd+1, &rfds, NULL, NULL, NULL); if (n < 0) { @@ -1202,14 +729,14 @@ static void chat(struct client_state *csp) if (FD_ISSET(csp->cfd, &rfds)) { - len = read_socket(csp->cfd, buf, sizeof(buf)); + n = read_socket(csp->cfd, buf, sizeof(buf)); - if (len <= 0) + if (n <= 0) { break; /* "game over, man" */ } - if (write_socket(csp->sfd, buf, (size_t)len)) + if (write_socket(csp->sfd, buf, n) != n) { log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host); return; @@ -1220,32 +747,32 @@ static void chat(struct client_state *csp) /* * 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; @@ -1254,15 +781,15 @@ static void chat(struct client_state *csp) /* Add a trailing zero. This lets filter_popups * use string operations. */ - buf[len] = '\0'; + buf[n] = '\0'; -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS /* Filter the popups on this read. */ if (block_popups_now) { - filter_popups(buf, csp); + filter_popups(buf, n); } -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ /* Normally, this would indicate that we've read * as much as the server has sent us and we can @@ -1282,56 +809,32 @@ static void chat(struct client_state *csp) * doesn't generate a valid header, then we won't * transmit anything to the client. */ - if (len == 0) + if (n == 0) { - + /* 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 @@ -1343,63 +846,27 @@ static void chat(struct client_state *csp) /* * 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 @@ -1410,11 +877,11 @@ static void chat(struct client_state *csp) */ /* buffer up the data we just read */ - add_to_iob(csp, buf, len); + add_to_iob(csp, buf, n); /* get header lines from the iob */ - while ((p = get_header(csp)) != NULL) + while ((p = get_header(csp))) { if (*p == '\0') { @@ -1459,73 +926,60 @@ static void chat(struct client_state *csp) */ hdr = sed(server_patterns, add_server_headers, csp); - if (hdr == NULL) - { - /* FIXME Should handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header"); - } + n = strlen(hdr); + + /* write the server's (modified) header to + * the client (along with anything else that + * may be in the buffer) + */ -#ifdef FEATURE_KILL_POPUPS +#ifdef KILLPOPUPS /* Start blocking popups if appropriate. */ - if ((csp->content_type & CT_TEXT) && /* It's a text / * MIME-Type */ - !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); @@ -1547,8 +1001,8 @@ static void chat(struct client_state *csp) return; /* huh? we should never get here */ } - log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d", - csp->ip_addr_str, http->ocmd, byte_count); + log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d", + csp->ip_addr_str, http->cmd, byte_count); } @@ -1574,12 +1028,12 @@ static void serve(struct client_state *csp) chat(csp); close_socket(csp->cfd); - if (csp->sfd != JB_INVALID_SOCKET) + if (csp->sfd >= 0) { close_socket(csp->sfd); } - csp->flags &= ~CSP_FLAG_ACTIVE; + csp->active = 0; } @@ -1606,28 +1060,6 @@ static int32 server_thread(void *data) #endif -/********************************************************************* - * - * Function : usage - * - * Description : Print usage info & exit. - * - * Parameters : Pointer to argv[0] for identifying ourselves - * - * Returns : No. ,-) - * - *********************************************************************/ -void usage(const char *myname) -{ - printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n" - "Usage: %s [--help] [--version] [--no-daemon] [--pidfile pidfile] [--user user[.group]] [configfile]\n" - "Aborting.\n", myname); - - exit(2); - -} - - /********************************************************************* * * Function : main @@ -1647,116 +1079,50 @@ void usage(const char *myname) * any load fails, and can't bind port. * * Else main never returns, the process must be signaled - * to terminate execution. Or, on Windows, use the + * to terminate execution. Or, on Windows, use the * "File", "Exit" menu option. * *********************************************************************/ #ifdef __MINGW32__ -int real_main(int argc, const char *argv[]) +int _main(int argc, const char *argv[]) #else int main(int argc, const char *argv[]) #endif { - int argc_pos = 0; -#ifdef unix - struct passwd *pw = NULL; - struct group *grp = NULL; - char *p; -#endif - - Argc = argc; - Argv = argv; - configfile = -#if !defined(_WIN32) +#ifdef AMIGA + "AmiTCP:db/junkbuster/config" +#elif !defined(_WIN32) "config" #else - "config.txt" + "junkbstr.txt" #endif ; - /* - * Parse the command line arguments - */ - while (++argc_pos < argc) - { #if !defined(_WIN32) || defined(_WIN_CONSOLE) - - if (strcmp(argv[argc_pos], "--help") == 0) - { - usage(argv[0]); - } - - else if(strcmp(argv[argc_pos], "--version") == 0) - { - printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n"); - exit(0); - } - - else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0) - { - no_daemon = 1; - } -#if defined(unix) - else if (strcmp(argv[argc_pos], "--pidfile" ) == 0) - { - if (++argc_pos == argc) usage(argv[0]); - pidfile = strdup(argv[argc_pos]); - } - - else if (strcmp(argv[argc_pos], "--user" ) == 0) - { - if (++argc_pos == argc) usage(argv[argc_pos]); - - if ((NULL != (p = strchr(argv[argc_pos], '.'))) && *(p + 1) != '0') - { - *p++ = '\0'; - if (NULL == (grp = getgrnam(p))) - { - log_error(LOG_LEVEL_FATAL, "Group %s not found.", p); - } - } - - if (NULL == (pw = getpwnam(argv[argc_pos]))) - { - log_error(LOG_LEVEL_FATAL, "User %s not found.", argv[argc_pos]); - } - - if (p != NULL) *--p = '\0'; - } -#endif /* defined(unix) */ - else -#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */ - { - configfile = argv[argc_pos]; - } - - } /* -END- while (more arguments) */ - -#if defined(unix) - if ( *configfile != '/' ) + if ((argc >= 2) && (strcmp(argv[1], "--help")==0)) + { + printf("JunkBuster proxy version " VERSION ".\n\n" + "Usage: %s [configfile]\n\n" + "See " HOME_PAGE_URL " for details.\n" + "This program is distributed under the GNU GPL, version 2 or later.\n", + argv[0]); + exit(2); + } + if ((argc >= 2) && (strcmp(argv[1], "--version")==0)) { - char *abs_file; + printf(VERSION "\n"); + exit(2); + } +#endif /* !defined(_WIN32) || defined(_WIN_CONSOLE) */ - /* make config-filename absolute here */ - if ( !(basedir = getcwd( NULL, 1024 ))) - { - perror("get working dir failed"); - exit( 1 ); - } + Argc = argc; + Argv = argv; - if ( !(abs_file = malloc( strlen( basedir ) + strlen( configfile ) + 5 ))) - { - perror("malloc failed"); - exit( 1 ); - } - strcpy( abs_file, basedir ); - strcat( abs_file, "/" ); - strcat( abs_file, configfile ); - configfile = abs_file; + if (argc > 1) + { + configfile = argv[1]; } -#endif /* defined unix */ - files->next = NULL; @@ -1766,37 +1132,11 @@ int main(int argc, const char *argv[]) InitWin32(); #endif - /* - * Unix signal handling - * - * Catch the abort, interrupt and terminate signals for a graceful exit - * Catch the hangup signal so the errlog can be reopened. - * Ignore the broken pipe and child signals - * FIXME: Isn't ignoring the default for SIGCHLD anyway and why ignore SIGPIPE? - */ -#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA) -{ - int idx; - const int catched_signals[] = { SIGABRT, SIGTERM, SIGINT, SIGHUP, 0 }; - const int ignored_signals[] = { SIGPIPE, SIGCHLD, 0 }; - - for (idx = 0; catched_signals[idx] != 0; idx++) - { - if (signal(catched_signals[idx], sig_handler) == SIG_ERR) - { - log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal %d: %E", catched_signals[idx]); - } - } - 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 /* @@ -1808,96 +1148,6 @@ int main(int argc, const char *argv[]) #endif /* def _WIN32 */ - /* Initialize the CGI subsystem */ - cgi_init_error_messages(); - - /* - * If runnig on unix and without the --nodaemon - * option, become a daemon. I.e. fork, detach - * from tty and get process group leadership - */ -#if defined(unix) -{ - pid_t pid = 0; -#if 0 - int fd; -#endif - - if (!no_daemon) - { - pid = fork(); - - if ( pid < 0 ) /* error */ - { - perror("fork"); - exit( 3 ); - } - else if ( pid != 0 ) /* parent */ - { - int status; - pid_t wpid; - /* - * must check for errors - * child died due to missing files aso - */ - sleep( 1 ); - wpid = waitpid( pid, &status, WNOHANG ); - if ( wpid != 0 ) - { - exit( 1 ); - } - exit( 0 ); - } - /* child */ -#if 1 - /* Should be more portable, but not as well tested */ - setsid(); -#else /* !1 */ -#ifdef __FreeBSD__ - setpgrp(0,0); -#else /* ndef __FreeBSD__ */ - setpgrp(); -#endif /* ndef __FreeBSD__ */ - fd = open("/dev/tty", O_RDONLY); - if ( fd ) - { - /* no error check here */ - ioctl( fd, TIOCNOTTY,0 ); - close ( fd ); - } -#endif /* 1 */ - /* FIXME: should close stderr (fd 2) here too, but the test - * for existence - * and load config file is done in listen_loop() and puts - * some messages on stderr there. - */ - - close( 0 ); - close( 1 ); - chdir("/"); - - } /* -END- if (!no_daemon) */ - - /* - * As soon as we have written the PID file, we can switch - * to the user and group ID indicated by the --user option - */ - write_pid_file(); - - if (NULL != pw) - { - if (((NULL != grp) && setgid(grp->gr_gid)) || (setgid(pw->pw_gid))) - { - log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions."); - } - if (setuid(pw->pw_uid)) - { - log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions."); - } - } -} -#endif /* defined unix */ - listen_loop(); /* NOTREACHED */ @@ -1906,78 +1156,6 @@ int main(int argc, const char *argv[]) } -/********************************************************************* - * - * Function : bind_port_helper - * - * Description : Bind the listen port. Handles logging, and aborts - * on failure. - * - * Parameters : - * 1 : config = Privoxy configuration. Specifies port - * to bind to. - * - * Returns : Port that was opened. - * - *********************************************************************/ -static jb_socket bind_port_helper(struct configuration_spec * config) -{ - int result; - jb_socket bfd; - - if ( (config->haddr != NULL) - && (config->haddr[0] == '1') - && (config->haddr[1] == '2') - && (config->haddr[2] == '7') - && (config->haddr[3] == '.') ) - { - log_error(LOG_LEVEL_INFO, "Listening on port %d for local connections only", - config->hport); - } - else if (config->haddr == NULL) - { - log_error(LOG_LEVEL_INFO, "Listening on port %d on all IP addresses", - config->hport); - } - else - { - log_error(LOG_LEVEL_INFO, "Listening on port %d on IP address %s", - config->hport, config->haddr); - } - - result = bind_port(config->haddr, config->hport, &bfd); - - if (result < 0) - { - switch(result) - { - case -3 : - log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " - "There may be another Privoxy or some other " - "proxy running on port %d", - (NULL != config->haddr) ? config->haddr : "INADDR_ANY", - config->hport, config->hport); - - case -2 : - log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " - "The hostname is not resolvable", - (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport); - - default : - log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: because %E", - (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport); - } - - /* shouldn't get here */ - return JB_INVALID_SOCKET; - } - - config->need_bind = 0; - - return bfd; -} - - /********************************************************************* * * Function : listen_loop @@ -1992,67 +1170,51 @@ static jb_socket bind_port_helper(struct configuration_spec * config) static void listen_loop(void) { struct client_state *csp = NULL; - jb_socket bfd; + int bfd; struct configuration_spec * config; config = load_config(); - bfd = bind_port_helper(config); + log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)", + config->haddr ? config->haddr : "INADDR_ANY", config->hport); -#ifdef FEATURE_GRACEFUL_TERMINATION - while (!g_terminate) -#else - for (;;) -#endif + bfd = bind_port(config->haddr, config->hport); + + if (bfd < 0) + { + log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E " + "- There may be another junkbuster or some other " + "proxy running on port %d", + (NULL != config->haddr) ? config->haddr : "INADDR_ANY", + config->hport, config->hport + ); + /* shouldn't get here */ + return; + } + + config->need_bind = 0; + + + while (FOREVER) { -#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) +#if !defined(_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(); @@ -2073,7 +1235,23 @@ static void listen_loop(void) close_socket(bfd); - bfd = bind_port_helper(config); + log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)", + config->haddr ? config->haddr : "INADDR_ANY", config->hport); + bfd = bind_port(config->haddr, config->hport); + + if (bfd < 0) + { + log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E " + "- There may be another junkbuster or some other " + "proxy running on port %d", + (NULL != config->haddr) ? config->haddr : "INADDR_ANY", + config->hport, config->hport + ); + /* shouldn't get here */ + return; + } + + config->need_bind = 0; } log_error(LOG_LEVEL_CONNECT, "accept connection ... "); @@ -2085,7 +1263,7 @@ static void listen_loop(void) #ifdef AMIGA if(!childs) { - exit(1); + exit(1); } #endif freez(csp); @@ -2096,12 +1274,10 @@ static void listen_loop(void) log_error(LOG_LEVEL_CONNECT, "OK"); } -#ifdef FEATURE_TOGGLE - if (g_bToggleIJB) - { - csp->flags |= CSP_FLAG_TOGGLED_ON; - } -#endif /* def FEATURE_TOGGLE */ +#if defined(TOGGLE) + /* by haroon - most of credit to srt19170 */ + csp->toggled_on = g_bToggleIJB; +#endif if (run_loader(csp)) { @@ -2109,7 +1285,6 @@ static void listen_loop(void) /* 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"); @@ -2117,7 +1292,6 @@ static void listen_loop(void) freez(csp); continue; } -#endif /* def FEATURE_ACL */ /* add it to the list of clients */ csp->next = clients->next; @@ -2130,34 +1304,10 @@ static void listen_loop(void) /* 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 @@ -2186,7 +1336,7 @@ static void listen_loop(void) NP_Entry, (ULONG)server_thread, NP_Output, Output(), NP_CloseOutput, FALSE, - NP_Name, (ULONG)"privoxy child", + NP_Name, (ULONG)"junkbuster child", NP_StackSize, 200*1024, TAG_DONE))) { @@ -2199,7 +1349,27 @@ static void listen_loop(void) #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(). @@ -2210,7 +1380,7 @@ static void listen_loop(void) _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 @@ -2221,75 +1391,16 @@ static void listen_loop(void) 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 */ } diff --git a/jcc.h b/jcc.h index 1778f1ea..a43a12cc 100644 --- a/jcc.h +++ b/jcc.h @@ -1,6 +1,6 @@ -#ifndef JCC_H_INCLUDED -#define JCC_H_INCLUDED -#define JCC_H_VERSION "$Id: jcc.h,v 1.11 2002/03/24 13:25:43 swa Exp $" +#ifndef _JCC_H +#define _JCC_H +#define JCC_H_VERSION "$Id: jcc.h,v 1.1.1.1 2001/05/15 13:58:56 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/jcc.h,v $ @@ -9,7 +9,7 @@ * the main connection-handling function. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -35,53 +35,6 @@ * * 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 * @@ -89,36 +42,38 @@ *********************************************************************/ +/* Declare struct FILE for vars and funcs. */ +#include + +/* 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 @@ -131,7 +86,7 @@ extern const char jcc_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef JCC_H_INCLUDED */ +#endif /* ndef _JCC_H */ /* Local Variables: diff --git a/junkbuster-rh.spec b/junkbuster-rh.spec new file mode 100644 index 00000000..0ef61285 --- /dev/null +++ b/junkbuster-rh.spec @@ -0,0 +1,295 @@ +# $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 +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 +- rework of RPM + +* Mon Sep 25 2000 Stefan Waldherr +- CLF Logging patch by davep@cyw.uklinux.net +- Hal DeVore fix akamaitech in blocklist + +* Sun Sep 17 2000 Stefan Waldherr +- 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 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" : 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 + Andrew 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 + 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 + Blank images are no longer cached, thanks to a hint from Markus + Breitenbach . 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 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 + . 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 + /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 + Configure blank version via config file. No separate blank + version anymore. Added Roland's + patch to show a logo instead of a blank area. Added a suggestion + from Alex : /var/lock/subsys/junkbuster. + More regexps in the blocklist. Prepared the forwardfile for + squid. Extended image regexp with help from gabriel + . + +* Thu Nov 19 1998 Stefan Waldherr + 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 + 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 + Modified the blocking feature, so that only GIFs and JPEGs are + blocked and replaced but not HTML pages. Thanks to + "Gerd Flender" 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 + Moved config files to /etc/junkbuster directory, moved man page, + added BuildRoot directive (Thanks to Alexey Nogin ) + Made new version junkbuster-raw (which is only a stripped version of + the junkuster rpm, i.e. without my blocklist, etc.) + +* Tue Jun 16 1998 (2.0-1) + Uhm, not that much. Just a new junkbuster version that + fixes a couple of bugs ... and of course a bigger + blocklist with the unique Now-less-ads-than-ever(SM) + feature. + Oh, one thing: I changed the default user agent to Linux -- no + need anymore to support Apple. + +* Tue Jun 16 1998 (2.0-0) + Now-less-ads-than-ever (SM) + compiled with gcc instead of cc + compiled with -O3, thus it should be a little faster + show-proxy-args now works + /etc/junkbuster.init wasn't necessary + +* Tue Jun 16 1998 (1.4) + some more config files were put into /etc + The junkbuster-blank rpm returns a 1x1 pixel image, that gets + displayed by Netscape instead of the blocked image. + Read http://www.waldherr.org/junkbuster/ for + further info. + +* Tue Jun 16 1998 (1.3) + The program has been moved to /usr/sbin (from /usr/local/bin) + Init- and stopscripts (/etc/rc.d/rc*) have been added so + that the junkbuster starts automatically during bootup. + The /etc/blocklist file is much more sophisticated. Theoretically + one should e.g. browse all major US and German newspapers without + seeing one annoying ad. + junkbuster.init was modified. It now starts junkbuster with an + additional "-r @" flag. diff --git a/junkbuster-suse.spec b/junkbuster-suse.spec new file mode 100644 index 00000000..9218a2fd --- /dev/null +++ b/junkbuster-suse.spec @@ -0,0 +1,175 @@ +# $Id: junkbuster-suse.spec,v 1.4 2001/06/08 20:53:36 swa Exp $ +# +# Written by and Copyright (C) 2001 the SourceForge +# IJBSWA team. http://ijbswa.sourceforge.net +# +# Based on the Internet Junkbuster originally written +# by and Copyright (C) 1997 Anonymous Coders and +# Junkbusters Corporation. http://www.junkbusters.com +# +# This program is free software; you can redistribute it +# and/or modify it under the terms of the GNU General +# Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public +# License for more details. +# +# The GNU General Public License should be included with +# this file. If not, you can view it at +# http://www.gnu.org/copyleft/gpl.html +# or write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# $Log: junkbuster-suse.spec,v $ +# Revision 1.4 2001/06/08 20:53:36 swa +# use buildroot, export init to separate file (better manageability) +# +# Revision 1.3 2001/06/07 17:28:10 swa +# cosmetics +# +# Revision 1.2 2001/06/07 17:18:44 swa +# header fixed +# +# +# neededforbuild -ijb +# usedforbuild -ijb aaa_base aaa_dir autoconf automake base bash bindutil binutils bison bzip compress cpio cracklib db devs diffutils e2fsprogs file fileutils findutils flex gawk gcc gdbm gdbm-devel gettext glibc glibc-devel gpm gppshare groff gzip kbd less libtool libz lx_suse make mktemp modutils ncurses ncurses-devel net-tools netcfg nkitb pam pam-devel patch perl pgp ps rcs rpm sendmail sh-utils shadow strace syslogd sysvinit texinfo textutils timezone unzip util-linux vim xdevel xf86 xshared + +Vendor: http://ijbswa.sourceforge.net +Distribution: defineme +Name: junkbuster +Packager: Stefan Waldherr + +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 +- rework of RPM +* Wed Feb 14 2001 - uli@suse.de +- fixed init script +* Wed Dec 06 2000 - bjacke@suse.de +- renamed package to junkbuster +- fixed copyright tag +* Thu Nov 30 2000 - uli@suse.de +- moved init script to /etc/init.d +* Wed Feb 16 2000 - kukuk@suse.de +- Move /usr/man -> /usr/share/man +- Mark /etc/ijb as "config(noreplace)" +* Mon Sep 20 1999 - uli@suse.de +- fixed init script +* Mon Sep 13 1999 - bs@suse.de +- ran old prepare_spec on spec file to switch to new prepare_spec. +* Thu Apr 01 1999 - daniel@suse.de +- do not start ijb as root (security) +* Tue Mar 30 1999 - daniel@suse.de +- don´t use saclfile.ini +* Tue Mar 30 1999 - daniel@suse.de +- small fix to whitelist-configuration, + version is and was 2.0.2 WITHOUT Stefan Waldherr's patches + (http://www.waldherr.org/junkbuster/) +* Mon Mar 01 1999 - daniel@suse.de +- new package: version 2.0 diff --git a/junkbuster.1 b/junkbuster.1 new file mode 100644 index 00000000..d88294da --- /dev/null +++ b/junkbuster.1 @@ -0,0 +1,871 @@ +.TH JUNKBUSTER 1 "http://www.junkbusters.com/ht/en/ijb2.0man.html" +.SH NAME +\fBjunkbuster\fP +- The +Internet Junkbuster +Proxy +\s-2(TM)\s+2 +.SH SYNOPSIS +\fBjunkbuster\fP +\fI\&configfile\fP +(Version 2.0 onwards) +.br +\fBjunkbstr.exe\fP +\fI\&configfile\fP +(Windows) +.br +\fBjunkbuster\fP +[-a] +[-y] +[-s] +[-c] +[-v] +.br +[-u user_agent] +[-r referer] +[-t from] +.br +[-b blockfile] +[-j jarfile] +[-l logfile] +.br +[-w NAME=VALUE] +[-x Header_text] +.br +[-h [bind_host_address][:bind_port]] +.br +[-f forward_host[:port]] +[-d N] +.br +[-g gw_protocol[:[gw_host][:gw_port]]] +.br +(Version 1.4 and earlier) +.SH DESCRIPTION +\fBjunkbuster\fP +is an instrumentable proxy that filters the +\s-2HTTP\s0 +stream between +web servers and browsers. +Its main purpose is to enhance privacy. +.P +Versions before 2.0 used command-line options; +Versions from 2.0 onward use a configuration file. +The following descriptions of the options first give the older +command-line usage, then the new configfile line. +.P +In Versions 2.0.1 upwards on Windows, +a start-up message is printed and the configuration is read from the file +\fC\&junkbstr.ini\fP +if it exists and no argument was given. +.P +All files except the configfile +are checked for changes before each page is fetched, +so they may edited without restarting the proxy. +.SS OPTIONS +.TP +.\" anchor: o_b blockfile +\fI-b blockfile\fP (Old) blockfile \fIblockfile\fP (New) +Block\" ijbfaq.html#blocking +requests to +\s-2URL\s0s +matching any pattern given in the lines of the +\fI\&blockfile\fP. +The +\fBjunkbuster\fP +instead returns status 202, indicating that the request has been accepted +(though not completed), +and a +message identifying itself\" ijbfaq.html#show +(though the browser may +display only a broken image icon). +(Versions before 2.0 returned an error 403 (Forbidden).) +The syntax of a pattern is +\fB\&[domain][:port][/path]\fP +(the +\fB\&http://\fP +or +\fB\&https://\fP +protocol part is omitted). +To decide if a pattern matches a target, the domains are compared first, +then the paths. +.P +To compare the domains, +the pattern domain and the target +domain specified in the +\s-2URL\s0 +are each broken into their components. +(Components are separated by the +\fC\&.\fP +(period) character.) +Next each of the target components +is compared with the corresponding pattern component: last with last, +next-to-last with next-to-last, and so on. +(This is called +\fIright-anchored\fP +matching.) +If all of the pattern components find their match in the target, +then the domains are considered a match. +Case is irrelevant when comparing domain components. +.P +A successfully +matching pattern can be an anchored substring of a target, but +not vice versa. +Thus if a pattern doesn't specify a domain, +it matches all domains. +.\" anchor: wildcard +Furthermore, when comparing two components, +the components must either match in their entirety or up to a wildcard +\fC\&* \fP +(star character) in the pattern. The wildcard feature +implements only a "prefix" match capability ("abc*" vs. "abcdefg"), +not suffix matching ("*efg" vs. "abcdefg") or +infix matching ("abc*efg" vs. "abcdefg"). +The feature is restricted to the domain component; +it is unrelated to the optional +regular expression +feature in the path +(described below).\" ijbman.html#regex +.P +If a numeric port +is specified in the pattern domain, then the target port must +match as well. The default port in a target is port 80. +.P +If the domain and port match, +then the target +\s-2URL\s0 +path is checked for +a match against the path in the pattern. +Paths are compared with a simple case-sensitive +left-anchored substring comparison. +Once again, the pattern can be an +anchored substring of the target, but not vice versa. +A path of +\fC\&/\fP +(slash) would match all paths. Wildcards are not considered in +path comparisons. +.P +For example, the target +\s-2URL\s0 +.br +.ti +0.25i +\fB\&the.yellow-brick-road.com/TinMan/has_no_brain\fP +.br +would be matched (and blocked) by the following patterns +.br +.ti +0.25i +\fB\&yellow-brick-road.com\fP +.br +and +.br +.ti +0.25i +\fB\&Yellow*.COM\fP +.br +and +.br +.ti +0.25i +\fB\&/TinM\fP +.br +but not +.br +.ti +0.25i +\fB\&follow.the.yellow-brick-road.com\fP +.br +or +.br +.ti +0.25i +\fB\&/tinman\fP +.br +.P +Comments in a blockfile start with a +\fB\&#\fP +(hash) character and end at a new line. +Blank lines are also ignored. +.P +Lines beginning with a +\fC\&~\fP +(tilde) character are taken to be +exceptions:\" ijbfaq.html#exceptions +a +\s-2URL\s0 +blocked by previous patterns that matches the rest of +the line is let through. (The last match wins.) +.P +Patterns +may contain +\s-2POSIX\s0 +regular expressions\" ijbfaq.html#regex +provided the +\fBjunkbuster\fP +was compiled with this option +(the default in Version 2.0 on). +The idiom +\fC\&/*.*/ad\fP +can then be used +to match any +\s-2URL\s0 +containing +\fC\&/ad\fP +(such as +\fC\&http://nomatterwhere.com/images/advert/g3487.gif\fP +for example). +These expressions +don't work\" ijbman.html#substring +in the domain part. +.P +In version 1.3 and later +the blockfile and cookiefile are checked for changes before each request. +.TP +tinygif \fIN\fP +Set appearance of blocked GIFs. You can select one of the following +values: +.br +.br +\h'-\w"0 = "u'0 = Show a ``broken icon'' in the browser +.br +\h'-\w"1 = "u'1 = Show a one pixel transparent GIF +.br +\h'-\w"2 = "u'2 = Show a GIF with the word ``JUNKBUSTER'' +.TP +popupfile \fI\&popup\fP +Sets the name of the popupfile. If uncommented, the popupfile +controls on which sites Javascript popup windows are disabled. +.TP +.\" anchor: o_w wafer +\fI-w NAME=VALUE\fP (Old) wafer \fINAME=VALUE\fP (New) +Specifies a pair to be sent as a cookie with every request +to the server.\" ijbfaq.html#wafers +(Such boring cookies are called +\fI\&wafers\fP.) +This option may be called more than once to generate multiple wafers. +The original +Netscape specification +prohibited +semi-colons, commas and white space; +these characters will be +\s-2URL\s0-encoded +if used in wafers. +The Path and Domain attributes are not currently supported. +.TP +.\" anchor: o_c cookiefile +\fI-c cookiefile\fP (Old) cookiefile \fIcookiefile\fP (New) +Enforce the cookie management policy specified in the +\fI\&cookiefile.\fP +.\" anchor: java +If this option is not used all cookies are silently crunched, +so that users who never want cookies aren't bothered by browsers +asking whether each cookie should be accepted. +However, cookies can +still get through\" ijbfaq.html#breakthrough +via +JavaScript\" links.html#javascript +and +\s-2SSL\s0, +so alerts should be left on. +.P +In Version 1.2 and later +this option must be followed by a +filename\" ijbfaq.html#crumble +containing instructions on which sites are allowed to +receive and set cookies. +.\" anchor: drop +By default cookies are dropped in both the browser's request +and the server's response, unless the +\s-2URL\s0 +requested matches an entry in the +\fI\&cookiefile\fP. +The matching algorithm is the same as for the blockfile. +A leading +\fC\&>\fP +character allows +server-bound\" ijbfaq.html#directional +cookies only; +a +\fC\&<\fP +allows only browser-bound cookies; +a +\fC\&~\fP +character stops cookies in +both directions.\" ijbfaq.html#crumble +Thus a cookiefile containing a single line with the two characters +\fC\&>*\fP +will pass on all cookies to servers but not give any new ones to the browser. +.TP +.\" anchor: o_j jarfile +\fI-j jarfile\fP (Old) jarfile \fIjarfile\fP (New) +All Set-cookie attempts by the server are +logged\" ijbfaq.html#jar +to +\fI\&jarfile\fP. +If no wafer is specified, +one containing a +canned notice\" ijbfaq.html#notice +(the +\fI\&vanilla wafer\fP) +is added as an alert to the server +unless the +suppress-vanilla-wafer\" ijbman.html#suppress-vanilla-wafer +option is invoked. +.TP +.\" anchor: o_v suppress-vanilla-wafer +\fI-v\fP (Old) suppress-vanilla-wafer \fI\fP (New) +Suppress the vanilla wafer. +.TP +.\" anchor: o_t from +\fI-t from\fP (Old) from \fIfrom\fP (New) +If the browser +discloses an email address\" ijbfaq.html#from +in the +\fB\&FROM\fP +header (most don't), +replace it with +\fI\&from.\fP +If +\fI\&from\fP +is set to +\fB\&.\fP +(the period character) +the +\fB\&FROM\fP +is passed to the server unchanged. +The default is to delete the +\fB\&FROM\fP +header. +.TP +.\" anchor: o_r referer +\fI-r referer\fP (Old) referer \fIreferer\fP (New) +Whenever the browser discloses the +\s-2URL\s0 +that +led to\" ijbfaq.html#referer +the current request, +replace it with +\fI\&referer.\fP +If +\fI\&referer\fP +is set to +\fB\&.\fP +(period) +the +\s-2URL\s0 +is passed to the server unchanged. +In +Version 1.4 +and later, if referer is set to +\fB\&@\fP +(at) the +\s-2URL\s0 +is sent in cases where the cookiefile +specifies that a cookie would be sent. +(No way to send bogus referers selectively is provided.) +The default is to delete Referer. +.P +Version 2.0 also accepts the spelling +\fC\&referrer\fP, +which most dictionaries consider correct. +.TP +.\" anchor: o_u user-agent +\fI-u user-agent\fP (Old) user-agent \fIuser-agent\fP (New) +Information disclosed by the browser +about itself\" ijbfaq.html#agent +is replaced with the value +\fI\&user-agent.\fP +If +\fI\&user-agent\fP +is set to +\fB\&.\fP +(period) +the +\fB\&User-Agent\fP +header is passed to the server unchanged, +along with any +\fB\&UA\fP +headers produced by +\s-2MS-IE\s0 +(which would otherwise be deleted). +In +Version 1.4 +and later, if +\fI\&user-agent\fP +is set to +\fB\&@\fP +(at) these headers are sent unchanged in cases where the cookiefile +specifies that a cookie would be sent, +otherwise only default +\fB\&User-Agent\fP +header is sent. +That default +is Mozilla/3.0 (Netscape) +with an unremarkable +Macintosh\" ijbfaq.html#infer +configuration. +If used with a browser less advanced than Mozilla/3.0 or IE-3, the default +may encourage pages containing extensions that confuse the browser. +.TP +.\" anchor: o_h listen-address +\fI-h [host][:port]\fP (Old) listen-address \fI[host][:port]\fP (New) +If +\fI\&host\fP +is specified, +bind the +\fBjunkbuster\fP +to that +\s-2IP\s0 +address. +If a +\fI\&port\fP +is specified, use it. +The default +port +is 8000; +the default host is +\fC\&localhost\fP. +Before Version 2.0.2, +the default was to bind to all +\s-2IP\s0 +addresses +(\fB\&INADDR_ANY\fP); +but this has been restricted to +\fB\&localhost\fP +to avoid unintended security breaches. +(To open the proxy to all, use the line +.br +.ti +0.25i +\fB\&listen-address :8000\fP +.br +in the configuration file.) +.TP +.\" anchor: o_f forwardfile +\fI-f forward_host[:port]\fP (Old) forwardfile \fIforwardfile\fP (New) +Version 1.X required all +\s-2HTTP\s0 +requests from the client to be forwarded to the same destination. +Version 2.0 takes its routing specification from a +\fI\&forwardfile\fP, +allowing selection of the proxy (a.k.a. forwarding host) and gateway +according to the +\s-2URL\s0. +Here is a typical line. +.br +.ft CW +.S 8 +.nf +.sp +* lpwa.com:8000 . . +.S +.ft +.fi +.sp + +.P +Each line contains four fields: +\fB\&target\fP, +\fB\&forward_to\fP, +\fB\&via_gateway_type\fP +and +\fB\&gateway\fP. +As usual, the +last\" ijbman.html#compare +\fB\&target\fP +domain that matches the requested +\s-2URL\s0 +wins, +and the +\fC\&*\fP +character alone matches any domain. +The target domain need not be a fully qualified +hostname; it can be a general domain such as +\fC\&com\fP +or +\fC\&co.uk\fP +or even just a port number. +.\" anchor: nose +For example, because +LPWA +does not handle +SSL,\" ijbfaq.html#encrypt +the line above will typically be followed by a line such as +.br +.ft CW +.S 8 +.nf +.sp +:443 . . . +.S +.ft +.fi +.sp + +to allow SSL transactions to proceed directly. +The cautious would also +add an entry in their blockfile to stop transactions +to port 443 for all but specified trusted sites. +.P +If the winning +\fB\&forward_to\fP +field is +\fC\&.\fP +(the dot character) the proxy connects +directly to the server given in the +\s-2URL\s0, +otherwise it forwards to the host and port number specified. +The default port is 8000. +The +\fC\&via_gateway_type\fP +and +\fC\&gateway\fP +fields also use a dot to indicate no gateway protocol. +The gateway protocols are explained +below.\" ijbman.html#o_g +.P +The example line above in a forwardfile alone +would send everything through port 8000 at +\fC\&lpwa.com\fP +with no gateway protocol, +and is equivalent to the old +\fC\&-f lpwa.com:8000\fP +with no +\fC\&-g\fP +option. +For more information see the example file provided with the distribution. +.P +Configure with care: no loop detection is performed. +When setting up chains of proxies that might loop back, try adding +Squid.\" ijbman.html#squid +.TP +.\" anchor: o_g +\fI-g gw_protocol[:[gw_host][:gw_port]]\fP (Old) +Use +\fI\&gw_protocol\fP +as the gateway protocol. +This option was introduced in Version 1.4, +but was folded into the +forwardfile\" ijbman.html#forwardfile +option in Version 2.0. +The default is to use no gateway protocol; +this may be explicitly specified as +\fB\&direct\fP +on the command line +or the dot character in the forwardfile. +The +\fC\&SOCKS4\fP +protocol may be specified as +\fB\&socks\fP +or +\fB\&socks4\fP. +The +\fC\&SOCKS4A\fP +protocol is specified as +\fB\&socks4a\fP. +The +\fC\&SOCKS5\fP +protocol is not currently supported. +The default +\s-2SOCKS\s0 +\fI\&gw_port\fP +is 1080. +.P +The user's browser should +\fInot\fP +be +configured\" ijbfaq.html#socks +to use +\fC\&SOCKS\fP; +the proxy conducts the negotiations, not the browser. +.P +The user identification capabilities of +\fC\&SOCKS4\fP +are deliberately not used; +the user is always identified to the +\fC\&SOCKS\fP +server as +\fC\&userid=anonymous\fP. +If the server's policy is to reject requests from +\fC\&anonymous\fP, +the proxy will not work. +Use a +debug\" ijbman.html#o_d +value of 3 +to see the status returned by the server. +.TP +.\" anchor: o_d debug +\fI-d N\fP (Old) debug \fIN\fP (New) +Set debug mode. +The most common value is 1, +to +pinpoint\" ijbfaq.html#pinpoint +offensive +\s-2URL\s0s, +so they can be added to the blockfile. +The value of +\fB\&N\fP +is a bitwise +logical-\s-2OR\s0 +of the following values: +.br +.br +\h'-\w"1 = "u'1 = URLs (show each URL requested by the browser); +.br +\h'-\w"2 = "u'2 = Connections (show each connection to or from the proxy); +.br +\h'-\w"4 = "u'4 = I/O (log I/O errors); +.br +\h'-\w"8 = "u'8 = Headers (as each header is scanned, show the header and what is done to it); +.br +\h'-\w"16 = "u'16 = Log everything (including debugging traces and the contents of the pages). +.\" anchor: or +Multiple +\fB\&debug\fP +lines are permitted; they are logical OR-ed together. +.P +Because most browsers send several requests in parallel +the debugging output may appear intermingled, so the +single-threaded\" ijbman.html#single-threaded +option is recommended when using +debug\" ijbman.html#debug +with +\fB\&N\fP +greater than 1. +.TP +.\" anchor: o_y add-forwarded-header +\fI-y\fP (Old) add-forwarded-header \fI\fP (New) +Add +\fB\&X-Forwarded-For\fP +headers to the server-bound +\s-2HTTP\s0 +stream +indicating the client +\s-2IP\s0 +address +to the server,\" ijbfaq.html#detect +in the new style of +Squid 1.1.4.\" ijbman.html#squid +If you want the traditional +\fC\&HTTP_FORWARDED\fP +response header, add it manually with the +-x\" ijbman.html#o_x +option. +.TP +.\" anchor: o_x add-header +\fI-x HeaderText\fP (Old) add-header \fIHeaderText\fP (New) +Add the +\fI\&HeaderText\fP +verbatim to requests to the server. +Typical uses include +adding old-style forwarding notices such as +\fB\&Forwarded: by http://pro-privacy-isp.net\fP +and reinstating the +\fB\&Proxy-Connection: Keep-Alive\fP +header +(which the +\fBjunkbuster\fP +deletes so as +not\" ijbfaq.html#detect +to reveal its existence). +No checking is done for correctness or plausibility, +so it can be used to throw any old trash into the server-bound +\s-2HTTP\s0 +stream. +Please don't litter. +.TP +.\" anchor: o_s single-threaded +\fI-s\fP (Old) single-threaded \fI\fP (New) +Doesn't +\fB\&fork()\fP +a separate process +(or create a separate thread) +to handle each connection. +Useful when debugging to keep the process single threaded. +.TP +.\" anchor: o_l logfile +\fI-l logfile\fP (Old) logfile \fIlogfile\fP (New) +Write all debugging data into +\fI\&logfile.\fP +The default +\fI\&logfile\fP +is the standard output. +.TP +.\" anchor: o_acl aclfile +aclfile \fIaclfile\fP (New) +Unless this option is used, the proxy talks to anyone who can connect to it, +and everyone who can has equal permissions on where they can go. +An access file allows restrictions to be placed on these two policies, +by distinguishing some +\fIsource\fP +\s-2IP\s0 +addresses and/or +some +\fIdestination\fP +addresses. +(If a +forwarder or a gateway\" ijbman.html#forwardfile +is being used, its address is considered the destination address, +not the ultimate +\s-2IP\s0 +address of the +\s-2URL\s0 +requested.) +.P +Each line of the access file begins with +either the word +\fB\&permit\fP +or +\fB\&deny\fP +followed by source and (optionally) destination addresses +to be matched against those of the +\s-2HTTP\s0 +request. +The last matching line specifies the result: if it was a +\fB\&deny\fP +line or if no line matched, +the request will be refused. +.P +A source or destination +can be specified as a single numeric +\s-2IP\s0 +address, +or with a hostname, provided that the host's name +can be resolved to a numeric address: this cannot be used to block all +\fB\&.mil \fP +domains for example, +because there is no single address associated with that domain name. +Either form may be followed by a slash and an integer +\fB\&N\fP, +specifying a subnet mask of +\fB\&N\fP +bits. +For example, +\fB\&permit 207.153.200.72/24\fP +matches the entire Class-C subnet from +207.153.200.0 +through 207.153.200.255. +(A netmask of 255.255.255.0 corresponds to 24 bits of +ones in the netmask, as with +\fC\&*_MASKLEN=24\fP.) +A value of 16 would be used for a Class-B subnet. +A value of zero for +\fB\&N\fP +in the subnet mask length will cause any address to match; +this can be used to express a default rule. +For more information see the example file provided with the distribution. +.P +If you like these access controls +you should probably have +firewall;\" ijbfaq.html#firewall +they are not intended to replace one. +.TP +.\" anchor: o_tf trustfile +trustfile \fItrustfile\fP (New) +This feature is experimental, has not been fully documented and is +very subject to change. +The goal is for parents to be able to choose a page or site whose +links they regard suitable for their +young children\" ijbfaq.html#children +and for the proxy to allow access only to sites mentioned there. +To do this the proxy examines the +referer\" ijbman.html#o_r +variable on each page request to check they resulted from +a click on the ``trusted referer'' site: if so the referred site +is added to a list of trusted sites, so that the child can +then move around that site. +There are several uncertainties in this scheme that experience may be +able to iron out; check back in the months ahead. +.TP +.\" anchor: o_ti trust_info_url +trust_info_url \fItrust_info_url\fP (New) +When access is denied due to lack of a trusted referer, this +\s-2URL\s0 +is displayed with a message pointing the user to it for further information. +.TP +.\" anchor: o_hc hide-console +hide-console \fI\fP (New) +In the Windows version only, instructs the program +to disconnect from and hide the command console after starting. +.TP +.\" anchor: o_a +\fI-a\fP (Old) +(Obsolete) Accept the server's +\fB\&Set-cookie\fP +headers, passing them through to the browser. +.\" anchor: obsolete +This option was removed in Version 1.2 +and replaced by an improvement to the +-c\" ijbman.html#o_c +option. +.LE +.SH INSTALLATION AND USE +Browsers must be told where to find the +\fBjunkbuster\fP +(e.g. +\fB\&localhost\fP +port 8000). +To set the +\s-2HTTP\s0 +proxy in Netscape 3.0, +go through: +\fB\&Options\fP; +\fB\&Network Preferences\fP; +\fB\&Proxies\fP; +\fB\&Manual Proxy Configuration\fP; +\fB\&View\fP. +See the +\s-2FAQ\s0 +for other browsers. +The +Security Proxy\" ijbfaq.html#security +should also be set to the same values, +otherwise +\fB\&shttp:\fP +\s-2URL\s0s +won't work. +.P +Note the limitations +explained in the +\s-2FAQ\s0. +.SH CHECKING OPTIONS +To allow users to +check\" ijbfaq.html#show +that a +\fBjunkbuster\fP +is running and how it is configured, +it intercepts requests for any +\s-2URL\s0 +ending in +\fB\&/show-proxy-args\fP +and blocks it, +returning instead returns information on its +version number and +current configuration +including the contents of its blockfile. +To get an explicit warning that no +\fBjunkbuster\fP +intervened if the proxy was not configured, +it's best to point it to a +\s-2URL\s0 +that does this, such as +http://internet.junkbuster.com/cgi-bin/show-proxy-args +on Junkbusters's website. +.SH SEE ALSO +http://www.waldherr.org/junkbuster/\" waldherr.org# +.br +http://www.junkbusters.com/ht/en/ijbfaq.html\" ijbfaq.html# +.br +http://www.junkbusters.com/ht/en/cookies.html\" cookies.html# +.br +http://internet.junkbuster.com/cgi-bin/show-proxy-args +.br +http://www.cis.ohio-state.edu/htbin/rfc/rfc2109.html +.br +http://squid.nlanr.net/Squid/ +.br +http://www-math.uni-paderborn.de/~axel/ +.SH COPYRIGHT AND GPL +Written and copyright by the Anonymous Coders and Junkbusters Corporation +and made available under the +GNU General Public License (GPL).\" gpl.html# +This software comes with +NO WARRANTY.\" gpl.html#nowarr +Internet Junkbuster +Proxy +is a +trademark\" legal.html#marks +of Junkbusters Corporation. diff --git a/junkbuster.init b/junkbuster.init new file mode 100644 index 00000000..f35001a8 --- /dev/null +++ b/junkbuster.init @@ -0,0 +1,133 @@ +#!/bin/sh +# ******************************************************************** +# +# File : $Source: /cvsroot/ijbswa/current/junkbuster.init,v $ +# +# Purpose : This shell script takes care of starting and stopping +# junkbuster. +# This works only correctly if the user `nobody' is allowed +# to be in the directory where this file is called +# (for example: /root is NOT ok) +# +# Copyright : Written by and Copyright (C) 2001 the SourceForge +# IJBSWA team. http://ijbswa.sourceforge.net +# +# Based on the Internet Junkbuster originally written +# by and Copyright (C) 1997 Anonymous Coders and +# Junkbusters Corporation. http://www.junkbusters.com +# +# This program is free software; you can redistribute it +# and/or modify it under the terms of the GNU General +# Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public +# License for more details. +# +# The GNU General Public License should be included with +# this file. If not, you can view it at +# http://www.gnu.org/copyleft/gpl.html +# or write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Revisions : +# $Log: junkbuster.init,v $ +# Revision 1.7 2001/06/28 13:40:26 sarantis +# remove single quotes from $JB; it was not expanded. +# +# Revision 1.6 2001/06/28 13:38:42 sarantis +# formatting changes; individual return values are returned from the init script. +# +# Revision 1.5 2001/06/11 11:37:40 sarantis +# Minor editing changes. +# +# Revision 1.4 2001/06/09 09:14:11 swa +# shamelessly adapted RPM stuff from the newest rpm that +# RedHat provided for the JB. +# +# Revision 1.3 2001/05/25 10:12:44 oes +# Fixed default case in switch statement (# -> *) +# +# Revision 1.2 2001/05/24 07:52:24 swa +# added header. removed ^M. +# +# +# ********************************************************************/ + +# This is file /etc/rc.d/init.d/junkbuster and was put here +# by the junkbuster rpm +# +# chkconfig: 235 84 09 +# +# description: This shell script takes care of starting and stopping \ +# junkbuster. +# + +# Source function library. +. /etc/rc.d/init.d/functions + +. /etc/sysconfig/network + +# Check that networking is up. +[ ${NETWORKING} = "no" ] && exit 0 +[ -f /usr/sbin/junkbuster ] || exit 0 + +[ -f /etc/junkbuster/config ] || exit 0 + +# See how we were called. + +JB="/usr/sbin/junkbuster /etc/junkbuster/config & " +start () { + # start daemon + [ -f /var/lock/subsys/junkbuster ] && exit 0 + echo -n $"Starting junkbuster: " + daemon --user junkbust $JB + RETVAL=$? + echo + [ $RETVAL = 0 ] && touch /var/lock/subsys/junkbuster + return $RETVAL +} + +stop () { + # stop daemon + echo -n $"Stopping junkbuster: " + killproc junkbuster && rm -f /var/lock/subsys/junkbuster + RETVAL=$? + echo + return $RETVAL +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + reload|restart) + stop + start + RETVAL=$? + ;; + condrestart) + # restart only if already running + if [ -f /var/lock/subsys/junkbuster ] ; then + stop + start + RETVAL=$? + fi + ;; + status) + status junkbuster + RETVAL=$? + ;; + *) + echo $"Usage: junkbuster {start|stop|reload|restart|condrestart|status}" + exit 1 +esac + +exit $RETVAL diff --git a/junkbuster.init.suse b/junkbuster.init.suse new file mode 100644 index 00000000..e49579e1 --- /dev/null +++ b/junkbuster.init.suse @@ -0,0 +1,76 @@ +#! /bin/sh +# ******************************************************************** +# +# File : $Source: /cvsroot/ijbswa/current/junkbuster.init,v $ +# +# Purpose : This shell script takes care of starting and stopping +# junkbuster. +# +# Copyright : Written by and Copyright (C) 2001 the SourceForge +# IJBSWA team. http://ijbswa.sourceforge.net +# +# Based on the Internet Junkbuster originally written +# by and Copyright (C) 1997 Anonymous Coders and +# Junkbusters Corporation. http://www.junkbusters.com +# +# This program is free software; you can redistribute it +# and/or modify it under the terms of the GNU General +# Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. See the GNU General Public +# License for more details. +# +# The GNU General Public License should be included with +# this file. If not, you can view it at +# http://www.gnu.org/copyleft/gpl.html +# or write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Revisions : +# $Log: junkbuster.init,v $ +# +# +# ********************************************************************/ +### BEGIN INIT INFO +# Provides: junkbuster ijb +# Required-Start: $network syslog +# Required-Stop: +# Default-Start: 3 5 +# Default-Stop: +# Description: Starts the Internet Junkbuster +### END INIT INFO +. /etc/rc.config +base=\${0##*/} +link=\${base#*[SK][0-9][0-9]} +#test \$link = \$base && START_IJB=yes +#test "\$START_IJB" = "yes" || exit 0 +return=\$rc_done +case "\$1" in + start) + echo -n "Starting The Internet Junkbuster" + su - nobody -c 'nohup /usr/sbin/junkbuster /etc/junkbuster/config < /dev/null > /dev/null &' + sleep 1 + echo -e "\$return" + ;; + stop) + echo -n "Shutting down The Internet Junkbuster" + killproc -TERM /usr/sbin/junkbuster || return=\$rc_failed + echo -e "\$return" + ;; + restart|reload) + \$0 stop && \$0 start || return=\$rc_failed + ;; + status) + checkproc /usr/sbin/junkbuster && echo OK || echo No process + ;; + *) + echo "Usage: \$0 {start|restart|status|stop}" + exit 1 +esac +test "\$return" = "\$rc_done" || exit 1 +exit 0 diff --git a/privoxy.logrotate b/junkbuster.logrotate similarity index 56% rename from privoxy.logrotate rename to junkbuster.logrotate index 035112a5..e13ee1d5 100644 --- a/privoxy.logrotate +++ b/junkbuster.logrotate @@ -1,15 +1,15 @@ # -# Logrotate file for Privoxy RPM +# Logrotate file for Junkbuster RPM # # ******************************************************************** # -# File : $Source: /cvsroot/ijbswa/current/privoxy.logrotate,v $ +# File : $Source: /cvsroot/ijbswa/current/junkbuster.logrotate,v $ # -# Purpose : Rotates all potential Privoxy logfiles +# Purpose : Rotates all potential Junkbuster logfiles # # # Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ +# IJBSWA team. http://ijbswa.sourceforge.net # # Based on the Internet Junkbuster originally written # by and Copyright (C) 1997 Anonymous Coders and @@ -34,35 +34,7 @@ # 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 @@ -78,19 +50,13 @@ # # ********************************************************************/ -/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 } diff --git a/privoxy.monthly b/junkbuster.monthly similarity index 87% rename from privoxy.monthly rename to junkbuster.monthly index 15734ddf..89dac657 100644 --- a/privoxy.monthly +++ b/junkbuster.monthly @@ -2,13 +2,13 @@ # ******************************************************************** # -# File : $Source: /cvsroot/ijbswa/current/privoxy.monthly,v $ +# File : $Source: /cvsroot/ijbswa/current/gateway.h,v $ # # Purpose : Downloads updated configuration (blocklists, ...) # to the machine. # # Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ +# IJBSWA team. http://ijbswa.sourceforge.net # # Based on the Internet Junkbuster originally written # by and Copyright (C) 1997 Anonymous Coders and @@ -33,16 +33,7 @@ # 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 $ # # # ********************************************************************/ diff --git a/privoxy.weekly b/junkbuster.weekly similarity index 84% rename from privoxy.weekly rename to junkbuster.weekly index 81424f8d..fdd5bf14 100644 --- a/privoxy.weekly +++ b/junkbuster.weekly @@ -2,13 +2,13 @@ # ******************************************************************** # -# File : $Source: /cvsroot/ijbswa/current/privoxy.weekly,v $ +# File : $Source: /cvsroot/ijbswa/current/junkbuster.monthly,v $ # # Purpose : Downloads updated configuration (blocklists, ...) # to the machine. # # Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ +# IJBSWA team. http://ijbswa.sourceforge.net # # Based on the Internet Junkbuster originally written # by and Copyright (C) 1997 Anonymous Coders and @@ -33,16 +33,7 @@ # 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 # diff --git a/killpopup.c b/killpopup.c index 34653738..95dfabb6 100644 --- a/killpopup.c +++ b/killpopup.c @@ -1,4 +1,4 @@ -const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Exp $"; +const char killpopup_rcs[] = "$Id: killpopup.c,v 1.3 2001/05/22 18:56:28 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/killpopup.c,v $ @@ -6,13 +6,13 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex * Purpose : Handles the filtering of popups. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at @@ -32,54 +32,6 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex * * Revisions : * $Log: killpopup.c,v $ - * Revision 1.15 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.14 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.13 2001/11/13 00:16:40 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.12 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.11 2001/10/07 15:42:41 oes - * filter_popups now gets a csp pointer so it can raise the new - * CSP_FLAG_MODIFIED flag. - * - * Revision 1.10 2001/09/22 16:34:44 jongfoster - * Removing unneeded #includes - * - * Revision 1.9 2001/07/31 14:44:22 oes - * Deleted unused size parameter from filter_popups() - * - * Revision 1.8 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.7 2001/07/20 19:29:25 haroon - * - In v1.5 forgot to add that I implemented LOG_LEVEL_POPUPS in errlog.c, - * errlog.h and killpopup.c. In that case, it is superfluous to have define for - * POPUP_VERBOSE, so I removed the defines and logging is now done - * via log_error(LOG_LEVEL_POPUPS, ....) - * - * Revision 1.6 2001/07/19 19:11:35 haroon - * - Implemented Guy's idea of replacing window.open( with 1;''.concat( - * - Implemented Guy's idea of replacing .resizeTo( with .scrollTo( - * - * 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 * @@ -109,102 +61,122 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex #include #include #include +#include #include #include #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #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, "'); - if (close_p) + close=strchr(popup,'>'); + if (close) { - /* we are now between */ - p = strstr(start_p, "onUnload"); + /* we are now between 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: diff --git a/killpopup.h b/killpopup.h index 7d2eadf6..23bd7d7b 100644 --- a/killpopup.h +++ b/killpopup.h @@ -1,6 +1,6 @@ -#ifndef KILLPOPUP_H_INCLUDED -#define KILLPOPUP_H_INCLUDED -#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.7 2002/03/24 13:25:43 swa Exp $" +#ifndef _KILLPOPUP_H +#define _KILLPOPUP_H +#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.1.1.1 2001/05/15 13:58:58 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/killpopup.h,v $ @@ -8,7 +8,7 @@ * Purpose : Handles the filtering of popups. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -34,39 +34,6 @@ * * 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 * @@ -76,25 +43,17 @@ #include "project.h" -#ifdef __cplusplus -extern "C" { -#endif +#ifdef KILLPOPUPS -#ifdef FEATURE_KILL_POPUPS +extern void filter_popups(char *buff, int size); -extern void filter_popups(char *buff, struct client_state *csp); - -#endif /* def FEATURE_KILL_POPUPS */ +#endif /* def KILLPOPUPS */ /* Revision control strings from this header and associated .c file */ extern const char killpopup_rcs[]; extern const char killpopup_h_rcs[]; -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* ndef KILLPOPUP_H_INCLUDED */ +#endif /* ndef _KILLPOPUP_H */ /* Local Variables: diff --git a/list.c b/list.c index 6cd7f891..18e5da7e 100644 --- a/list.c +++ b/list.c @@ -1,4 +1,4 @@ -const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; +const char list_rcs[] = "$Id: list.c,v 1.4 2001/06/29 13:30:22 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/list.c,v $ @@ -8,13 +8,13 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; * `destroy_list', `enlist' and `list_to_text' * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at @@ -34,47 +34,6 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; * * Revisions : * $Log: list.c,v $ - * Revision 1.14 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.13 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.12 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.11 2001/10/23 21:21:03 jongfoster - * New error handling - error codes are now jb_errs, not ints. - * Changed the way map() handles out-of-memory, to dramatically - * reduce the amount of error-checking clutter needed. - * - * Revision 1.10 2001/09/16 17:30:24 jongfoster - * Fixing a compiler warning. - * - * Revision 1.9 2001/09/16 13:20:29 jongfoster - * Rewrite of list library. Now has seperate header and list_entry - * structures. Also added a large sprinking of assert()s to the list - * code. - * - * Revision 1.8 2001/08/07 14:00:20 oes - * Fixed comment - * - * Revision 1.7 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.6 2001/07/31 14:44:51 oes - * list_to_text() now appends empty line at end - * - * Revision 1.5 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * * Revision 1.4 2001/06/29 13:30:22 oes * - Added Convenience function enlist_unique_header(), * which takes the Header name and value as separate @@ -111,174 +70,23 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $"; #include "config.h" -#ifndef _WIN32 -/* FIXME: The following headers are not needed for Win32. Are they - * needed on other platforms? - */ #include #include #include #include -#endif #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #endif -#include - #include "project.h" +#include "jcc.h" #include "list.h" #include "miscutil.h" const char list_h_rcs[] = LIST_H_VERSION; - -static int list_is_valid (const struct list *the_list); - - -/********************************************************************* - * - * Function : list_init - * - * Description : Create a new, empty list in user-allocated memory. - * Caller should allocate a "struct list" variable, - * then pass it to this function. - * (Implementation note: Rather than calling this - * function, you can also just memset the memory to - * zero, e.g. if you have a larger structure you - * want to initialize quickly. However, that isn't - * really good design.) - * - * Parameters : - * 1 : the_list = pointer to list - * - * Returns : N/A - * - *********************************************************************/ -void init_list(struct list *the_list) -{ - memset(the_list, '\0', sizeof(*the_list)); -} - - -/********************************************************************* - * - * Function : destroy_list - * - * Description : Destroy a string list (opposite of list_init). - * On return, the memory used by the list entries has - * been freed, but not the memory used by the_list - * itself. You should not re-use the_list without - * calling list_init(). - * - * (Implementation note: You *can* reuse the_list - * without calling list_init(), but please don't. - * If you want to remove all entries from a list - * and still have a usable list, then use - * list_remove_all().) - * - * Parameters : - * 1 : the_list = pointer to list - * - * Returns : N/A - * - *********************************************************************/ -void destroy_list (struct list *the_list) -{ - struct list_entry *cur_entry, *next_entry; - - assert(the_list); - - for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry) - { - next_entry = cur_entry->next; - freez(cur_entry->str); - free(cur_entry); - } - - the_list->first = NULL; - the_list->last = NULL; -} - - -/********************************************************************* - * - * Function : list_is_valid - * - * Description : Check that a string list is valid. The intended - * usage is "assert(list_is_valid(the_list))". - * Currently this checks that "the_list->last" - * is correct, and that the list dosn't contain - * circular references. It is likely to crash if - * it's passed complete garbage. - * - * Parameters : - * 1 : the_list = pointer to list. Must be non-null. - * - * Returns : 1 if list is valid, 0 otherwise. - * - *********************************************************************/ -static int list_is_valid (const struct list *the_list) -{ - /* - * If you don't want this check, just change the line below - * from "#if 1" to "#if 0". - */ -#if 1 - const struct list_entry *cur_entry; - const struct list_entry *last_entry = NULL; - int length = 0; - - assert(the_list); - - for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next) - { - last_entry = cur_entry; - - if (cur_entry->str) - { - /* - * Just check that this string can be accessed - i.e. it's a valid - * pointer. - */ - strlen(cur_entry->str); - } - - /* - * Check for looping back to first - */ - if ((length != 0) && (cur_entry == the_list->first)) - { - return 0; - } - - /* - * Arbitrarily limit length to prevent infinite loops. - */ - if (++length > 1000) - { - return 0; - } - - /* - * Check this isn't marked as the last entry, unless of course it's - * *really* the last entry. - */ - if ((the_list->last == cur_entry) && (cur_entry->next != NULL)) - { - /* This is the last entry, but there's data after it !!?? */ - return 0; - } - } - - return (the_list->last == last_entry); -#else - return 1; -#endif -} - /********************************************************************* * * Function : enlist @@ -286,51 +94,32 @@ static int list_is_valid (const struct list *the_list) * Description : Append a string into a specified string list. * * Parameters : - * 1 : the_list = pointer to list + * 1 : header = pointer to list 'dummy' header * 2 : str = string to add to the list (maybe NULL) * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. + * Returns : N/A * *********************************************************************/ -jb_err enlist(struct list *the_list, const char *str) +void enlist(struct list *header, const char *str) { - struct list_entry *cur; - - assert(the_list); - assert(list_is_valid(the_list)); + struct list *cur = (struct list *)malloc(sizeof(*cur)); + struct list *last; - if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur)))) + if (cur) { - return JB_ERR_MEMORY; - } + cur->str = (str ? strdup(str) : NULL); + cur->next = NULL; - if (str) - { - if (NULL == (cur->str = strdup(str))) + last = header->last; + if (last == NULL) { - free(cur); - return JB_ERR_MEMORY; + last = header; } - } - /* else { cur->str = NULL; } - implied by zalloc */ - - /* cur->next = NULL; - implied by zalloc */ - if (the_list->last) - { - the_list->last->next = cur; - the_list->last = cur; - } - else - { - the_list->first = cur; - the_list->last = cur; + last->next = cur; + header->last = cur; } - assert(list_is_valid(the_list)); - return JB_ERR_OK; } @@ -342,46 +131,28 @@ jb_err enlist(struct list *the_list, const char *str) * string list. * * Parameters : - * 1 : the_list = pointer to list + * 1 : header = pointer to list 'dummy' header * 2 : str = string to add to the list (maybe NULL) * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. + * Returns : N/A * *********************************************************************/ -jb_err enlist_first(struct list *the_list, const char *str) +void enlist_first(struct list *header, const char *str) { - struct list_entry *cur; - - assert(the_list); - assert(list_is_valid(the_list)); + struct list *cur = (struct list *)malloc(sizeof(*cur)); - if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur)))) + if (cur) { - return JB_ERR_MEMORY; - } + cur->str = (str ? strdup(str) : NULL); + cur->next = header->next; - if (str) - { - if (NULL == (cur->str = strdup(str))) + header->next = cur; + if (header->last == NULL) { - free(cur); - return JB_ERR_MEMORY; + header->last = cur; } } - /* else { cur->str = NULL; } - implied by zalloc */ - - cur->next = the_list->first; - the_list->first = cur; - if (the_list->last == NULL) - { - the_list->last = cur; - } - - assert(list_is_valid(the_list)); - return JB_ERR_OK; } @@ -391,59 +162,49 @@ jb_err enlist_first(struct list *the_list, const char *str) * * Description : Append a string into a specified string list, * if & only if it's not there already. - * If the num_significant_chars argument is nonzero, - * only compare up to the nth character. + * If the n argument is nonzero, only compare up to + * the nth character. * * Parameters : - * 1 : the_list = pointer to list - * 2 : str = string to add to the list - * 3 : num_significant_chars = number of chars to use - * for uniqueness test, or 0 to require an exact match. + * 1 : header = pointer to list 'dummy' header + * 2 : str = string to add to the list (maybe NULL) + * 3 : n = number of chars to use for uniqueness test * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. - * "Success" does not indicate whether or not the - * item was already in the list. + * Returns : N/A * *********************************************************************/ -jb_err enlist_unique(struct list *the_list, const char *str, - size_t num_significant_chars) +void enlist_unique(struct list *header, const char *str, int n) { - struct list_entry *cur_entry; - - assert(the_list); - assert(list_is_valid(the_list)); - assert(str); - assert(num_significant_chars >= 0); - assert(num_significant_chars <= strlen(str)); + struct list *last; + struct list *cur = header->next; - if (num_significant_chars > 0) + while (cur != NULL) { - for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next) + if ((cur->str != NULL) && ( + (n && (0 == strncmp(str, cur->str, n))) || + (!n && (0 == strcmp(str, cur->str))))) { - if ( (cur_entry->str != NULL) - && (0 == strncmp(str, cur_entry->str, num_significant_chars))) - { - /* Already there */ - return JB_ERR_OK; - } + /* Already there */ + return; } + cur = cur->next; } - else + + cur = (struct list *)malloc(sizeof(*cur)); + + if (cur != NULL) { - /* Test whole string */ - for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next) + cur->str = (str ? strdup(str) : NULL); /* FIXME check retval */ + cur->next = NULL; + + last = header->last; + if (last == NULL) { - if ( (cur_entry->str != NULL) && (0 == strcmp(str, cur_entry->str))) - { - /* Already there */ - return JB_ERR_OK; - } + last = header; } + last->next = cur; + header->last = cur; } - - return enlist(the_list, str); } @@ -456,84 +217,80 @@ jb_err enlist_unique(struct list *the_list, const char *str, * if & only if there isn't already a header with that name. * * Parameters : - * 1 : the_list = pointer to list - * 2 : name = HTTP header name (e.g. "Content-type") - * 3 : value = HTTP header value (e.g. "text/html") + * 1 : header = pointer to list 'dummy' header + * 2 : first = first string to add to the list (maybe NULL) + * 3 : second = number of chars to use for uniqueness test * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, the_list will be unchanged. - * "Success" does not indicate whether or not the - * header was already in the list. + * Returns : N/A * *********************************************************************/ -jb_err enlist_unique_header(struct list *the_list, const char *name, - const char *value) +void enlist_unique_header(struct list *header, const char *name, const char *value) { - size_t length; - jb_err result; - char *str; + struct list *last; + struct list *cur = header->next; + int length; + char *dummy; + + if (name == NULL || value == NULL) return; - assert(the_list); - assert(list_is_valid(the_list)); - assert(name); - assert(value); + dummy = strdup(name); + dummy = strsav(dummy, ": "); + length = strlen(dummy); - length = strlen(name) + 2; - if (NULL == (str = (char *)malloc(length + strlen(value) + 1))) + while (cur != NULL) { - return JB_ERR_MEMORY; + if ((cur->str != NULL) && + (0 == strncmp(dummy, cur->str, length))) + { + /* Already there */ + return; + } + cur = cur->next; } - strcpy(str, name); - str[length - 2] = ':'; - str[length - 1] = ' '; - strcpy(str + length, value); - result = enlist_unique(the_list, str, length); + cur = (struct list *)malloc(sizeof(*cur)); - free(str); - - assert(list_is_valid(the_list)); - - return result; + if (cur != NULL) + { + cur->str = strsav(dummy, value); + cur->next = NULL; + last = header->last; + if (last == NULL) + { + last = header; + } + last->next = cur; + header->last = cur; + } } /********************************************************************* * - * Function : list_remove_all + * Function : destroy_list * - * Description : Remove all entries from a list. On return, the_list - * is a valid, empty list. Note that this is similar - * to destroy_list(), but the difference is that this - * function guarantees that the list structure is still - * valid after the call. + * Description : Destroy a string list (opposite of enlist) * * Parameters : - * 1 : the_list = pointer to list + * 1 : header = pointer to list 'dummy' header * * Returns : N/A * *********************************************************************/ -void list_remove_all(struct list *the_list) +void destroy_list(struct list *header) { - struct list_entry *cur_entry; - struct list_entry *next_entry; + struct list *p, *n; - assert(the_list); - assert(list_is_valid(the_list)); - - for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry) + for (p = header->next; p ; p = n) { - next_entry = cur_entry->next; - freez(cur_entry->str); - free(cur_entry); + n = p->next; + freez(p->str); + free(p); } - the_list->first = the_list->last = NULL; + memset(header, '\0', sizeof(*header)); - assert(list_is_valid(the_list)); } @@ -541,56 +298,52 @@ void list_remove_all(struct list *the_list) * * Function : list_to_text * - * Description : "Flatten" a string list into 1 long \r\n delimited string, - * adding an empty line at the end. NULL entries are ignored. - * This function does not change the_list. + * Description : "Flaten" a string list into 1 long \r\n delimited string. * * Parameters : - * 1 : the_list = pointer to list + * 1 : h = pointer to list 'dummy' header * * Returns : NULL on malloc error, else new long string. - * Caller must free() it. * *********************************************************************/ -char *list_to_text(const struct list *the_list) +char *list_to_text(struct list *h) { - struct list_entry *cur_entry; + struct list *p; char *ret = NULL; char *s; - size_t size = 2; + int size; - assert(the_list); - assert(list_is_valid(the_list)); + size = 0; - for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next) + for (p = h->next; p ; p = p->next) { - if (cur_entry->str) + if (p->str) { - size += strlen(cur_entry->str) + 2; + size += strlen(p->str) + 2; } } if ((ret = (char *)malloc(size + 1)) == NULL) { - return NULL; + return(NULL); } ret[size] = '\0'; s = ret; - for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next) + for (p = h->next; p ; p = p->next) { - if (cur_entry->str) + if (p->str) { - strcpy(s, cur_entry->str); + strcpy(s, p->str); s += strlen(s); *s++ = '\r'; *s++ = '\n'; } } - *s++ = '\r'; *s++ = '\n'; - return ret; + return(ret); + } @@ -601,54 +354,36 @@ char *list_to_text(const struct list *the_list) * Description : Remove a string from a specified string list. * * Parameters : - * 1 : the_list = pointer to list - * 2 : str = string to remove from the list - non-NULL + * 1 : header = pointer to list 'dummy' header + * 2 : str = string to remove from the list * * Returns : Number of times it was removed. * *********************************************************************/ -int list_remove_item(struct list *the_list, const char *str) +int list_remove_item(struct list *header, const char *str) { - struct list_entry *prev = NULL; - struct list_entry *cur; - struct list_entry *next; + struct list *prev = header; + struct list *cur = prev->next; int count = 0; - assert(the_list); - assert(list_is_valid(the_list)); - assert(str); - - cur = the_list->first; - while (cur != NULL) { - next = cur->next; - if ((cur->str != NULL) && (0 == strcmp(str, cur->str))) { count++; - if (prev != NULL) - { - prev->next = next; - } - else - { - the_list->first = next; - } - free((char *)cur->str); + prev->next = cur->next; + free(cur->str); free(cur); } else { prev = cur; } - cur = next; + cur = prev->next; } - the_list->last = prev; - - assert(list_is_valid(the_list)); + header->last = prev; return count; } @@ -671,25 +406,18 @@ int list_remove_item(struct list *the_list, const char *str) *********************************************************************/ int list_remove_list(struct list *dest, const struct list *src) { - struct list_entry *cur; + struct list *cur = src->next; int count = 0; - assert(src); - assert(dest); - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - for (cur = src->first; cur != NULL; cur = cur->next) + while (cur != NULL) { if (cur->str != NULL) { count += list_remove_item(dest, cur->str); } + cur = cur->next; } - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - return count; } @@ -698,96 +426,35 @@ int list_remove_list(struct list *dest, const struct list *src) * * Function : list_duplicate * - * Description : Copy a string list + * Description : Duplicate a string list * * Parameters : - * 1 : dest = Destination list. Must be a valid list. - * All existing entries will be removed. - * 1 : src = pointer to source list for copy. + * 1 : dest = pointer to destination for copy. Caller allocs. + * 2 : src = pointer to source for copy. * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, dest will be empty. + * Returns : N/A * *********************************************************************/ -jb_err list_duplicate(struct list *dest, const struct list *src) +void list_duplicate(struct list *dest, const struct list *src) { - struct list_entry * cur_src; - struct list_entry * cur_dest; + struct list * cur_src = src->next; + struct list * cur_dest = dest; - assert(src); - assert(dest); - assert(list_is_valid(src)); - assert(list_is_valid(dest)); + memset(dest, '\0', sizeof(*dest)); - list_remove_all(dest); - - /* Need to process first entry specially so we can set dest->first */ - cur_src = src->first; - if (cur_src) + while (cur_src) { - cur_dest = dest->first = (struct list_entry *)zalloc(sizeof(*cur_dest)); + cur_dest = cur_dest->next = (struct list *)zalloc(sizeof(*cur_dest)); if (cur_dest == NULL) { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; + return; } - - if (cur_src->str) - { - cur_dest->str = strdup(cur_src->str); - if (cur_dest->str == NULL) - { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - } - /* else { cur_dest->str = NULL; } - implied by zalloc */ - - /* Now process the rest */ - for (cur_src = cur_src->next; cur_src; cur_src = cur_src->next) - { - cur_dest = cur_dest->next = (struct list_entry *)zalloc(sizeof(*cur_dest)); - if (cur_dest == NULL) - { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - if (cur_src->str) - { - cur_dest->str = strdup(cur_src->str); - if (cur_dest->str == NULL) - { - destroy_list(dest); - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - } - /* else { cur_dest->str = NULL; } - implied by zalloc */ - } - - dest->last = cur_dest; + cur_dest->str = strdup(cur_src->str); + cur_src = cur_src->next; } - assert(list_is_valid(src)); - assert(list_is_valid(dest)); + dest->last = cur_dest; - return JB_ERR_OK; } @@ -799,261 +466,120 @@ jb_err list_duplicate(struct list *dest, const struct list *src) * Duplicate items are not added. * * Parameters : - * 1 : dest = pointer to destination list for merge. + * 1 : dest = pointer to destination for merge. Caller allocs. * 2 : src = pointer to source for merge. * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. - * On error, some (but not all) of src might have - * been copied into dest. + * Returns : N/A * *********************************************************************/ -jb_err list_append_list_unique(struct list *dest, const struct list *src) +void list_append_list_unique(struct list *dest, const struct list *src) { - struct list_entry * cur; - - assert(src); - assert(dest); - assert(list_is_valid(src)); - assert(list_is_valid(dest)); + struct list * cur = src->next; - for (cur = src->first; cur; cur = cur->next) + while (cur) { - if (cur->str) - { - if (enlist_unique(dest, cur->str, 0)) - { - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_MEMORY; - } - } + enlist_unique(dest, cur->str, 0); + cur = cur->next; } - - assert(list_is_valid(src)); - assert(list_is_valid(dest)); - - return JB_ERR_OK; } /********************************************************************* * - * Function : list_is_empty - * - * Description : Test whether a list is empty. Does not change the list. - * - * Parameters : - * 1 : the_list = pointer to list to test. - * - * Returns : Nonzero iff the list contains no entries. - * - *********************************************************************/ -int list_is_empty(const struct list *the_list) -{ - assert(the_list); - assert(list_is_valid(the_list)); - - return (the_list->first == NULL); -} - - -/********************************************************************* - * - * Function : new_map - * - * Description : Create a new, empty map. - * - * Parameters : N/A - * - * Returns : A new, empty map, or NULL if out of memory. - * - *********************************************************************/ -struct map *new_map(void) -{ - return (struct map *) zalloc(sizeof(struct map)); -} - - -/********************************************************************* + * Function : map * - * Function : free_map + * Description : Add a mapping from given name to given value to a + * given map. * - * Description : Free the memory occupied by a map and its - * depandant strings + * Note: Since all strings will be free()d in free_map() + * later, use the copy flags for constants or + * strings that will be independantly free()d. * * Parameters : - * 1 : the_map = map to be freed. May be NULL. + * 1 : map = map to add to + * 2 : name = name to add + * 3 : nc = flag set if a copy of name should be used + * 4 : value = value to add + * 5 : vc = flag set if a copy of value should be used * - * Returns : N/A + * Returns : pointer to extended map, or NULL if failiure * *********************************************************************/ -void free_map(struct map *the_map) +struct map *map(struct map *map, char *name, int nc, char *value, int vc) { - struct map_entry *cur_entry; - struct map_entry *next_entry; + struct map *cur; - if (the_map == NULL) + if (NULL == (cur = zalloc(sizeof(*cur)))) { - return; + return(NULL); } - for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = next_entry) - { - freez(cur_entry->name); - freez(cur_entry->value); - - next_entry = cur_entry->next; - free(cur_entry); - } + cur->name = nc ? strdup(name) : name; + cur->value = vc ? strdup(value) : value; + cur->next = map; - the_map->first = the_map->last = NULL; + return(cur); - free(the_map); } /********************************************************************* * - * Function : map - * - * Description : Add a mapping from given name to given value to a - * given map. - * - * Note: Since all strings will be free()d in free_map() - * later, set the copy flags for constants or - * strings that will be independantly free()d. - * - * Note2: This function allows NULL parameters - it - * returns JB_ERR_MEMORY in that case. - * - * Note3: If this function returns JB_ERR_MEMORY, - * it will free(name) unless you specify - * name_needs_copying, and similarly it will - * free(value) unless you specify - * value_needs_copying. - * - * Due to Note2 and Note3 above, the following code - * is legal, and will never crash or leak memory even - * if the system runs out of memory: - * - * err = map(mymap, "xyz", 1, html_encode(somestring), 0); + * Function : lookup * - * err will be set to JB_ERR_MEMORY if either call runs - * out-of-memory. Without these features, you would - * need to check the return value of html_encode in the - * above example for NULL, which (at least) doubles the - * amount of error-checking code needed. + * Description : Look up an item with a given name in a map, and + * return its value * * Parameters : - * 1 : the_map = map to add to - * 2 : name = name to add - * 3 : name_needs_copying = flag set if a copy of name should be used - * 4 : value = value to add - * 5 : value_needs_copying = flag set if a copy of value should be used + * 1 : name = name parameter to look for * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory error. + * Returns : the value if found, else the empty string * *********************************************************************/ -jb_err map(struct map *the_map, - const char *name, int name_needs_copying, - const char *value, int value_needs_copying) +char *lookup(struct map *map, char *name) { - struct map_entry *new_entry; + struct map *p = map; - assert(the_map); - - if ( (NULL == value) - || (NULL == name) - || (NULL == (new_entry = zalloc(sizeof(*new_entry)))) ) + while (p) { - if ((name != NULL) && (!name_needs_copying)) + if (!strcmp(name, p->name)) { - free((char *)name); + return p->value; } - if ((value != NULL) && (!value_needs_copying)) - { - free((char *)value); - } - return JB_ERR_MEMORY; - } - - if (name_needs_copying) - { - if (NULL == (name = strdup(name))) - { - free(new_entry); - if (!value_needs_copying) - { - free((char *)value); - } - return JB_ERR_MEMORY; - } - } - - if (value_needs_copying) - { - if (NULL == (value = strdup(value))) - { - free((char *)name); - free(new_entry); - return JB_ERR_MEMORY; - } - } - - new_entry->name = name; - new_entry->value = value; - /* new_entry->next = NULL; - implied by zalloc */ - - if (the_map->last) - { - the_map->last->next = new_entry; - the_map->last = new_entry; - } - else - { - the_map->first = new_entry; - the_map->last = new_entry; + p = p->next; } + return ""; - return JB_ERR_OK; } /********************************************************************* * - * Function : lookup + * Function : free_map * - * Description : Look up an item with a given name in a map, and - * return its value + * Description : Free the memory occupied by a map and its + * depandant strings * * Parameters : - * 1 : the_map = map to look in - * 2 : name = name parameter to look for + * 1 : list = list to bee freed * - * Returns : the value if found, else the empty string. - * Return value is alloced as part of the map, so - * it is freed when the map is destroyed. Caller - * must not free or modify it. + * Returns : N/A * *********************************************************************/ -const char *lookup(const struct map *the_map, const char *name) +void free_map(struct map *map) { - const struct map_entry *cur_entry; - - assert(the_map); - assert(name); + struct map *p = map; - for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = cur_entry->next) + while (p) { - if (!strcmp(name, cur_entry->name)) - { - return cur_entry->value; - } + free(p->name); + free(p->value); + + map = p->next; + free(p); + p = map; } - return ""; + } diff --git a/list.h b/list.h index afa44238..bbaa5aa1 100644 --- a/list.h +++ b/list.h @@ -1,6 +1,6 @@ -#ifndef LIST_H_INCLUDED -#define LIST_H_INCLUDED -#define LIST_H_VERSION "$Id: list.h,v 1.11 2002/03/24 13:25:43 swa Exp $" +#ifndef _LIST_H +#define _LIST_H +#define LIST_H_VERSION "$Id: list.h,v 1.3 2001/06/03 11:03:48 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/list.h,v $ @@ -10,7 +10,7 @@ * `destroy_list', `enlist' and `list_to_text' * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -36,40 +36,6 @@ * * Revisions : * $Log: list.h,v $ - * Revision 1.11 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.10 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.9 2001/10/23 21:21:03 jongfoster - * New error handling - error codes are now jb_errs, not ints. - * Changed the way map() handles out-of-memory, to dramatically - * reduce the amount of error-checking clutter needed. - * - * Revision 1.8 2001/09/16 17:30:24 jongfoster - * Fixing a compiler warning. - * - * Revision 1.7 2001/09/16 13:20:29 jongfoster - * Rewrite of list library. Now has seperate header and list_entry - * structures. Also added a large sprinking of assert()s to the list - * code. - * - * Revision 1.6 2001/08/05 16:06:20 jongfoster - * Modifiying "struct map" so that there are now separate header and - * "map_entry" structures. This means that functions which modify a - * map no longer need to return a pointer to the modified map. - * Also, it no longer reverses the order of the entries (which may be - * important with some advanced template substitutions). - * - * Revision 1.5 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.4 2001/06/29 13:30:37 oes - * - Introduced enlist_unique_header() - * - Removed logentry from cancelled commit - * * Revision 1.3 2001/06/03 11:03:48 oes * introduced functions for new list type "map": map(), lookup(), * free_map(), and extended enlist_unique @@ -104,48 +70,25 @@ extern "C" { #endif -/* - * struct list - * - * A linked list class. - */ - -extern void init_list (struct list *the_list); -extern void destroy_list (struct list *the_list); - -extern jb_err enlist (struct list *the_list, const char *str); -extern jb_err enlist_unique (struct list *the_list, const char *str, size_t num_significant_chars); -extern jb_err enlist_unique_header (struct list *the_list, const char *name, const char *value); -extern jb_err enlist_first (struct list *the_list, const char *str); -extern jb_err list_append_list_unique(struct list *dest, const struct list *src); -extern jb_err list_duplicate (struct list *dest, const struct list *src); - -extern int list_remove_item(struct list *the_list, const char *str); -extern int list_remove_list(struct list *dest, const struct list *src); -extern void list_remove_all (struct list *the_list); - -extern int list_is_empty(const struct list *the_list); +extern void enlist(struct list *h, const char *s); +extern void enlist_unique(struct list *header, const char *str, int n); +extern void enlist_unique_header(struct list *header, const char *name, const char *value); +extern void enlist_first(struct list *header, const char *str); -extern char * list_to_text(const struct list *the_list); +extern int list_remove_item(struct list *header, const char *str); +extern void list_append_list_unique(struct list *dest, const struct list *src); +extern void list_append_list_unique(struct list *dest, const struct list *src); +extern int list_remove_list(struct list *header, const struct list *to_remove); -/* - * struct map - * - * A class which maps names to values. - * - * Note: You must allocate this through new_map() and free it - * through free_map(). - */ - -extern struct map * new_map (void); -extern void free_map (struct map * the_map); +extern void list_duplicate(struct list *dest, const struct list *src); -extern int map (struct map * the_map, - const char * name, int name_needs_copying, - const char * value, int value_needs_copying); -extern const char * lookup (const struct map * the_map, const char * name); +extern void destroy_list(struct list *h); +extern char *list_to_text(struct list *h); +extern struct map* map(struct map* map, char *name, int nc, char *value, int vc); +extern char *lookup(struct map *list, char *name); +extern void free_map(struct map *list); /* Revision control strings from this header and associated .c file */ extern const char list_rcs[]; @@ -155,7 +98,7 @@ extern const char list_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef LIST_H_INCLUDED */ +#endif /* ndef _LIST_H */ /* Local Variables: diff --git a/loadcfg.c b/loadcfg.c index 10bba47e..91670bb9 100644 --- a/loadcfg.c +++ b/loadcfg.c @@ -1,21 +1,22 @@ -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 @@ -35,110 +36,6 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: loadcfg.c,v $ - * Revision 1.39 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.38 2002/03/24 13:05:48 jongfoster - * Renaming re_filterfile to filterfile - * - * Revision 1.37 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.36 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.35 2002/03/07 03:52:44 oes - * Set logging to tty for --no-daemon mode - * - * Revision 1.34 2002/03/06 23:14:35 jongfoster - * Trivial cosmetic changes to make function comments easier to find. - * - * Revision 1.33 2002/03/05 04:52:42 oes - * Deleted non-errlog debugging code - * - * Revision 1.32 2002/03/04 18:24:53 oes - * Re-enabled output of unknown config directive hash - * - * Revision 1.31 2002/03/03 15:07:20 oes - * Re-enabled automatic config reloading - * - * Revision 1.30 2002/01/22 23:31:43 jongfoster - * Replacing strsav() with string_append() - * - * Revision 1.29 2002/01/17 21:02:30 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Revision 1.28 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.27 2001/11/07 00:02:13 steudten - * Add line number in error output for lineparsing for - * actionsfile and configfile. - * Special handling for CLF added. - * - * Revision 1.26 2001/11/05 21:41:43 steudten - * Add changes to be a real daemon just for unix os. - * (change cwd to /, detach from controlling tty, set - * process group and session leader to the own process. - * Add DBG() Macro. - * Add some fatal-error log message for failed malloc(). - * Add '-d' if compiled with 'configure --with-debug' to - * enable debug output. - * - * Revision 1.25 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.24 2001/10/23 21:40:30 jongfoster - * Added support for enable-edit-actions and enable-remote-toggle config - * file options. - * - * Revision 1.23 2001/10/07 15:36:00 oes - * Introduced new config option "buffer-limit" - * - * Revision 1.22 2001/09/22 16:36:59 jongfoster - * Removing unused parameter fs from read_config_line() - * - * Revision 1.21 2001/09/16 17:10:43 jongfoster - * Moving function savearg() here, since it was the only thing left in - * showargs.c. - * - * Revision 1.20 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.19 2001/07/15 17:45:16 jongfoster - * Removing some unused #includes - * - * Revision 1.18 2001/07/13 14:01:14 oes - * - Removed all #ifdef PCRS - * - Removed vim-settings - * - * 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 * @@ -285,11 +182,16 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" #include #include #include -#include #ifdef _WIN32 +# include # include +# include +# include +# ifdef TOGGLE +# include +# endif /* def TOGGLE */ # include "win32.h" # ifndef _WIN_CONSOLE @@ -301,11 +203,9 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" #else /* ifndef _WIN32 */ -#ifndef __OS2__ # include -# include -#endif # include +# include # include # include @@ -316,11 +216,14 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $" #include "jcc.h" #include "filters.h" #include "loaders.h" +#include "showargs.h" +#include "parsers.h" +#include "killpopup.h" #include "miscutil.h" #include "errlog.h" +#include "jbsockets.h" +#include "gateway.h" #include "ssplit.h" -#include "encode.h" -#include "urlmatch.h" const char loadcfg_h_rcs[] = LOADCFG_H_VERSION; @@ -335,10 +238,10 @@ const char loadcfg_h_rcs[] = LOADCFG_H_VERSION; #define ijb_isupper(__X) isupper((int)(unsigned char)(__X)) #define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE /* by haroon - indicates if ijb is enabled */ int g_bToggleIJB = 1; /* JunkBusters is enabled by default. */ -#endif /* def FEATURE_TOGGLE */ +#endif /* The filename of the configfile */ const char *configfile = NULL; @@ -367,13 +270,9 @@ static struct file_list *current_configfile = NULL; #define hash_actions_file 1196306641ul /* "actionsfile" */ #define hash_admin_address 4112573064ul /* "admin-address" */ -#define hash_buffer_limit 1881726070ul /* "buffer-limit */ #define hash_confdir 1978389ul /* "confdir" */ #define hash_debug 78263ul /* "debug" */ #define hash_deny_access 1227333715ul /* "deny-access" */ -#define hash_enable_edit_actions 2517097536ul /* "enable-edit-actions" */ -#define hash_enable_remote_toggle 2979744683ul /* "enable-remote-toggle" */ -#define hash_filterfile 250887266ul /* "filterfile" */ #define hash_forward 2029845ul /* "forward" */ #define hash_forward_socks4 3963965521ul /* "forward-socks4" */ #define hash_forward_socks4a 2639958518ul /* "forward-socks4a" */ @@ -383,6 +282,7 @@ static struct file_list *current_configfile = NULL; #define hash_logfile 2114766ul /* "logfile" */ #define hash_permit_access 3587953268ul /* "permit-access" */ #define hash_proxy_info_url 3903079059ul /* "proxy-info-url" */ +#define hash_re_filterfile 3877522444ul /* "re_filterfile" */ #define hash_single_threaded 4250084780ul /* "single-threaded" */ #define hash_suppress_blocklists 1948693308ul /* "suppress-blocklists" */ #define hash_toggle 447966ul /* "toggle" */ @@ -401,7 +301,6 @@ static struct file_list *current_configfile = NULL; #define hash_show_on_task_bar 215410365ul /* "show-on-task-bar" */ -static void savearg(char *command, char *argument, struct configuration_spec * config); /********************************************************************* * @@ -419,7 +318,7 @@ void unload_configfile (void * data) { struct configuration_spec * config = (struct configuration_spec *)data; struct forward_spec *cur_fwd = config->forward; -#ifdef FEATURE_ACL +#ifdef ACL_FILES struct access_control_list *cur_acl = config->acl; while (cur_acl != NULL) @@ -429,12 +328,12 @@ void unload_configfile (void * data) cur_acl = next_acl; } config->acl = NULL; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ while (cur_fwd != NULL) { struct forward_spec * next_fwd = cur_fwd->next; - free_url_spec(cur_fwd->url); + free_url(cur_fwd->url); freez(cur_fwd->gateway_host); freez(cur_fwd->forward_host); @@ -442,57 +341,39 @@ void unload_configfile (void * data) cur_fwd = next_fwd; } config->forward = NULL; - -#ifdef FEATURE_COOKIE_JAR + +#ifdef JAR_FILES if ( NULL != config->jar ) { fclose( config->jar ); config->jar = NULL; } -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ - freez(config->confdir); - freez(config->logdir); + freez((char *)config->confdir); + freez((char *)config->logdir); - freez(config->haddr); - freez(config->logfile); + freez((char *)config->haddr); + freez((char *)config->logfile); - freez(config->actions_file); - freez(config->admin_address); - freez(config->proxy_info_url); - freez(config->proxy_args); + freez((char *)config->actions_file); + freez((char *)config->admin_address); + freez((char *)config->proxy_info_url); + freez((char *)config->proxy_args); -#ifdef FEATURE_COOKIE_JAR - freez(config->jarfile); -#endif /* def FEATURE_COOKIE_JAR */ +#ifdef JAR_FILES + freez((char *)config->jarfile); +#endif /* def JAR_FILES */ - freez(config->re_filterfile); - -} +#ifndef SPLIT_PROXY_ARGS + freez((char *)config->suppress_message); +#endif /* ndef SPLIT_PROXY_ARGS */ +#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 /********************************************************************* @@ -502,7 +383,7 @@ void unload_current_config_file(void) * Description : Load the config file and all parameters. * * Parameters : - * 1 : csp = Client state (the config member will be + * 1 : csp = Client state (the config member will be * filled in by this function). * * Returns : 0 => Ok, everything else is an error. @@ -516,9 +397,8 @@ struct configuration_spec * load_config(void) struct configuration_spec * config = NULL; struct client_state * fake_csp; struct file_list *fs; - unsigned long linenum = 0; - if ( !check_file_changed(current_configfile, configfile, &fs)) + if (!check_file_changed(current_configfile, configfile, &fs)) { /* No need to load */ return ((struct configuration_spec *)current_configfile->f); @@ -531,9 +411,9 @@ struct configuration_spec * load_config(void) log_error(LOG_LEVEL_INFO, "loading configuration file '%s':", configfile); -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE g_bToggleIJB = 1; -#endif /* def FEATURE_TOGGLE */ +#endif fs->f = config = (struct configuration_spec *)zalloc(sizeof(*config)); @@ -547,9 +427,9 @@ struct configuration_spec * load_config(void) /* * This is backwards from how it's usually done. - * Following the usual pattern, "fs" would be stored in a member + * Following the usual pattern, "fs" would be stored in a member * variable in "csp", and then we'd access "config" from "fs->f", - * using a cast. However, "config" is used so often that a + * using a cast. However, "config" is used so often that a * cast each time would be very ugly, and the extra indirection * would waste CPU cycles. Therefore we store "config" in * "csp->config", and "fs" in "csp->config->config_file_list". @@ -562,8 +442,6 @@ struct configuration_spec * load_config(void) config->multi_threaded = 1; config->hport = HADDR_PORT; - config->buffer_limit = 4096 * 1024; - config->proxy_args = strdup(""); if ((configfp = fopen(configfile, "r")) == NULL) { @@ -572,14 +450,14 @@ struct configuration_spec * load_config(void) /* Never get here - LOG_LEVEL_FATAL causes program exit */ } - while (read_config_line(buf, sizeof(buf), configfp, &linenum) != NULL) + while (read_config_line(buf, sizeof(buf), configfp, fs) != NULL) { char cmd[BUFFER_SIZE]; char arg[BUFFER_SIZE]; char tmp[BUFFER_SIZE]; -#ifdef FEATURE_ACL +#ifdef ACL_FILES struct access_control_list *cur_acl; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ struct forward_spec *cur_fwd; int vec_count; char *vec[3]; @@ -625,50 +503,43 @@ struct configuration_spec * load_config(void) switch( hash_string( cmd ) ) { -/* ************************************************************************* +/**************************************************************************** * actionsfile actions-file-name * In confdir by default - * *************************************************************************/ + ****************************************************************************/ case hash_actions_file : - freez(config->actions_file); + freez((char *)config->actions_file); config->actions_file = make_path(config->confdir, arg); continue; -/* ************************************************************************* +/**************************************************************************** * admin-address email-address - * *************************************************************************/ + ****************************************************************************/ case hash_admin_address : - freez(config->admin_address); + freez((char *)config->admin_address); config->admin_address = strdup(arg); - continue; + continue; -/* ************************************************************************* - * buffer-limit n - * *************************************************************************/ - case hash_buffer_limit : - config->buffer_limit = (size_t) 1024 * atoi(arg); - continue; - -/* ************************************************************************* +/**************************************************************************** * confdir directory-name - * *************************************************************************/ + ****************************************************************************/ case hash_confdir : - freez(config->confdir); - config->confdir = make_path( NULL, arg); - continue; + freez((char *)config->confdir); + config->confdir = strdup(arg); + continue; -/* ************************************************************************* +/**************************************************************************** * debug n * Specifies debug level, multiple values are ORed together. - * *************************************************************************/ + ****************************************************************************/ case hash_debug : config->debug |= atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * deny-access source-ip[/significant-bits] [dest-ip[/significant-bits]] - * *************************************************************************/ -#ifdef FEATURE_ACL + ****************************************************************************/ +#ifdef ACL_FILES case hash_deny_access: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -676,7 +547,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "deny-access directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "deny-access directive in configuration file.

    \n"); continue; @@ -697,12 +568,12 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Invalid source IP for deny-access " "directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \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, "\"

    \n"); freez(cur_acl); continue; @@ -713,12 +584,12 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Invalid destination IP for deny-access " "directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \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, "\"

    \n"); freez(cur_acl); continue; @@ -731,50 +602,18 @@ struct configuration_spec * load_config(void) * actions file, the last match wins. However, the internal * implementations are different: The actions file is stored * in the same order as the file, and scanned completely. - * With the ACL, we reverse the order as we load it, then + * With the ACL, we reverse the order as we load it, then * when we scan it we stop as soon as we get a match. */ cur_acl->next = config->acl; config->acl = cur_acl; continue; -#endif /* def FEATURE_ACL */ - -/* ************************************************************************* - * enable-edit-actions 0|1 - * *************************************************************************/ -#ifdef FEATURE_CGI_EDIT_ACTIONS - case hash_enable_edit_actions: - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_CGI_EDIT_ACTIONS; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_CGI_EDIT_ACTIONS; - } - continue; -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ - -/* ************************************************************************* - * enable-remote-toggle 0|1 - * *************************************************************************/ -#ifdef FEATURE_CGI_EDIT_ACTIONS - case hash_enable_remote_toggle: - if ((*arg != '\0') && (0 != atoi(arg))) - { - config->feature_flags |= RUNTIME_FEATURE_CGI_TOGGLE; - } - else - { - config->feature_flags &= ~RUNTIME_FEATURE_CGI_TOGGLE; - } - continue; -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ +#endif /* def ACL_FILES */ -/* ************************************************************************* +/**************************************************************************** * forward url-pattern (.|http-proxy-host[:port]) - * *************************************************************************/ + ****************************************************************************/ case hash_forward: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -782,7 +621,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for forward " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "forward directive in configuration file."); continue; @@ -804,7 +643,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Bad URL specifier for " "forward directive in configuration file."); continue; @@ -817,7 +656,7 @@ struct configuration_spec * load_config(void) { cur_fwd->forward_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) + if ((p = strchr(cur_fwd->forward_host, ':'))) { *p++ = '\0'; cur_fwd->forward_port = atoi(p); @@ -835,9 +674,9 @@ struct configuration_spec * load_config(void) continue; -/* ************************************************************************* +/**************************************************************************** * forward-socks4 url-pattern socks-proxy[:port] (.|http-proxy[:port]) - * *************************************************************************/ + ****************************************************************************/ case hash_forward_socks4: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -845,7 +684,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "forward-socks4 directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "forward-socks4 directive in configuration file."); continue; @@ -867,7 +706,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4 " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Bad URL specifier for " "forward-socks4 directive in configuration file."); continue; @@ -880,7 +719,7 @@ struct configuration_spec * load_config(void) { cur_fwd->gateway_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->gateway_host, ':'))) + if ((p = strchr(cur_fwd->gateway_host, ':'))) { *p++ = '\0'; cur_fwd->gateway_port = atoi(p); @@ -898,7 +737,7 @@ struct configuration_spec * load_config(void) { cur_fwd->forward_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) + if ((p = strchr(cur_fwd->forward_host, ':'))) { *p++ = '\0'; cur_fwd->forward_port = atoi(p); @@ -913,12 +752,12 @@ struct configuration_spec * load_config(void) /* Add to list. */ cur_fwd->next = config->forward; config->forward = cur_fwd; - + continue; -/* ************************************************************************* +/**************************************************************************** * forward-socks4a url-pattern socks-proxy[:port] (.|http-proxy[:port]) - * *************************************************************************/ + ****************************************************************************/ case hash_forward_socks4a: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -926,7 +765,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "forward-socks4a directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "forward-socks4a directive in configuration file."); continue; @@ -948,7 +787,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4a " "directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Bad URL specifier for " "forward-socks4a directive in configuration file."); continue; @@ -959,7 +798,7 @@ struct configuration_spec * load_config(void) cur_fwd->gateway_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->gateway_host, ':'))) + if ((p = strchr(cur_fwd->gateway_host, ':'))) { *p++ = '\0'; cur_fwd->gateway_port = atoi(p); @@ -976,7 +815,7 @@ struct configuration_spec * load_config(void) { cur_fwd->forward_host = strdup(p); - if (NULL != (p = strchr(cur_fwd->forward_host, ':'))) + if ((p = strchr(cur_fwd->forward_host, ':'))) { *p++ = '\0'; cur_fwd->forward_port = atoi(p); @@ -991,49 +830,49 @@ struct configuration_spec * load_config(void) /* Add to list. */ cur_fwd->next = config->forward; config->forward = cur_fwd; - + continue; -/* ************************************************************************* +/**************************************************************************** * jarfile jar-file-name * In logdir by default - * *************************************************************************/ -#ifdef FEATURE_COOKIE_JAR + ****************************************************************************/ +#ifdef JAR_FILES case hash_jarfile : - freez(config->jarfile); + freez((char *)config->jarfile); config->jarfile = make_path(config->logdir, arg); continue; -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ -/* ************************************************************************* +/**************************************************************************** * listen-address [ip][:port] - * *************************************************************************/ + ****************************************************************************/ case hash_listen_address : - freez(config->haddr); + freez((char *)config->haddr); config->haddr = strdup(arg); continue; -/* ************************************************************************* +/**************************************************************************** * logdir directory-name - * *************************************************************************/ + ****************************************************************************/ case hash_logdir : - freez(config->logdir); - config->logdir = make_path(NULL, arg); - continue; + freez((char *)config->logdir); + config->logdir = strdup(arg); + continue; -/* ************************************************************************* +/**************************************************************************** * logfile log-file-name * In logdir by default - * *************************************************************************/ + ****************************************************************************/ case hash_logfile : - freez(config->logfile); - config->logfile = no_daemon ? NULL : make_path(config->logdir, arg); + freez((char *)config->logfile); + config->logfile = make_path(config->logdir, arg); continue; -/* ************************************************************************* +/**************************************************************************** * permit-access source-ip[/significant-bits] [dest-ip[/significant-bits]] - * *************************************************************************/ -#ifdef FEATURE_ACL + ****************************************************************************/ +#ifdef ACL_FILES case hash_permit_access: vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1); @@ -1041,7 +880,7 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for " "permit-access directive in configuration file."); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: Wrong number of parameters for " "permit-access directive in configuration file.

    \n"); @@ -1063,12 +902,12 @@ struct configuration_spec * load_config(void) { log_error(LOG_LEVEL_ERROR, "Invalid source IP for permit-access " "directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \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, "\"

    \n"); freez(cur_acl); continue; @@ -1080,12 +919,12 @@ struct configuration_spec * load_config(void) log_error(LOG_LEVEL_ERROR, "Invalid destination IP for " "permit-access directive in configuration file: \"%s\"", vec[0]); - string_append(&config->proxy_args, + config->proxy_args = strsav( config->proxy_args, "
    \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, "\"

    \n"); freez(cur_acl); continue; @@ -1098,76 +937,97 @@ struct configuration_spec * load_config(void) * actions file, the last match wins. However, the internal * implementations are different: The actions file is stored * in the same order as the file, and scanned completely. - * With the ACL, we reverse the order as we load it, then + * With the ACL, we reverse the order as we load it, then * when we scan it we stop as soon as we get a match. */ cur_acl->next = config->acl; config->acl = cur_acl; continue; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ -/* ************************************************************************* +/**************************************************************************** * proxy-info-url url - * *************************************************************************/ + ****************************************************************************/ case hash_proxy_info_url : - freez(config->proxy_info_url); + freez((char *)config->proxy_info_url); config->proxy_info_url = strdup(arg); continue; -/* ************************************************************************* +/**************************************************************************** * re_filterfile file-name * In confdir by default. - * *************************************************************************/ - case hash_filterfile : - freez(config->re_filterfile); + ****************************************************************************/ +#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; @@ -1175,70 +1035,70 @@ struct configuration_spec * load_config(void) #endif /*def _WIN_CONSOLE*/ -/* ************************************************************************* +/**************************************************************************** * Win32 GUI options: - * *************************************************************************/ + ****************************************************************************/ #if defined(_WIN32) && ! defined(_WIN_CONSOLE) -/* ************************************************************************* +/**************************************************************************** * activity-animation (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_activity_animation : g_bShowActivityAnimation = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * close-button-minimizes (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_close_button_minimizes : g_bCloseHidesWindow = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-buffer-size (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_log_buffer_size : g_bLimitBufferSize = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-font-name fontnane - * *************************************************************************/ + ****************************************************************************/ case hash_log_font_name : strcpy( g_szFontFaceName, arg ); continue; -/* ************************************************************************* +/**************************************************************************** * log-font-size n - * *************************************************************************/ + ****************************************************************************/ case hash_log_font_size : g_nFontSize = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-highlight-messages (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_log_highlight_messages : g_bHighlightMessages = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-max-lines n - * *************************************************************************/ + ****************************************************************************/ case hash_log_max_lines : g_nMaxBufferLines = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * log-messages (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_log_messages : g_bLogMessages = atoi(arg); continue; -/* ************************************************************************* +/**************************************************************************** * show-on-task-bar (0|1) - * *************************************************************************/ + ****************************************************************************/ case hash_show_on_task_bar : g_bShowOnTaskBar = atoi(arg); continue; @@ -1246,29 +1106,31 @@ struct configuration_spec * load_config(void) #endif /* defined(_WIN32) && ! defined(_WIN_CONSOLE) */ -/* ************************************************************************* - * Warnings about unsupported features - * *************************************************************************/ -#ifndef FEATURE_ACL +/****************************************************************************/ +/* Warnings about unsupported features */ +/****************************************************************************/ +#ifndef ACL_FILES case hash_deny_access: -#endif /* ndef FEATURE_ACL */ -#ifndef FEATURE_CGI_EDIT_ACTIONS - case hash_enable_edit_actions: - case hash_enable_remote_toggle: -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ -#ifndef FEATURE_COOKIE_JAR +#endif /* ndef ACL_FILES */ +#ifndef JAR_FILES case hash_jarfile : -#endif /* ndef FEATURE_COOKIE_JAR */ -#ifndef FEATURE_ACL +#endif /* ndef JAR_FILES */ +#ifndef ACL_FILES case hash_permit_access: -#endif /* ndef FEATURE_ACL */ -#ifndef FEATURE_TOGGLE +#endif /* ndef ACL_FILES */ +#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 : @@ -1289,32 +1151,27 @@ struct configuration_spec * load_config(void) /* log_error(LOG_LEVEL_INFO, "Unsupported directive \"%s\" ignored.", cmd); */ continue; -/* *************************************************************************/ +/****************************************************************************/ default : -/* *************************************************************************/ +/****************************************************************************/ /* * I decided that I liked this better as a warning than an * error. To change back to an error, just change log level * to LOG_LEVEL_FATAL. */ - log_error(LOG_LEVEL_ERROR, "Unrecognized directive '%s' (%luul) in line %lu in " - "configuration file (%s).", buf, hash_string(cmd), linenum, configfile); - string_append(&config->proxy_args, "
    \nWARNING: unrecognized directive : "); - string_append(&config->proxy_args, buf); - string_append(&config->proxy_args, "

    \n"); + log_error(LOG_LEVEL_ERROR, "Unrecognized directive (%luul) in " + "configuration file: \"%s\"", hash_string( cmd ), buf); + config->proxy_args = strsav( config->proxy_args, "
    \nWARNING: unrecognized directive : "); + config->proxy_args = strsav( config->proxy_args, buf); + config->proxy_args = strsav( config->proxy_args, "

    \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) @@ -1322,19 +1179,21 @@ struct configuration_spec * load_config(void) 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")) ) @@ -1344,7 +1203,7 @@ struct configuration_spec * load_config(void) } setbuf(config->jar, NULL); } -#endif /* def FEATURE_COOKIE_JAR */ +#endif /* def JAR_FILES */ if ( NULL == config->haddr ) { @@ -1353,7 +1212,7 @@ struct configuration_spec * load_config(void) if ( NULL != config->haddr ) { - if (NULL != (p = strchr(config->haddr, ':'))) + if ((p = strchr(config->haddr, ':'))) { *p++ = '\0'; if (*p) @@ -1390,16 +1249,24 @@ struct configuration_spec * load_config(void) } freez(fake_csp); +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) + { + fs->proxy_args = strsav(fs->proxy_args, ""); + } +#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 */ @@ -1450,77 +1317,6 @@ struct configuration_spec * load_config(void) } -/********************************************************************* - * - * Function : savearg - * - * Description : Called from `load_config'. It saves each non-empty - * and non-comment line from config into - * config->proxy_args. This is used to create the - * show-proxy-args page. On error, frees - * config->proxy_args and sets it to NULL - * - * Parameters : - * 1 : command = config setting that was found - * 2 : argument = the setting's argument (if any) - * - * Returns : N/A - * - *********************************************************************/ -static void savearg(char *command, char *argument, struct configuration_spec * config) -{ - char * buf; - char * s; - - assert(command); - assert(*command); - assert(argument); - - buf = strdup(""); - - s = html_encode(command); - if (NULL == s) - { - freez(buf); - freez(config->proxy_args); - return; - } - string_append(&buf, ""); - string_join (&buf, s); - string_append(&buf, " "); - - 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, ""); - string_join (&buf, s); - string_append(&buf, ""); - } - else - { - string_join (&buf, s); - } - } - - string_append(&buf, "
    \n"); - - string_join(&config->proxy_args, buf); -} - - /* Local Variables: tab-width: 3 diff --git a/loadcfg.h b/loadcfg.h index 3e71b752..ea13f483 100644 --- a/loadcfg.h +++ b/loadcfg.h @@ -1,6 +1,6 @@ -#ifndef LOADCFG_H_INCLUDED -#define LOADCFG_H_INCLUDED -#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.10 2002/03/24 13:25:43 swa Exp $" +#ifndef _LOADCFG_H +#define _LOADCFG_H +#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.4 2001/05/22 18:46:04 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loadcfg.h,v $ @@ -11,7 +11,7 @@ * variables it writes to. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,41 +37,6 @@ * * 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 @@ -139,19 +104,22 @@ *********************************************************************/ +/* Declare struct FILE for vars and funcs. */ +#include + +/* All of our project's data types. */ +#include "project.h" + #ifdef __cplusplus extern "C" { #endif -/* Don't need project.h, only this: */ -struct configuration_spec; - /* Global variables */ -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE /* indicates if ijb is enabled */ extern int g_bToggleIJB; -#endif /* def FEATURE_TOGGLE */ +#endif extern const char *configfile; @@ -163,14 +131,10 @@ extern const char *configfile; */ extern int Argc; extern const char **Argv; -extern short int MustReload; extern struct configuration_spec * load_config(void); -#ifdef FEATURE_GRACEFUL_TERMINATION -void unload_current_config_file(void); -#endif /* Revision control strings from this header and associated .c file */ extern const char loadcfg_rcs[]; @@ -180,7 +144,7 @@ extern const char loadcfg_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef LOADCFG_H_INCLUDED */ +#endif /* ndef _JCC_H */ /* Local Variables: diff --git a/loaders.c b/loaders.c index f63b9168..7752a97f 100644 --- a/loaders.c +++ b/loaders.c @@ -1,21 +1,21 @@ -const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $"; +const char loaders_rcs[] = "$Id: loaders.c,v 1.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 @@ -35,126 +35,6 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: loaders.c,v $ - * Revision 1.46 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.45 2002/03/16 23:54:06 jongfoster - * Adding graceful termination feature, to help look for memory leaks. - * If you enable this (which, by design, has to be done by hand - * editing config.h) and then go to http://i.j.b/die, then the program - * will exit cleanly after the *next* request. It should free all the - * memory that was used. - * - * Revision 1.44 2002/03/16 21:51:00 jongfoster - * Fixing free(NULL). - * - * Revision 1.43 2002/03/16 20:28:34 oes - * Added descriptions to the filters so users will know what they select in the cgi editor - * - * Revision 1.42 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.41 2002/03/12 01:42:50 oes - * Introduced modular filters - * - * Revision 1.40 2002/03/08 17:46:04 jongfoster - * Fixing int/size_t warnings - * - * Revision 1.39 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.38 2002/03/06 22:54:35 jongfoster - * Automated function-comment nitpicking. - * - * Revision 1.37 2002/03/03 15:07:49 oes - * Re-enabled automatic config reloading - * - * Revision 1.36 2002/01/22 23:46:18 jongfoster - * Moving edit_read_line() and simple_read_line() to loaders.c, and - * extending them to support reading MS-DOS, Mac and UNIX style files - * on all platforms. - * - * Modifying read_config_line() (without changing it's prototype) to - * be a trivial wrapper for edit_read_line(). This means that we have - * one function to read a line and handle comments, which is common - * between the initialization code and the edit interface. - * - * Revision 1.35 2002/01/17 21:03:08 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Revision 1.34 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.33 2001/11/13 00:16:38 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.32 2001/11/07 00:02:13 steudten - * Add line number in error output for lineparsing for - * actionsfile and configfile. - * Special handling for CLF added. - * - * Revision 1.31 2001/10/26 17:39:01 oes - * Removed csp->referrer - * Moved ijb_isspace and ijb_tolower to project.h - * - * Revision 1.30 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.29 2001/10/23 21:38:53 jongfoster - * Adding error-checking to create_url_spec() - * - * Revision 1.28 2001/10/07 15:40:39 oes - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Revision 1.27 2001/09/22 16:36:59 jongfoster - * Removing unused parameter fs from read_config_line() - * - * Revision 1.26 2001/09/22 14:05:22 jongfoster - * Bugfix: Multiple escaped "#" characters in a configuration - * file are now permitted. - * Also removing 3 unused headers. - * - * Revision 1.25 2001/09/13 22:44:03 jongfoster - * Adding {} to an if statement - * - * Revision 1.24 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.23 2001/07/20 15:51:54 oes - * Fixed indentation of prepocessor commands - * - * Revision 1.22 2001/07/20 15:16:17 haroon - * - per Guy's suggestion, added a while loop in sweep() to catch not just - * the last inactive CSP but all other consecutive inactive CSPs after that - * 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 * @@ -262,39 +142,52 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $" #include #include #include +#include #include #include #include -#include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #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 */ /********************************************************************* @@ -332,9 +225,9 @@ void sweep(void) fl->active = 0; } - for (csp = clients; csp && (NULL != (ncsp = csp->next)) ; csp = csp->next) + for (csp = clients; csp && (ncsp = csp->next) ; csp = csp->next) { - if (ncsp->flags & CSP_FLAG_ACTIVE) + if (ncsp->active) { /* mark this client's files as active */ @@ -350,61 +243,56 @@ void sweep(void) 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 ) ) { @@ -412,6 +300,10 @@ void sweep(void) (nfl->unloader)(nfl->f); +#ifndef SPLIT_PROXY_ARGS + freez(nfl->proxy_args); +#endif /* ndef SPLIT_PROXY_ARGS */ + freez(nfl->filename); freez(nfl); @@ -421,18 +313,171 @@ void sweep(void) } +/********************************************************************* + * + * Function : create_url_spec + * + * Description : Creates a "url_spec" structure from a string. + * When finished, free with unload_url(). + * + * Parameters : + * 1 : url = Target url_spec to be filled in. Must be + * zeroed out before the call (e.g. using zalloc). + * 2 : buf = Source pattern, null terminated. NOTE: The + * contents of this buffer are destroyed by this + * function. If this function succeeds, the + * buffer is copied to url->spec. If this + * function fails, the contents of the buffer + * are lost forever. + * + * Returns : 0 => Ok, everything else is an error. + * + *********************************************************************/ +int create_url_spec(struct url_spec * url, char * buf) +{ + char *p; + struct url_spec tmp_url[1]; + + /* paranoia - should never happen. */ + if ((url == NULL) || (buf == NULL)) + { + return 1; + } + + /* save a copy of the orignal specification */ + if ((url->spec = strdup(buf)) == NULL) + { + return 1; + } + + if ((p = strchr(buf, '/'))) + { + if (NULL == (url->path = strdup(p))) + { + freez(url->spec); + return 1; + } + url->pathlen = strlen(url->path); + *p = '\0'; + } + else + { + url->path = NULL; + url->pathlen = 0; + } +#ifdef REGEX + if (url->path) + { + int errcode; + char rebuf[BUFFER_SIZE]; + + if (NULL == (url->preg = zalloc(sizeof(*url->preg)))) + { + freez(url->spec); + freez(url->path); + return 1; + } + + sprintf(rebuf, "^(%s)", url->path); + + errcode = regcomp(url->preg, rebuf, + (REG_EXTENDED|REG_NOSUB|REG_ICASE)); + if (errcode) + { + size_t errlen = regerror(errcode, + url->preg, buf, sizeof(buf)); + + buf[errlen] = '\0'; + + log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", + url->spec, buf); + + freez(url->spec); + freez(url->path); + freez(url->preg); + + return 1; + } + } +#endif + if ((p = strchr(buf, ':')) == NULL) + { + url->port = 0; + } + else + { + *p++ = '\0'; + url->port = atoi(p); + } + + if ((url->domain = strdup(buf)) == NULL) + { + freez(url->spec); + freez(url->path); +#ifdef REGEX + freez(url->preg); +#endif /* def REGEX */ + return 1; + } + + /* split domain into components */ + + *tmp_url = dsplit(url->domain); + url->dbuf = tmp_url->dbuf; + url->dcnt = tmp_url->dcnt; + url->dvec = tmp_url->dvec; + url->unanchored = tmp_url->unanchored; + + return 0; /* OK */ + +} + + +/********************************************************************* + * + * Function : free_url + * + * Description : Called from the "unloaders". Freez the url + * structure elements. + * + * Parameters : + * 1 : url = pointer to a url_spec structure. + * + * Returns : N/A + * + *********************************************************************/ +void free_url(struct url_spec *url) +{ + if (url == NULL) return; + + freez(url->spec); + freez(url->domain); + freez(url->dbuf); + freez(url->dvec); + freez(url->path); +#ifdef REGEX + if (url->preg) + { + regfree(url->preg); + freez(url->preg); + } +#endif + +} + + /********************************************************************* * * Function : check_file_changed * * Description : Helper function to check if a file needs reloading. * If "current" is still current, return it. Otherwise - * allocates a new (zeroed) "struct file_list", fills + * allocates a new (zeroed) "struct file_list", fills * in the disk file name and timestamp, and returns it. * * Parameters : * 1 : current = The file_list currently being used - will - * be checked to see if it is out of date. + * be checked to see if it is out of date. * May be NULL (which is treated as out of * date). * 2 : filename = Name of file to check. @@ -440,7 +485,10 @@ void sweep(void) * This will be set to NULL, OR a struct * file_list newly allocated on the * heap, with the filename and lastmodified - * fields filled, and all others zeroed. + * fields filled, standard header giving file + * name in proxy_args, and all others zeroed. + * (proxy_args is only filled in if !defined + * SPLIT_PROXY_ARGS and !suppress_blocklists). * * Returns : If file unchanged: 0 (and sets newfl == NULL) * If file changed: 1 and sets newfl != NULL @@ -470,6 +518,7 @@ int check_file_changed(const struct file_list * current, } fs = (struct file_list *)zalloc(sizeof(struct file_list)); + if (fs == NULL) { /* Out of memory error */ @@ -485,468 +534,130 @@ int check_file_changed(const struct file_list * current, freez (fs); return 1; } - *newfl = fs; - return 1; -} - -/********************************************************************* - * - * Function : simple_read_line - * - * Description : Read a single line from a file and return it. - * This is basically a version of fgets() that malloc()s - * it's own line buffer. Note that the buffer will - * always be a multiple of BUFFER_SIZE bytes long. - * Therefore if you are going to keep the string for - * an extended period of time, you should probably - * strdup() it and free() the original, to save memory. - * - * - * Parameters : - * 1 : dest = destination for newly malloc'd pointer to - * line data. Will be set to NULL on error. - * 2 : fp = File to read from - * 3 : newline = Standard for newlines in the file. - * Will be unchanged if it's value on input is not - * NEWLINE_UNKNOWN. - * On output, may be changed from NEWLINE_UNKNOWN to - * actual convention in file. - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out-of-memory - * JB_ERR_FILE on EOF. - * - *********************************************************************/ -jb_err simple_read_line(FILE *fp, char **dest, int *newline) -{ - size_t len = 0; - size_t buflen = BUFFER_SIZE; - char * buf; - char * p; - int ch; - int realnewline = NEWLINE_UNKNOWN; - - if (NULL == (buf = malloc(buflen))) +#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, "

    The file `"); + fs->proxy_args = strsav(fs->proxy_args, p); + fs->proxy_args = strsav(fs->proxy_args, + "' contains the following patterns

    \n"); + freez(p); } + fs->proxy_args = strsav(fs->proxy_args, "
    ");
    +   }
    +#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, "
    "); } +#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 @@ -961,44 +672,16 @@ char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenu *********************************************************************/ static void unload_trustfile(void *f) { - struct block_spec *cur = (struct block_spec *)f; - struct block_spec *next; - - while (cur != NULL) - { - next = cur->next; + struct block_spec *b = (struct block_spec *)f; + if (b == NULL) return; - free_url_spec(cur->url); - free(cur); + unload_trustfile(b->next); /* Stack is cheap, isn't it? */ - cur = next; - } - -} + free_url(b->url); + freez(b); -#ifdef FEATURE_GRACEFUL_TERMINATION -/********************************************************************* - * - * Function : unload_current_trust_file - * - * Description : Unloads current trust file - reset to state at - * beginning of program. - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void unload_current_trust_file(void) -{ - if (current_trustfile) - { - current_trustfile->unloader = unload_trustfile; - current_trustfile = NULL; - } } -#endif /* FEATURE_GRACEFUL_TERMINATION */ /********************************************************************* @@ -1023,7 +706,6 @@ int load_trustfile(struct client_state *csp) char buf[BUFFER_SIZE], *p, *q; int reject, trusted; struct file_list *fs; - unsigned long linenum = 0; if (!check_file_changed(current_trustfile, csp->config->trustfile, &fs)) { @@ -1052,7 +734,7 @@ int load_trustfile(struct client_state *csp) tl = csp->config->trust_list; - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) + while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) { trusted = 0; reject = 1; @@ -1068,7 +750,7 @@ int load_trustfile(struct client_state *csp) reject = 0; p = buf; q = p+1; - while ((*p++ = *q++) != '\0') + while ((*p++ = *q++)) { /* nop */ } @@ -1106,7 +788,6 @@ int load_trustfile(struct client_state *csp) if (trusted) { *tl++ = b->url; - /* FIXME BUFFER OVERFLOW if >=64 entries */ } } @@ -1114,6 +795,13 @@ int load_trustfile(struct client_state *csp) fclose(fp); +#ifndef SPLIT_PROXY_ARGS + if (!suppress_blocklists) + { + fs->proxy_args = strsav(fs->proxy_args, "
    "); + } +#endif /* ndef SPLIT_PROXY_ARGS */ + /* the old one is now obsolete */ if (current_trustfile) { @@ -1137,15 +825,15 @@ load_trustfile_error: 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. @@ -1155,57 +843,24 @@ load_trustfile_error: *********************************************************************/ 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...) @@ -1217,19 +872,16 @@ int load_re_filterfile(struct client_state *csp) { FILE *fp; - struct re_filterfile_spec *new_bl, *bl = NULL; + struct re_filterfile_spec *bl; struct file_list *fs; char buf[BUFFER_SIZE]; int error; - unsigned long linenum = 0; pcrs_job *dummy; - /* - * No need to reload if unchanged - */ if (!check_file_changed(current_re_filterfile, csp->config->re_filterfile, &fs)) { + /* No need to load */ if (csp) { csp->rlist = current_re_filterfile; @@ -1241,105 +893,53 @@ int load_re_filterfile(struct client_state *csp) goto load_re_filterfile_error; } - /* - * Open the file or fail - */ - if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL) + fs->f = bl = (struct re_filterfile_spec *)zalloc(sizeof(*bl)); + if (bl == NULL) { goto load_re_filterfile_error; } - /* - * Read line by line - */ - while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL) + /* Open the file or fail */ + if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL) { - /* - * If this is the head of a new filter block, make it a - * re_filterfile spec of its own and chain it to the list: - */ - if (strncmp(buf, "FILTER:", 7) == 0) - { - new_bl = (struct re_filterfile_spec *)zalloc(sizeof(*bl)); - if (new_bl == NULL) - { - goto load_re_filterfile_error; - } - - new_bl->name = chomp(buf + 7); - - if (NULL != (new_bl->description = strchr(new_bl->name, ' '))) - { - *new_bl->description++ = '\0'; - new_bl->description = strdup(chomp(new_bl->description)); - } - else - { - new_bl->description = strdup("No description available for this filter"); - } - - new_bl->name = strdup(chomp(new_bl->name)); - - /* - * If this is the first filter block, chain it - * to the file_list rather than its (nonexistant) - * predecessor - */ - if (fs->f == NULL) - { - fs->f = new_bl; - } - else - { - bl->next = new_bl; - } - bl = new_bl; - - log_error(LOG_LEVEL_RE_FILTER, "Reading in filter \"%s\" (\"%s\")", bl->name, bl->description); + goto load_re_filterfile_error; + } - continue; - } + /* Read line by line */ + while (read_config_line(buf, sizeof(buf), fp, fs) != NULL) + { + enlist( bl->patterns, buf ); - /* - * Else, save the expression, make it a pcrs_job - * and chain it into the current filter's joblist - */ - if (bl != NULL) + /* We have a meaningful line -> make it a job */ + if ((dummy = pcrs_compile(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, ""); + } +#endif /* ndef SPLIT_PROXY_ARGS */ + + /* the old one is now obsolete */ if ( NULL != current_re_filterfile ) { current_re_filterfile->unloader = unload_re_filterfile; } - /* - * Chain this file into the global list of loaded files - */ fs->next = files->next; files->next = fs; current_re_filterfile = fs; @@ -1352,11 +952,12 @@ int load_re_filterfile(struct client_state *csp) return( 0 ); load_re_filterfile_error: - log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", + log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", csp->config->re_filterfile); return(-1); } +#endif /* def PCRS */ /********************************************************************* @@ -1374,7 +975,7 @@ load_re_filterfile_error: * Returns : N/A * *********************************************************************/ -void add_loader(int (*loader)(struct client_state *), +void add_loader(int (*loader)(struct client_state *), struct configuration_spec * config) { int i; diff --git a/loaders.h b/loaders.h index 216c352d..7aa80e65 100644 --- a/loaders.h +++ b/loaders.h @@ -1,6 +1,6 @@ -#ifndef LOADERS_H_INCLUDED -#define LOADERS_H_INCLUDED -#define LOADERS_H_VERSION "$Id: loaders.h,v 1.18 2002/03/24 13:25:43 swa Exp $" +#ifndef _LOADERS_H +#define _LOADERS_H +#define LOADERS_H_VERSION "$Id: loaders.h,v 1.5 2001/05/31 21:28:49 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/loaders.h,v $ @@ -11,7 +11,7 @@ * unload files that are no longer in use. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,70 +37,6 @@ * * 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 @@ -155,64 +91,30 @@ *********************************************************************/ +#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); @@ -226,7 +128,7 @@ extern const char loaders_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef LOADERS_H_INCLUDED */ +#endif /* ndef _LOADERS_H */ /* Local Variables: diff --git a/miscutil.c b/miscutil.c index ec4de4fd..ac363f4f 100644 --- a/miscutil.c +++ b/miscutil.c @@ -1,16 +1,17 @@ -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 @@ -36,95 +37,6 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp * * Revisions : * $Log: miscutil.c,v $ - * Revision 1.34 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.33 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.32 2002/03/06 23:02:57 jongfoster - * Removing tabs - * - * Revision 1.31 2002/03/05 04:52:42 oes - * Deleted non-errlog debugging code - * - * Revision 1.30 2002/03/04 18:27:42 oes - * - Deleted deletePidFile - * - Made write_pid_file use the --pidfile option value - * (or no PID file, if the option was absent) - * - Played styleguide police - * - * Revision 1.29 2002/03/04 02:08:02 david__schmidt - * Enable web editing of actions file on OS/2 (it had been broken all this time!) - * - * Revision 1.28 2002/03/03 09:18:03 joergs - * Made jumbjuster work on AmigaOS again. - * - * Revision 1.27 2002/01/21 00:52:32 jongfoster - * Adding string_join() - * - * Revision 1.26 2001/12/30 14:07:32 steudten - * - Add signal handling (unix) - * - Add SIGHUP handler (unix) - * - Add creation of pidfile (unix) - * - Add action 'top' in rc file (RH) - * - Add entry 'SIGNALS' to manpage - * - Add exit message to logfile (unix) - * - * Revision 1.25 2001/11/13 00:16:38 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.24 2001/11/05 21:41:43 steudten - * Add changes to be a real daemon just for unix os. - * (change cwd to /, detach from controlling tty, set - * process group and session leader to the own process. - * Add DBG() Macro. - * Add some fatal-error log message for failed malloc(). - * Add '-d' if compiled with 'configure --with-debug' to - * enable debug output. - * - * Revision 1.23 2001/10/29 03:48:10 david__schmidt - * OS/2 native needed a snprintf() routine. Added one to miscutil, brackedted - * by and __OS2__ ifdef. - * - * Revision 1.22 2001/10/26 17:39:38 oes - * Moved ijb_isspace and ijb_tolower to project.h - * - * Revision 1.21 2001/10/23 21:27:50 jongfoster - * Standardising error codes in string_append - * make_path() no longer adds '\\' if the dir already ends in '\\' (this - * is just copying a UNIX-specific fix to the Windows-specific part) - * - * Revision 1.20 2001/10/22 15:33:56 david__schmidt - * Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in - * filters.c. Added a FIXME in front of the offending code. I'll gladly - * put in a better/more robust fix for all parties if one is presented... - * It seems that just returning 200 instead of 404 would pretty much fix - * it for everyone, but I don't know all the history of the problem. - * - * Revision 1.19 2001/10/14 22:02:57 jongfoster - * New function string_append() which is like strsav(), but running - * out of memory isn't automatically FATAL. - * - * Revision 1.18 2001/09/20 13:33:43 steudten - * - * change long to int as return value in hash_string(). Remember the wraparound - * for int = long = sizeof(4) - thats maybe not what we want. - * - * Revision 1.17 2001/09/13 20:51:29 jongfoster - * Fixing potential problems with characters >=128 in simplematch() - * This was also a compiler warning. - * - * Revision 1.16 2001/09/10 10:56:59 oes - * Silenced compiler warnings - * - * Revision 1.15 2001/07/13 14:02:24 oes - * Removed vim-settings - * - * Revision 1.14 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * * Revision 1.13 2001/06/29 13:32:14 oes * Removed logentry from cancelled commit * @@ -197,22 +109,31 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp #include "config.h" #include -#include #include -#if !defined(_WIN32) && !defined(__OS2__) -#include -#endif /* #if !defined(_WIN32) && !defined(__OS2__) */ #include +#include #include -#include +/* + * FIXME: Only need project.h for BUFFER_SIZE. It would be nice + * to remove this dependency. + */ #include "project.h" #include "miscutil.h" #include "errlog.h" -#include "jcc.h" const char miscutil_h_rcs[] = MISCUTIL_H_VERSION; +/* Fix a problem with Solaris. There should be no effect on other + * platforms. + * Solaris's isspace() is a macro which uses it's argument directly + * as an array index. Therefore we need to make sure that high-bit + * characters generate +ve values, and ideally we also want to make + * the argument match the declared parameter type of "int". + */ +#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) +#define ijb_isspace(__X) isspace((int)(unsigned char)(__X)) + /********************************************************************* * * Function : zalloc @@ -226,7 +147,7 @@ const char miscutil_h_rcs[] = MISCUTIL_H_VERSION; * Returns : Pointer to newly malloc'd memory chunk. * *********************************************************************/ -void *zalloc(size_t size) +void *zalloc(int size) { void * ret; @@ -236,45 +157,7 @@ void *zalloc(size_t size) } return(ret); - -} - - -#if defined(unix) -/********************************************************************* - * - * Function : write_pid_file - * - * Description : Writes a pid file with the pid of the main process - * - * Parameters : None - * - * Returns : N/A - * - *********************************************************************/ -void write_pid_file(void) -{ - FILE *fp; - - /* - * If no --pidfile option was given, - * we can live without one. - */ - if (pidfile == NULL) return; - - if ((fp = fopen(pidfile, "w")) == NULL) - { - log_error(LOG_LEVEL_INFO, "can't open pidfile '%s': %E", pidfile); - } - else - { - fprintf(fp, "%u\n", (unsigned int) getpid()); - fclose (fp); - } - return; - } -#endif /* def unix */ /********************************************************************* @@ -291,9 +174,9 @@ void write_pid_file(void) * Returns : an unsigned long variable with the hashed value. * *********************************************************************/ -unsigned int hash_string( const char* s ) +unsigned long hash_string( const char* s ) { - unsigned int h = 0; + unsigned long h = 0ul; for ( ; *s; ++s ) { @@ -487,20 +370,17 @@ char *chomp(char *string) } - /********************************************************************* * * Function : strsav * * Description : Reallocate "old" and append text to it. This makes * it easier to append to malloc'd strings. - * Running out of memory is a FATAL error. * * Parameters : * 1 : old = Old text that is to be extended. Will be - * free()d by this routine. May be NULL. + * free()d by this routine. * 2 : text_to_append = Text to be appended to old. - * May be NULL. * * Returns : Pointer to newly malloc'ed appended string. * If there is no text to append, return old. Caller @@ -509,172 +389,45 @@ char *chomp(char *string) *********************************************************************/ char *strsav(char *old, const char *text_to_append) { - size_t old_len, new_len = 0; + int old_len, new_len; char *p; - if ((text_to_append == NULL) || (*text_to_append == '\0')) + if (( text_to_append == NULL) || (*text_to_append == '\0')) { return(old); } - if (NULL == old) - { - if ((p = strdup(text_to_append)) == NULL) - { - log_error(LOG_LEVEL_FATAL, "strdup() failed!"); - /* Never get here - LOG_LEVEL_FATAL causes program exit */ - } - return p; - } - - old_len = strlen(old); - new_len = old_len + strlen(text_to_append) + 1; - - if ((p = realloc(old, new_len)) == NULL) + 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; } @@ -696,12 +449,12 @@ jb_err string_join(char **target_string, char *text_to_append) *********************************************************************/ int simplematch(char *pattern, char *text) { - unsigned char *pat = (unsigned char *) pattern; - unsigned char *txt = (unsigned char *) text; - unsigned char *fallback = pat; + char *fallback; + char *pat = pattern; + char *txt = text; int wildcard = 0; - unsigned char lastchar = 'a'; + char lastchar = 'a'; unsigned i; unsigned char charmap[32]; @@ -803,25 +556,25 @@ int simplematch(char *pattern, char *text) * * Parameters : * 1 : string = string to be duplicated - * 2 : len = number of bytes to duplicate + * 2 : n = number of bytes to duplicate * * Returns : pointer to copy, or NULL if failiure * *********************************************************************/ -char *bindup(const char *string, size_t len) +char *bindup(const char *string, int n) { - char *duplicate; + char *dup; - if (NULL == (duplicate = (char *)malloc(len))) + if (NULL == (dup = (char *)malloc(n))) { return NULL; } else { - memcpy(duplicate, string, len); + memcpy(dup, string, n); } - return duplicate; + return dup; } @@ -853,21 +606,7 @@ char * make_path(const char * dir, const char * file) if(dir) { - if(dir[0] == '.') - { - if(dir[1] == '/') - { - strncpy(path,dir+2,512); - } - else - { - strncpy(path,dir+1,512); - } - } - else - { - strncpy(path,dir,512); - } + strncpy(path,dir,512); path[511]=0; } else { path[0]=0; @@ -886,53 +625,24 @@ char * make_path(const char * dir, const char * file) } if ((dir == NULL) || (*dir == '\0') /* No directory specified */ -#if defined(_WIN32) || defined(__OS2__) +#ifdef _WIN32 || (*file == '\\') || (file[1] == ':') /* Absolute path (DOS) */ -#else /* ifndef _WIN32 || __OS2__ */ +#else /* ifndef _WIN32 */ || (*file == '/') /* Absolute path (U*ix) */ -#endif /* ifndef _WIN32 || __OS2__ */ +#endif /* ifndef _WIN32 */ ) { return strdup(file); } else { - char * path; - -#if defined(unix) - if ( *dir != '/' && basedir && *basedir ) - { - path = malloc( strlen( basedir ) + strlen(dir) + strlen(file) + 3); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); - strcpy(path, basedir); - strcat(path, "/"); - strcat(path, dir); - } - else - { - path = malloc(strlen(dir) + strlen(file) + 2); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); - strcpy(path, dir); - } -#else - - path = malloc(strlen(dir) + strlen(file) + 2); - if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!"); + char * path = malloc(strlen(dir) + strlen(file) + 2); strcpy(path, dir); - -#endif /* defined unix */ - -#if defined(_WIN32) || defined(__OS2__) - if(path[strlen(path)-1] != '\\') - { - strcat(path, "\\"); - } -#else /* ifndef _WIN32 || __OS2__ */ - if(path[strlen(path)-1] != '/') - { - strcat(path, "/"); - } -#endif /* ifndef _WIN32 || __OS2__ */ +#ifdef _WIN32 + strcat(path, "\\"); +#else /* ifndef _WIN32 */ + if(path[strlen(path)-1] != '/') strcat(path, "/"); +#endif /* ifndef _WIN32 */ strcat(path, file); return path; @@ -941,774 +651,6 @@ char * make_path(const char * dir, const char * file) } -/* - * What follows is a portable snprintf routine, written by Mark Martinec. - * See: http://www.ijs.si/software/snprintf/ - * Anyone who needs it can add a define for themselves... so far, only - * OS/2 (native) lacks snprintf. - - snprintf.c - - a portable implementation of snprintf, - including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf - - snprintf is a routine to convert numeric and string arguments to - formatted strings. It is similar to sprintf(3) provided in a system's - C library, yet it requires an additional argument - the buffer size - - and it guarantees never to store anything beyond the given buffer, - regardless of the format or arguments to be formatted. Some newer - operating systems do provide snprintf in their C library, but many do - not or do provide an inadequate (slow or idiosyncratic) version, which - calls for a portable implementation of this routine. - -Author - - Mark Martinec , 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 -#include -#include -#include -#include -#include -#include - -#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, \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 diff --git a/miscutil.h b/miscutil.h index 4e0b2646..2638be93 100644 --- a/miscutil.h +++ b/miscutil.h @@ -1,6 +1,6 @@ -#ifndef MISCUTIL_H_INCLUDED -#define MISCUTIL_H_INCLUDED -#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.19 2002/03/24 13:25:43 swa Exp $" +#ifndef _MISCUTIL_H +#define _MISCUTIL_H +#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.7 2001/06/05 22:32:01 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/miscutil.h,v $ @@ -11,7 +11,7 @@ * really fit in any other file. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -37,53 +37,6 @@ * * 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. * @@ -134,20 +87,13 @@ *********************************************************************/ -#include "project.h" - #if defined(__cplusplus) extern "C" { #endif -extern const char *basedir; -extern void *zalloc(size_t size); +extern void *zalloc(int size); -#if defined(unix) -extern void write_pid_file(void); -#endif /* unix */ - -extern unsigned int hash_string(const char* s); +extern unsigned long hash_string(const char* s); extern char *safe_strerror(int err); @@ -155,13 +101,11 @@ extern int strcmpic(const char *s1, const char *s2); extern int strncmpic(const char *s1, const char *s2, size_t n); extern char *strsav(char *old, const char *text_to_append); -extern jb_err string_append(char **target_string, const char *text_to_append); -extern jb_err string_join (char **target_string, char *text_to_append); extern char *chomp(char *string); extern int simplematch(char *pattern, char *text); -extern char *bindup(const char *string, size_t len); +extern char *bindup(const char *string, int n); extern char *make_path(const char * dir, const char * file); @@ -169,10 +113,6 @@ extern char *make_path(const char * dir, const char * file); extern char *strdup(const char *s); #endif /* def __MINGW32__ */ -#ifdef __OS2__ -extern int snprintf(char *, size_t, const char *, /*args*/ ...); -#endif /* def __OS2__ */ - /* Revision control strings from this header and associated .c file */ extern const char miscutil_rcs[]; extern const char miscutil_h_rcs[]; @@ -181,7 +121,7 @@ extern const char miscutil_h_rcs[]; } #endif -#endif /* ndef MISCUTIL_H_INCLUDED */ +#endif /* ndef _MISCUTIL_H */ /* Local Variables: diff --git a/parsers.c b/parsers.c index 6129e0e4..2b2043c3 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.16 2001/06/29 13:32:42 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -10,17 +10,18 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" * `client_uagent', `client_x_forwarded', * `client_x_forwarded_adder', `client_xtra_adder', * `content_type', `crumble', `destroy_list', `enlist', - * `flush_socket', ``get_header', `sed', + * `flush_socket', `free_http_request', `get_header', + * `list_to_text', `parse_http_request', `sed', * and `server_set_cookie'. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and + * by and Copyright (C) 1997 Anonymous Coders and * Junkbusters Corporation. http://www.junkbusters.com * - * This program is free software; you can redistribute it + * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software * Foundation; either version 2 of the License, or (at @@ -40,189 +41,6 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" * * Revisions : * $Log: parsers.c,v $ - * Revision 1.52 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.51 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.50 2002/03/12 01:45:35 oes - * More verbose logging - * - * Revision 1.49 2002/03/09 20:03:52 jongfoster - * - Making various functions return int rather than size_t. - * (Undoing a recent change). Since size_t is unsigned on - * Windows, functions like read_socket that return -1 on - * error cannot return a size_t. - * - * THIS WAS A MAJOR BUG - it caused frequent, unpredictable - * crashes, and also frequently caused JB to jump to 100% - * CPU and stay there. (Because it thought it had just - * read ((unsigned)-1) == 4Gb of data...) - * - * - The signature of write_socket has changed, it now simply - * returns success=0/failure=nonzero. - * - * - Trying to get rid of a few warnings --with-debug on - * Windows, I've introduced a new type "jb_socket". This is - * used for the socket file descriptors. On Windows, this - * is SOCKET (a typedef for unsigned). Everywhere else, it's - * an int. The error value can't be -1 any more, so it's - * now JB_INVALID_SOCKET (which is -1 on UNIX, and in - * Windows it maps to the #define INVALID_SOCKET.) - * - * - The signature of bind_port has changed. - * - * Revision 1.48 2002/03/07 03:46:53 oes - * Fixed compiler warnings etc - * - * Revision 1.47 2002/02/20 23:15:13 jongfoster - * Parsing functions now handle out-of-memory gracefully by returning - * an error code. - * - * Revision 1.46 2002/01/17 21:03:47 jongfoster - * Moving all our URL and URL pattern parsing code to urlmatch.c. - * - * Revision 1.45 2002/01/09 14:33:03 oes - * Added support for localtime_r. - * - * Revision 1.44 2001/12/14 01:22:54 steudten - * Remove 'user:pass@' from 'proto://user:pass@host' for the - * new added header 'Host: ..'. (See Req ID 491818) - * - * Revision 1.43 2001/11/23 00:26:38 jongfoster - * Fixing two really stupid errors in my previous commit - * - * Revision 1.42 2001/11/22 21:59:30 jongfoster - * Adding code to handle +no-cookies-keep - * - * Revision 1.41 2001/11/05 23:43:05 steudten - * Add time+date to log files. - * - * Revision 1.40 2001/10/26 20:13:09 jongfoster - * ctype.h is needed in Windows, too. - * - * Revision 1.39 2001/10/26 17:40:04 oes - * Introduced get_header_value() - * Removed http->user_agent, csp->referrer and csp->accept_types - * Removed client_accept() - * - * Revision 1.38 2001/10/25 03:40:48 david__schmidt - * Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple - * threads to call select() simultaneously. So, it's time to do a real, live, - * native OS/2 port. See defines for __EMX__ (the porting layer) vs. __OS2__ - * (native). Both versions will work, but using __OS2__ offers multi-threading. - * - * Revision 1.37 2001/10/23 21:36:02 jongfoster - * Documenting sed()'s error behaviou (doc change only) - * - * Revision 1.36 2001/10/13 12:51:51 joergs - * Removed client_host, (was only required for the old 2.0.2-11 http://noijb. - * force-load), instead crumble Host: and add it (again) in client_host_adder - * (in case we get a HTTP/1.0 request without Host: header and forward it to - * a HTTP/1.1 server/proxy). - * - * Revision 1.35 2001/10/09 22:39:21 jongfoster - * assert.h is also required under Win32, so moving out of #ifndef _WIN32 - * block. - * - * Revision 1.34 2001/10/07 18:50:55 oes - * Added server_content_encoding, renamed server_transfer_encoding - * - * Revision 1.33 2001/10/07 18:04:49 oes - * Changed server_http11 to server_http and its pattern to "HTTP". - * Additional functionality: it now saves the HTTP status into - * csp->http->status and sets CT_TABOO for Status 206 (partial range) - * - * Revision 1.32 2001/10/07 15:43:28 oes - * Removed FEATURE_DENY_GZIP and replaced it with client_accept_encoding, - * client_te and client_accept_encoding_adder, triggered by the new - * +no-compression action. For HTTP/1.1 the Accept-Encoding header is - * changed to allow only identity and chunked, and the TE header is - * crunched. For HTTP/1.0, Accept-Encoding is crunched. - * - * parse_http_request no longer does anything than parsing. The rewriting - * of http->cmd and version mangling are gone. It now also recognizes - * the put and delete methods and saves the url in http->url. Removed - * unused variable. - * - * renamed content_type and content_length to have the server_ prefix - * - * server_content_type now only works if csp->content_type != CT_TABOO - * - * added server_transfer_encoding, which - * - Sets CT_TABOO to prohibit filtering if encoding compresses - * - Raises the CSP_FLAG_CHUNKED flag if Encoding is "chunked" - * - Change from "chunked" to "identity" if body was chunked - * but has been de-chunked for filtering. - * - * added server_content_md5 which crunches any Content-MD5 headers - * if the body was modified. - * - * made server_http11 conditional on +downgrade action - * - * Replaced 6 boolean members of csp with one bitmap (csp->flags) - * - * Revision 1.31 2001/10/05 14:25:02 oes - * Crumble Keep-Alive from Server - * - * Revision 1.30 2001/09/29 12:56:03 joergs - * IJB now changes HTTP/1.1 to HTTP/1.0 in requests and answers. - * - * Revision 1.29 2001/09/24 21:09:24 jongfoster - * Fixing 2 memory leaks that Guy spotted, where the paramater to - * enlist() was not being free()d. - * - * Revision 1.28 2001/09/22 16:32:28 jongfoster - * Removing unused #includes. - * - * Revision 1.27 2001/09/20 15:45:25 steudten - * - * add casting from size_t to int for printf() - * remove local variable shadow s2 - * - * Revision 1.26 2001/09/16 17:05:14 jongfoster - * Removing unused #include showarg.h - * - * Revision 1.25 2001/09/16 13:21:27 jongfoster - * Changes to use new list functions. - * - * Revision 1.24 2001/09/13 23:05:50 jongfoster - * Changing the string paramater to the header parsers a "const". - * - * Revision 1.23 2001/09/12 18:08:19 steudten - * - * In parse_http_request() header rewriting miss the host value, so - * from http://www.mydomain.com the result was just " / " not - * http://www.mydomain.com/ in case we forward. - * - * Revision 1.22 2001/09/10 10:58:53 oes - * Silenced compiler warnings - * - * Revision 1.21 2001/07/31 14:46:00 oes - * - Persistant connections now suppressed - * - sed() no longer appends empty header to csp->headers - * - * Revision 1.20 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.19 2001/07/25 17:21:54 oes - * client_uagent now saves copy of User-Agent: header value - * - * Revision 1.18 2001/07/13 14:02:46 oes - * - Included fix to repair broken HTTP requests that - * don't contain a path, not even '/'. - * - Removed all #ifdef PCRS - * - content_type now always inspected and classified as - * text, gif or other. - * - formatting / comments - * - * Revision 1.17 2001/06/29 21:45:41 oes - * Indentation, CRLF->LF, Tab-> Space - * * Revision 1.16 2001/06/29 13:32:42 oes * - Fixed a comment * - Adapted free_http_request @@ -245,7 +63,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" * CRLF -> LF * * Revision 1.11 2001/05/29 20:11:19 joergs - * '/ * inside comment' warning removed. + * '/* inside comment' warning removed. * * Revision 1.10 2001/05/29 09:50:24 jongfoster * Unified blocklist/imagelist/permissionslist. @@ -371,17 +189,13 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" #include "config.h" -#ifndef _WIN32 #include #include -#endif - #include #include -#include #include -#if !defined(_WIN32) && !defined(__OS2__) +#ifndef _WIN32 #include #endif @@ -389,11 +203,15 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $" #include "list.h" #include "parsers.h" #include "encode.h" +#include "filters.h" +#include "loaders.h" +#include "showargs.h" +#include "jcc.h" #include "ssplit.h" #include "errlog.h" #include "jbsockets.h" #include "miscutil.h" -#include "list.h" +#include "cgi.h" const char parsers_h_rcs[] = PARSERS_H_VERSION; @@ -403,8 +221,8 @@ const char parsers_h_rcs[] = PARSERS_H_VERSION; * as an array index. Therefore we need to make sure that high-bit * characters generate +ve values, and ideally we also want to make * the argument match the declared parameter type of "int". - * - * Why did they write a character function that can't take a simple + * + * Why did they write a character function that can't take a simple * "char" argument? Doh! */ #define ijb_isupper(__X) isupper((int)(unsigned char)(__X)) @@ -418,44 +236,43 @@ const struct parsers client_patterns[] = { { "from:", 5, client_from }, { "cookie:", 7, client_send_cookie }, { "x-forwarded-for:", 16, client_x_forwarded }, - { "Accept-Encoding:", 16, client_accept_encoding }, - { "TE:", 3, client_te }, - { "Host:", 5, crumble }, -/* { "if-modified-since:", 18, crumble }, */ - { "Keep-Alive:", 11, crumble }, - { "connection:", 11, crumble }, { "proxy-connection:", 17, crumble }, +#ifdef DENY_GZIP + { "Accept-Encoding: gzip", 21, crumble }, +#endif /* def DENY_GZIP */ +#if defined(DETECT_MSIE_IMAGES) + { "Accept:", 7, client_accept }, +#endif /* defined(DETECT_MSIE_IMAGES) */ +#ifdef FORCE_LOAD + { "Host:", 5, client_host }, +#endif /* def FORCE_LOAD */ +/* { "if-modified-since:", 18, crumble }, */ { NULL, 0, NULL } }; const struct parsers server_patterns[] = { - { "HTTP", 4, server_http }, { "set-cookie:", 11, server_set_cookie }, { "connection:", 11, crumble }, - { "Content-Type:", 13, server_content_type }, - { "Content-Length:", 15, server_content_length }, - { "Content-MD5:", 12, server_content_md5 }, - { "Content-Encoding:", 17, server_content_encoding }, - { "Transfer-Encoding:", 18, server_transfer_coding }, - { "Keep-Alive:", 11, crumble }, +#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 }; @@ -478,22 +295,19 @@ const add_header_func_ptr add_server_headers[] = { * file, the results are not portable. * *********************************************************************/ -int flush_socket(jb_socket fd, struct client_state *csp) +int flush_socket(int fd, struct client_state *csp) { struct iob *iob = csp->iob; - int len = iob->eod - iob->cur; + int n = iob->eod - iob->cur; - if (len <= 0) + if (n <= 0) { return(0); } - if (write_socket(fd, iob->cur, (size_t)len)) - { - return(-1); - } + n = write_socket(fd, iob->cur, n); iob->eod = iob->cur = iob->buf; - return(len); + return(n); } @@ -509,27 +323,28 @@ int flush_socket(jb_socket fd, struct client_state *csp) * 2 : buf = holds the content to be added to the page * 3 : n = number of bytes to be added * - * Returns : None + * Returns : Number of bytes in the content buffer. * *********************************************************************/ -void add_to_iob(struct client_state *csp, char *buf, int n) +int add_to_iob(struct client_state *csp, char *buf, int n) { struct iob *iob = csp->iob; - size_t have, need; + int have, need; char *p; have = iob->eod - iob->cur; if (n <= 0) { - return; + return(have); } need = have + n; if ((p = (char *)malloc(need + 1)) == NULL) { - log_error(LOG_LEVEL_FATAL, "malloc() iob failed: %E"); + log_error(LOG_LEVEL_ERROR, "malloc() iob failed: %E"); + return(-1); } if (have) @@ -552,7 +367,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n) } /* copy the new data into the iob buffer */ - memcpy(p, buf, (size_t)n); + memcpy(p, buf, n); /* point to the end of the data */ p += n; @@ -564,7 +379,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n) iob->cur = iob->buf; iob->eod = p; - return; + return(need); } @@ -601,15 +416,10 @@ char *get_header(struct client_state *csp) *p = '\0'; ret = strdup(iob->cur); - if (ret == NULL) - { - /* FIXME No way to handle error properly */ - log_error(LOG_LEVEL_FATAL, "Out of memory in get_header()"); - } iob->cur = p+1; - if ((q = strchr(ret, '\r')) != NULL) *q = '\0'; + if ((q = strchr(ret, '\r'))) *q = '\0'; /* is this a blank linke (i.e. the end of the header) ? */ if (*ret == '\0') @@ -623,56 +433,6 @@ char *get_header(struct client_state *csp) } -/********************************************************************* - * - * Function : get_header_value - * - * Description : Get the value of a given header from a chained list - * of header lines or return NULL if no such header is - * present in the list. - * - * Parameters : - * 1 : header_list = pointer to list - * 2 : header_name = string with name of header to look for. - * Trailing colon required, capitalization - * doesn't matter. - * - * Returns : NULL if not found, else value of header - * - *********************************************************************/ -char *get_header_value(const struct list *header_list, const char *header_name) -{ - struct list_entry *cur_entry; - char *ret = NULL; - size_t length = 0; - - assert(header_list); - assert(header_name); - length = strlen(header_name); - - for (cur_entry = header_list->first; cur_entry ; cur_entry = cur_entry->next) - { - if (cur_entry->str) - { - if (!strncmpic(cur_entry->str, header_name, length)) - { - /* - * Found: return pointer to start of value - */ - ret = (char *) (cur_entry->str + length); - while (*ret && ijb_isspace(*ret)) ret++; - return(ret); - } - } - } - - /* - * Not found - */ - return NULL; - -} - /********************************************************************* * * Function : sed @@ -691,22 +451,19 @@ char *get_header_value(const struct list *header_list, const char *header_name) * headers (client or server) * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : Single pointer to a fully formed header, or NULL - * on out-of-memory error. + * Returns : Single pointer to a fully formed header. * *********************************************************************/ -char *sed(const struct parsers pats[], - const add_header_func_ptr more_headers[], - struct client_state *csp) +char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp) { - struct list_entry *p; + struct list *p; const struct parsers *v; - const add_header_func_ptr *f; - jb_err err = JB_ERR_OK; + char *hdr; + void (* const *f)(); - for (v = pats; (err == JB_ERR_OK) && (v->str != NULL) ; v++) + for (v = pats; v->str ; v++) { - for (p = csp->headers->first; (err == JB_ERR_OK) && (p != NULL) ; p = p->next) + for (p = csp->headers->next; p ; p = p->next) { /* Header crunch()ed in previous run? -> ignore */ if (p->str == NULL) continue; @@ -715,312 +472,295 @@ char *sed(const struct parsers pats[], if (strncmpic(p->str, v->str, v->len) == 0) { - err = v->parser(csp, (char **)&(p->str)); + hdr = v->parser(v, p->str, csp); + freez(p->str); + p->str = hdr; } } } /* place any additional headers on the csp->headers list */ - for (f = more_headers; (err == JB_ERR_OK) && (*f) ; f++) + for (f = more_headers; *f ; f++) { - err = (*f)(csp); + (*f)(csp); } - if (err != JB_ERR_OK) + /* add the blank line at the end of the header, if necessary */ + if ( (csp->headers->last == NULL) + || (csp->headers->last->str == NULL) + || (*csp->headers->last->str != '\0') ) { - return NULL; + enlist(csp->headers, ""); } - return list_to_text(csp->headers); -} + hdr = list_to_text(csp->headers); + return(hdr); -/* here begins the family of parser functions that reformat header lines */ +} /********************************************************************* * - * Function : crumble + * Function : free_http_request * - * Description : This is called if a header matches a pattern to "crunch" + * Description : Freez a http_request structure * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : http = points to a http_request structure to free * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err crumble(struct client_state *csp, char **header) +void free_http_request(struct http_request *http) { - log_error(LOG_LEVEL_HEADER, "crunch!"); - freez(*header); - return JB_ERR_OK; + freez(http->cmd); + freez(http->gpc); + freez(http->host); + freez(http->hostport); + freez(http->path); + freez(http->ver); + freez(http->host_ip_addr_str); + } /********************************************************************* * - * Function : server_content_type + * Function : parse_http_request * - * Description : Set the content-type for filterable types (text/.*, - * javascript and image/gif) unless filtering has been - * forbidden (CT_TABOO) while parsing earlier headers. + * Description : Parse out the host and port from the URL. Find the + * hostname & path, port (if ':'), and/or password (if '@') * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : req = URL (or is it URI?) to break down + * 2 : http = pointer to the http structure to hold elements + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err server_content_type(struct client_state *csp, char **header) +void parse_http_request(char *req, struct http_request *http, struct client_state *csp) { - if (csp->content_type != CT_TABOO) - { - if (strstr(*header, " text/") - || strstr(*header, "application/x-javascript")) - csp->content_type = CT_TEXT; - else if (strstr(*header, " image/gif")) - csp->content_type = CT_GIF; - else - csp->content_type = 0; - } + char *buf, *v[10], *url, *p; + int n; - return JB_ERR_OK; -} + memset(http, '\0', sizeof(*http)); + http->cmd = strdup(req); -/********************************************************************* - * - * Function : server_transfer_coding - * - * Description : - Prohibit filtering (CT_TABOO) if transfer coding compresses - * - Raise the CSP_FLAG_CHUNKED flag if coding is "chunked" - * - Change from "chunked" to "identity" if body was chunked - * but has been de-chunked for filtering. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err server_transfer_coding(struct client_state *csp, char **header) -{ - /* - * Turn off pcrs and gif filtering if body compressed - */ - if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate")) - { - csp->content_type = CT_TABOO; - } + buf = strdup(req); - /* - * 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 @@ -1029,81 +769,96 @@ jb_err client_te(struct client_state *csp, char **header) * Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : NULL if crunched, or a malloc'ed string with the original + * or modified header * *********************************************************************/ -jb_err client_referrer(struct client_state *csp, char **header) +char *client_referrer(const struct parsers *v, char *s, struct client_state *csp) { const char * newval; - -#ifdef FEATURE_FORCE_LOAD +#ifdef FORCE_LOAD /* Since the referrer can include the prefix even * even if the request itself is non-forced, we must - * clean it unconditionally + * clean it unconditionally */ - strclean(*header, FORCE_PREFIX); -#endif /* def FEATURE_FORCE_LOAD */ + strclean(s, FORCE_PREFIX); +#endif /* def FORCE_LOAD */ + +#ifdef TRUST_FILES + csp->referrer = strdup(s); +#endif /* def TRUST_FILES */ /* * Are we sending referer? */ if ((csp->action->flags & ACTION_HIDE_REFERER) == 0) { - return JB_ERR_OK; + return(strdup(s)); } - freez(*header); - newval = csp->action->string[ACTION_STRING_REFERER]; + /* + * Are we blocking referer? + */ if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { - /* - * Blocking referer - */ log_error(LOG_LEVEL_HEADER, "crunch!"); - return JB_ERR_OK; + return(NULL); } - else if (0 == strncmpic(newval, "http://", 7)) + + /* + * Are we forging referer? + */ + if (0 == strcmpic(newval, "forge")) { /* - * We have a specific (fixed) referer we want to send. + * Forge a referer as http://[hostname:port of REQUEST]/ + * to fool stupid checks for in-site links */ - log_error(LOG_LEVEL_HEADER, "modified"); - - *header = strdup("Referer: "); - string_append(header, newval); - - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; + log_error(LOG_LEVEL_HEADER, "crunch+forge!"); + s = strsav(NULL, "Referer: "); + s = strsav(s, "http://"); + s = strsav(s, csp->http->hostport); + s = strsav(s, "/"); + return(s); } - else + + /* + * Have we got a fixed referer? + */ + if (0 == strncmpic(newval, "http://", 7)) { /* - * Forge a referer as http://[hostname:port of REQUEST]/ - * to fool stupid checks for in-site links + * We have a specific (fixed) referer we want to send. */ - if (0 != strcmpic(newval, "forge")) - { - /* - * Invalid choice - but forge is probably the best default. - */ - log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval); - } - *header = strdup("Referer: http://"); - string_append(header, csp->http->hostport); - string_append(header, "/"); - log_error(LOG_LEVEL_HEADER, "crunch+forge to %s", *header); - - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; + log_error(LOG_LEVEL_HEADER, "modified"); + + s = strsav( NULL, "Referer: " ); + s = strsav( s, newval ); + return(s); } + + /* Should never get here! */ + log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval); + + /* + * Forge is probably the best default. + * + * Forge a referer as http://[hostname:port of REQUEST]/ + * to fool stupid checks for in-site links + */ + log_error(LOG_LEVEL_HEADER, "crunch+forge!"); + s = strsav(NULL, "Referer: "); + s = strsav(s, "http://"); + s = strsav(s, csp->http->hostport); + s = strsav(s, "/"); + return(s); } @@ -1111,43 +866,49 @@ jb_err client_referrer(struct client_state *csp, char **header) * * Function : client_uagent * - * Description : Handle the "user-agent" config setting properly - * and remember its original value to enable browser - * bug workarounds. Called from `sed'. + * Description : Handle the "user-agent" config setting properly. + * Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : A malloc'ed pointer to the default agent, or + * a malloc'ed string pointer to this header (ie. pass thru). * *********************************************************************/ -jb_err client_uagent(struct client_state *csp, char **header) +char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) { const char * newval; +#ifdef DETECT_MSIE_IMAGES + if (strstr (s, "MSIE ")) + { + /* This is Microsoft Internet Explorer. + * Enable auto-detect. + */ + csp->accept_types |= ACCEPT_TYPE_IS_MSIE; + } +#endif /* def DETECT_MSIE_IMAGES */ + if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) { - return JB_ERR_OK; + return(strdup(s)); } newval = csp->action->string[ACTION_STRING_USER_AGENT]; if (newval == NULL) { - return JB_ERR_OK; + return(strdup(s)); } log_error(LOG_LEVEL_HEADER, "modified"); - freez(*header); - *header = strdup("User-Agent: "); - string_append(header, newval); + s = strsav( NULL, "User-Agent: " ); + s = strsav( s, newval ); + return(s); - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; } @@ -1158,25 +919,24 @@ jb_err client_uagent(struct client_state *csp, char **header) * Description : Handle "ua-" headers properly. Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : NULL if crunched, or a malloc'ed string to original header * *********************************************************************/ -jb_err client_ua(struct client_state *csp, char **header) +char *client_ua(const struct parsers *v, char *s, struct client_state *csp) { - if ((csp->action->flags & ACTION_HIDE_USER_AGENT) != 0) + if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) + { + return(strdup(s)); + } + else { log_error(LOG_LEVEL_HEADER, "crunch!"); - freez(*header); + return(NULL); } - - return JB_ERR_OK; } @@ -1188,44 +948,40 @@ jb_err client_ua(struct client_state *csp, char **header) * Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : NULL if crunched, or a malloc'ed string to + * modified/original header. * *********************************************************************/ -jb_err client_from(struct client_state *csp, char **header) +char *client_from(const struct parsers *v, char *s, struct client_state *csp) { const char * newval; if ((csp->action->flags & ACTION_HIDE_FROM) == 0) { - return JB_ERR_OK; + return(strdup(s)); } - freez(*header); - newval = csp->action->string[ACTION_STRING_FROM]; /* - * Are we blocking the e-mail address? + * Are we blocking referer? */ if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { log_error(LOG_LEVEL_HEADER, "crunch!"); - return JB_ERR_OK; + return(NULL); } log_error(LOG_LEVEL_HEADER, " modified"); - *header = strdup("From: "); - string_append(header, newval); + s = strsav( NULL, "From: " ); + s = strsav( s, newval ); + return(s); - return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; } @@ -1238,24 +994,18 @@ jb_err client_from(struct client_state *csp, char **header) * else we crunch it. Mmmmmmmmmmm ... cookie ...... * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = pattern of cookie `sed' found matching + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : Always NULL. * *********************************************************************/ -jb_err client_send_cookie(struct client_state *csp, char **header) +char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp) { - jb_err result = JB_ERR_OK; - if ((csp->action->flags & ACTION_NO_COOKIE_READ) == 0) { - /* strlen("cookie: ") == 8 */ - result = enlist(csp->cookie_list, *header + 8); + enlist(csp->cookie_list, s + v->len + 1); } else { @@ -1263,12 +1013,11 @@ jb_err client_send_cookie(struct client_state *csp, char **header) } /* - * Always remove the cookie here. The cookie header + * Always return NULL here. The cookie header * will be sent at the end of the header. */ - freez(*header); + return(NULL); - return result; } @@ -1280,91 +1029,72 @@ jb_err client_send_cookie(struct client_state *csp, char **header) * also used in the add_client_headers list. Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to "crunch" + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : Always NULL. * *********************************************************************/ -jb_err client_x_forwarded(struct client_state *csp, char **header) +char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp) { if ((csp->action->flags & ACTION_HIDE_FORWARDED) == 0) { /* Save it so we can re-add it later */ - freez(csp->x_forwarded); - csp->x_forwarded = *header; - - /* - * Always set *header = NULL, since this information - * will be sent at the end of the header. - */ - *header = NULL; - } - else - { - freez(*header); - log_error(LOG_LEVEL_HEADER, " crunch!"); + csp->x_forwarded = strdup(s); } - return JB_ERR_OK; -} + /* + * Always return NULL, since this information + * will be sent at the end of the header. + */ -/* the following functions add headers directly to the header list */ + return(NULL); +} + +#if defined(DETECT_MSIE_IMAGES) /********************************************************************* * - * Function : client_host_adder + * Function : client_accept * - * Description : (re)adds the host header. Called from `sed'. + * Description : Detect whether the client wants HTML or an image. + * Clients do not always make this information available + * in a sane way. Always passes the header through + * the proxy unchanged. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) + * 1 : v = Ignored. + * 2 : s = Header string. Null terminated. + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : Duplicate of argument s. * *********************************************************************/ -jb_err client_host_adder(struct client_state *csp) +char *client_accept(const struct parsers *v, char *s, struct client_state *csp) { - char *p; - char *pos; - jb_err err; - - if ( !csp->http->hostport || !*(csp->http->hostport)) - { - 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 */ /********************************************************************* @@ -1376,90 +1106,50 @@ jb_err client_host_adder(struct client_state *csp) * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err client_cookie_adder(struct client_state *csp) +void client_cookie_adder(struct client_state *csp) { - struct list_entry *lst; - char *tmp; - struct list_entry *list1 = csp->cookie_list->first; - struct list_entry *list2 = csp->action->multi[ACTION_MULTI_WAFER]->first; - int first_cookie = 1; - jb_err err; - - if ((list1 == NULL) && (list2 == NULL)) - { - /* Nothing to do */ - return JB_ERR_OK; - } + struct list *lst; + char *tmp = NULL; + char *e; - tmp = strdup("Cookie: "); - - for (lst = list1; lst ; lst = lst->next) + for (lst = csp->cookie_list->next; lst ; lst = lst->next) { - if (first_cookie) - { - first_cookie = 0; - } - else + if (tmp) { - string_append(&tmp, "; "); + tmp = strsav(tmp, "; "); } - string_append(&tmp, lst->str); + tmp = strsav(tmp, lst->str); } - for (lst = list2; lst ; lst = lst->next) + for (lst = csp->action->multi[ACTION_MULTI_WAFER]->next; lst ; lst = lst->next) { - if (first_cookie) + if (tmp) { - first_cookie = 0; + tmp = strsav(tmp, "; "); } - else + + if ((e = cookie_encode(lst->str))) { - string_append(&tmp, "; "); + tmp = strsav(tmp, e); + freez(e); } - string_join(&tmp, cookie_encode(lst->str)); } - if (tmp == NULL) + if (tmp) { - return JB_ERR_MEMORY; - } - - log_error(LOG_LEVEL_HEADER, "addh: %s", tmp); - err = enlist(csp->headers, tmp); - free(tmp); - return err; -} - + char *ret; -/********************************************************************* - * - * Function : client_accept_encoding_adder - * - * Description : Add an Accept-Encoding header to the client's request - * that disables compression if the action applies, and - * the header is not already there. Called from `sed'. - * Note: For HTTP/1.0, the absence of the header is enough. - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err client_accept_encoding_adder(struct client_state *csp) -{ - if ( ((csp->action->flags & ACTION_NO_COMPRESSION) != 0) - && (!strcmpic(csp->http->ver, "HTTP/1.1")) ) - { - return enlist_unique(csp->headers, "Accept-Encoding: identity;q=1.0, *;q=0", 16); + ret = strdup("Cookie: "); + ret = strsav(ret, tmp); + log_error(LOG_LEVEL_HEADER, "addh: %s", ret); + enlist(csp->headers, ret); + freez(tmp); + freez(ret); } - return JB_ERR_OK; } @@ -1472,28 +1162,19 @@ jb_err client_accept_encoding_adder(struct client_state *csp) * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err client_xtra_adder(struct client_state *csp) +void client_xtra_adder(struct client_state *csp) { - struct list_entry *lst; - jb_err err; + struct list *lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]; - for (lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]->first; - lst ; lst = lst->next) + for (lst = lst->next; lst ; lst = lst->next) { log_error(LOG_LEVEL_HEADER, "addh: %s", lst->str); - err = enlist(csp->headers, lst->str); - if (err) - { - return err; - } - + enlist(csp->headers, lst->str); } - return JB_ERR_OK; } @@ -1506,234 +1187,105 @@ jb_err client_xtra_adder(struct client_state *csp) * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : N/A * *********************************************************************/ -jb_err client_x_forwarded_adder(struct client_state *csp) +void client_x_forwarded_adder(struct client_state *csp) { char *p = NULL; - jb_err err; if ((csp->action->flags & ACTION_HIDE_FORWARDED) != 0) { - return JB_ERR_OK; + return; } if (csp->x_forwarded) { - p = strdup(csp->x_forwarded); - string_append(&p, ", "); + p = strsav(p, csp->x_forwarded); + p = strsav(p, ", "); + p = strsav(p, csp->ip_addr_str); } else { - p = strdup("X-Forwarded-For: "); - } - string_append(&p, csp->ip_addr_str); - - if (p == NULL) - { - return JB_ERR_MEMORY; + p = strsav(p, "X-Forwarded-For: "); + p = strsav(p, csp->ip_addr_str); } log_error(LOG_LEVEL_HEADER, "addh: %s", p); - err = enlist(csp->headers, p); - free(p); + enlist(csp->headers, p); - return err; -} - - -/********************************************************************* - * - * Function : connection_close_adder - * - * Description : Adds a "Connection: close" header to csp->headers - * as a temporary fix for the needed but missing HTTP/1.1 - * support. Called from `sed'. - * FIXME: This whole function shouldn't be neccessary! - * - * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. - * - *********************************************************************/ -jb_err connection_close_adder(struct client_state *csp) -{ - return enlist(csp->headers, "Connection: close"); } /********************************************************************* * - * Function : server_http + * Function : server_set_cookie * - * Description : - Save the HTTP Status into csp->http->status - * - Set CT_TABOO to prevent filtering if the answer - * is a partial range (HTTP status 206) - * - Rewrite HTTP/1.1 answers to HTTP/1.0 if +downgrade - * action applies. + * Description : Handle the server "cookie" header properly. + * Log cookie to the jar file. Then "crunch" it, + * or accept it. Called from `sed'. * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = parser pattern that matched this header + * 2 : s = header that matched this pattern + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : `crumble' or a newly malloc'ed string. * *********************************************************************/ -jb_err server_http(struct client_state *csp, char **header) +char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp) { - sscanf(*header, "HTTP/%*d.%*d %d", &(csp->http->status)); - if (csp->http->status == 206) +#ifdef JAR_FILES + if (csp->config->jar) { - csp->content_type = CT_TABOO; + fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1)); } +#endif /* def JAR_FILES */ - if ((csp->action->flags & ACTION_DOWNGRADE) != 0) + if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0) { - (*header)[7] = '0'; - log_error(LOG_LEVEL_HEADER, "Downgraded answer to HTTP/1.0"); + return(crumble(v, s, csp)); } - return JB_ERR_OK; + return(strdup(s)); + } +#ifdef FORCE_LOAD /********************************************************************* * - * Function : server_set_cookie + * Function : client_host * - * Description : Handle the server "cookie" header properly. - * Log cookie to the jar file. Then "crunch" it, - * or accept it. Called from `sed'. + * Description : Clean the FORCE_PREFIX out of the 'host' http + * header, if we use force * * Parameters : - * 1 : csp = Current client state (buffers, headers, etc...) - * 2 : header = On input, pointer to header to modify. - * On output, pointer to the modified header, or NULL - * to remove the header. This function frees the - * original string if necessary. + * 1 : v = ignored + * 2 : s = header (from sed) to clean + * 3 : csp = Current client state (buffers, headers, etc...) * - * Returns : JB_ERR_OK on success, or - * JB_ERR_MEMORY on out-of-memory error. + * Returns : A malloc'ed pointer to the cleaned host header * *********************************************************************/ -jb_err server_set_cookie(struct client_state *csp, char **header) +char *client_host(const struct parsers *v, char *s, struct client_state *csp) { -#ifdef FEATURE_COOKIE_JAR - if (csp->config->jar) - { - /* - * Write timestamp into outbuf. - * - * Complex because not all OSs have tm_gmtoff or - * the %z field in strftime() - */ - char tempbuf[ BUFFER_SIZE ]; - time_t now; - struct tm tm_now; - time (&now); -#ifdef HAVE_LOCALTIME_R - tm_now = *localtime_r(&now, &tm_now); -#else - tm_now = *localtime (&now); -#endif - strftime(tempbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); - - /* strlen("set-cookie: ") = 12 */ - fprintf(csp->config->jar, "%s %s\t%s\n", tempbuf, csp->http->host, *header + 12); - } -#endif /* def FEATURE_COOKIE_JAR */ - - if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0) - { - return crumble(csp, header); - } - else if ((csp->action->flags & ACTION_NO_COOKIE_KEEP) != 0) - { - /* Flag whether or not to log a message */ - int changed = 0; - - /* A variable to store the tag we're working on */ - char * cur_tag; - - /* Skip "Set-Cookie:" (11 characters) in header */ - cur_tag = *header + 11; - - /* skip whitespace between "Set-Cookie:" and value */ - while (*cur_tag && ijb_isspace(*cur_tag)) - { - cur_tag++; - } - - /* Loop through each tag in the cookie */ - while (*cur_tag) - { - /* Find next tag */ - char * next_tag = strchr(cur_tag, ';'); - if (next_tag != NULL) - { - /* Skip the ';' character itself */ - next_tag++; - - /* skip whitespace ";" and start of tag */ - while (*next_tag && ijb_isspace(*next_tag)) - { - next_tag++; - } - } - else - { - /* "Next tag" is the end of the string */ - next_tag = cur_tag + strlen(cur_tag); - } - - /* Is this the "Expires" tag? */ - if (strncmpic(cur_tag, "expires=", 8) == 0) - { - /* Delete the tag by copying the rest of the string over it. - * (Note that we cannot just use "strcpy(cur_tag, next_tag)", - * since the behaviour of strcpy is undefined for overlapping - * strings.) - */ - memmove(cur_tag, next_tag, strlen(next_tag) + 1); - - /* That changed the header, need to issue a log message */ - changed = 1; - - /* Note that the next tag has now been moved to *cur_tag, - * so we do not need to update the cur_tag pointer. - */ - } - else - { - /* Move on to next cookie tag */ - cur_tag = next_tag; - } - } - - if (changed) - { - log_error(LOG_LEVEL_HEADER, "Changed cookie to a temporary one."); - } - } - - return JB_ERR_OK; + char *cleanhost = strdup(s); + + if(csp->force) + strclean(cleanhost, FORCE_PREFIX); + + return(cleanhost); } - - -#ifdef FEATURE_FORCE_LOAD +#endif /* def FORCE_LOAD */ + + +#ifdef FORCE_LOAD /********************************************************************* * * Function : strclean * - * Description : In-Situ-Eliminate all occurances of substring in + * Description : In-Situ-Eliminate all occurances of substring in * string * * Parameters : @@ -1748,12 +1300,12 @@ int strclean(const char *string, const char *substring) int hits = 0, len = strlen(substring); char *pos, *p; - while((pos = strstr(string, substring)) != NULL) + while((pos = strstr(string, substring))) { p = pos + len; do { - *(p - len) = *p; + *(p - len) = *p; } while (*p++ != '\0'); @@ -1762,7 +1314,7 @@ int strclean(const char *string, const char *substring) return(hits); } -#endif /* def FEATURE_FORCE_LOAD */ +#endif /* def FORCE_LOAD */ /* diff --git a/parsers.h b/parsers.h index d7e104b9..1ae901b0 100644 --- a/parsers.h +++ b/parsers.h @@ -1,6 +1,6 @@ -#ifndef PARSERS_H_INCLUDED -#define PARSERS_H_INCLUDED -#define PARSERS_H_VERSION "$Id: parsers.h,v 1.24 2002/03/24 13:25:43 swa Exp $" +#ifndef _PARSERS_H +#define _PARSERS_H +#define PARSERS_H_VERSION "$Id: parsers.h,v 1.6 2001/06/03 19:12:38 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.h,v $ @@ -17,7 +17,7 @@ * and `server_set_cookie'. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -43,91 +43,6 @@ * * 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 * @@ -172,44 +87,47 @@ extern "C" { extern const struct parsers client_patterns[]; extern const struct parsers server_patterns[]; -extern const add_header_func_ptr add_client_headers[]; -extern const add_header_func_ptr add_server_headers[]; +extern void (* const add_client_headers[])(struct client_state *); +extern void (* const add_server_headers[])(struct client_state *); -extern int flush_socket(jb_socket fd, struct client_state *csp); -extern void add_to_iob(struct client_state *csp, char *buf, int n); +extern int flush_socket(int fd, struct client_state *csp); +extern int add_to_iob(struct client_state *csp, char *buf, int n); extern char *get_header(struct client_state *csp); -extern char *get_header_value(const struct list *header_list, const char *header_name); -extern char *sed(const struct parsers pats[], const add_header_func_ptr more_headers[], struct client_state *csp); - -extern jb_err crumble (struct client_state *csp, char **header); -extern jb_err client_referrer (struct client_state *csp, char **header); -extern jb_err client_uagent (struct client_state *csp, char **header); -extern jb_err client_ua (struct client_state *csp, char **header); -extern jb_err client_from (struct client_state *csp, char **header); -extern jb_err client_send_cookie (struct client_state *csp, char **header); -extern jb_err client_x_forwarded (struct client_state *csp, char **header); -extern jb_err client_accept_encoding (struct client_state *csp, char **header); -extern jb_err client_te (struct client_state *csp, char **header); - -extern jb_err client_host_adder (struct client_state *csp); -extern jb_err client_cookie_adder (struct client_state *csp); -extern jb_err client_xtra_adder (struct client_state *csp); -extern jb_err client_accept_encoding_adder(struct client_state *csp); -extern jb_err client_x_forwarded_adder (struct client_state *csp); - -extern jb_err connection_close_adder (struct client_state *csp); - -extern jb_err server_set_cookie (struct client_state *csp, char **header); -extern jb_err server_content_type (struct client_state *csp, char **header); -extern jb_err server_content_length (struct client_state *csp, char **header); -extern jb_err server_content_md5 (struct client_state *csp, char **header); -extern jb_err server_content_encoding(struct client_state *csp, char **header); -extern jb_err server_transfer_coding (struct client_state *csp, char **header); -extern jb_err server_http (struct client_state *csp, char **header); - -#ifdef FEATURE_FORCE_LOAD -extern int strclean(const char *string, const char *substring); -#endif /* def FEATURE_FORCE_LOAD */ + +extern char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp); + +extern void free_http_request(struct http_request *http); +extern void parse_http_request(char *req, struct http_request *http, struct client_state *csp); + +extern char *crumble(const struct parsers *v, char *s, struct client_state *csp); + +extern char *client_referrer(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_uagent(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_ua(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_from(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp); +extern char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp); +extern void client_cookie_adder(struct client_state *csp); +extern void client_xtra_adder(struct client_state *csp); +extern void client_x_forwarded_adder(struct client_state *csp); +extern char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp); + +#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[]; @@ -219,7 +137,7 @@ extern const char parsers_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef PARSERS_H_INCLUDED */ +#endif /* ndef _PARSERS_H */ /* Local Variables: diff --git a/pcre/.gitignore b/pcre/.gitignore deleted file mode 100644 index e68facf9..00000000 --- a/pcre/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -chartables.c -dftables diff --git a/pcre/Makefile.in b/pcre/Makefile.in deleted file mode 100644 index 94edf499..00000000 --- a/pcre/Makefile.in +++ /dev/null @@ -1,219 +0,0 @@ - -# 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 . 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 -# . 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 diff --git a/pcre/RunTest.in b/pcre/RunTest.in deleted file mode 100644 index 6e4eb085..00000000 --- a/pcre/RunTest.in +++ /dev/null @@ -1,148 +0,0 @@ -#! /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 diff --git a/pcre/config.guess b/pcre/config.guess deleted file mode 100644 index e1b58717..00000000 --- a/pcre/config.guess +++ /dev/null @@ -1,1121 +0,0 @@ -#! /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 . -# The master version of this file is at the FSF in /home/gd/gnu/lib. -# Please send patches to . -# -# 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 <$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 - - 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 - #include - - 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 - 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 < -#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/^ //' <$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 </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 < -#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' /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 - echo i586-unisys-sysv4 - exit 0 ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # 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 < -# include -#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 - 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 diff --git a/pcre/config.h b/pcre/config.h deleted file mode 100644 index c767cbb4..00000000 --- a/pcre/config.h +++ /dev/null @@ -1,5 +0,0 @@ - -/* For Privoxy, we just use Privoxy's config.h */ - -#include "../config.h" - diff --git a/pcre/config.in b/pcre/config.in deleted file mode 100644 index 02f42593..00000000 --- a/pcre/config.in +++ /dev/null @@ -1,33 +0,0 @@ - -/* 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 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 */ diff --git a/pcre/config.sub b/pcre/config.sub deleted file mode 100644 index 28426bb8..00000000 --- a/pcre/config.sub +++ /dev/null @@ -1,1232 +0,0 @@ -#! /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 diff --git a/pcre/configure.in b/pcre/configure.in deleted file mode 100644 index c98387d2..00000000 --- a/pcre/configure.in +++ /dev/null @@ -1,85 +0,0 @@ -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]) diff --git a/pcre/dftables.c b/pcre/dftables.c deleted file mode 100644 index d572dfd3..00000000 --- a/pcre/dftables.c +++ /dev/null @@ -1,148 +0,0 @@ -/************************************************* -* 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 - - 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 -#include -#include - -#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 */ diff --git a/pcre/dll.mk b/pcre/dll.mk deleted file mode 100644 index d8b728e5..00000000 --- a/pcre/dll.mk +++ /dev/null @@ -1,60 +0,0 @@ -# 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 diff --git a/pcre/doc/ChangeLog b/pcre/doc/ChangeLog deleted file mode 100644 index 2133dd76..00000000 --- a/pcre/doc/ChangeLog +++ /dev/null @@ -1,655 +0,0 @@ -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 - $(?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. - -**** diff --git a/pcre/doc/NON-UNIX-USE b/pcre/doc/NON-UNIX-USE deleted file mode 100644 index 09a74324..00000000 --- a/pcre/doc/NON-UNIX-USE +++ /dev/null @@ -1,50 +0,0 @@ -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). - -**** diff --git a/pcre/doc/Tech.Notes b/pcre/doc/Tech.Notes deleted file mode 100644 index 7b96e5b6..00000000 --- a/pcre/doc/Tech.Notes +++ /dev/null @@ -1,243 +0,0 @@ -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 diff --git a/pcre/doc/authors b/pcre/doc/authors deleted file mode 100644 index bfe1b5d8..00000000 --- a/pcre/doc/authors +++ /dev/null @@ -1,6 +0,0 @@ -Written by: Philip Hazel - -University of Cambridge Computing Service, -Cambridge, England. Phone: +44 1223 334714. - -Copyright (c) 1997-2000 University of Cambridge diff --git a/pcre/doc/copying b/pcre/doc/copying deleted file mode 100644 index 34d20db9..00000000 --- a/pcre/doc/copying +++ /dev/null @@ -1,46 +0,0 @@ -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 - -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 diff --git a/pcre/doc/news b/pcre/doc/news deleted file mode 100644 index 56fccdfa..00000000 --- a/pcre/doc/news +++ /dev/null @@ -1,54 +0,0 @@ -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) - -**** diff --git a/pcre/doc/pcre.3 b/pcre/doc/pcre.3 deleted file mode 100644 index bb812f47..00000000 --- a/pcre/doc/pcre.3 +++ /dev/null @@ -1,1810 +0,0 @@ -.TH PCRE 3 -.SH NAME -pcre - Perl-compatible regular expressions. -.SH SYNOPSIS -.B #include -.PP -.SM -.br -.B pcre *pcre_compile(const char *\fIpattern\fR, int \fIoptions\fR, -.ti +5n -.B const char **\fIerrptr\fR, int *\fIerroffset\fR, -.ti +5n -.B const unsigned char *\fItableptr\fR); -.PP -.br -.B pcre_extra *pcre_study(const pcre *\fIcode\fR, int \fIoptions\fR, -.ti +5n -.B const char **\fIerrptr\fR); -.PP -.br -.B int pcre_exec(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR," -.ti +5n -.B "const char *\fIsubject\fR," int \fIlength\fR, int \fIstartoffset\fR, -.ti +5n -.B int \fIoptions\fR, int *\fIovector\fR, int \fIovecsize\fR); -.PP -.br -.B int pcre_copy_substring(const char *\fIsubject\fR, int *\fIovector\fR, -.ti +5n -.B int \fIstringcount\fR, int \fIstringnumber\fR, char *\fIbuffer\fR, -.ti +5n -.B int \fIbuffersize\fR); -.PP -.br -.B int pcre_get_substring(const char *\fIsubject\fR, int *\fIovector\fR, -.ti +5n -.B int \fIstringcount\fR, int \fIstringnumber\fR, -.ti +5n -.B const char **\fIstringptr\fR); -.PP -.br -.B int pcre_get_substring_list(const char *\fIsubject\fR, -.ti +5n -.B int *\fIovector\fR, int \fIstringcount\fR, "const char ***\fIlistptr\fR);" -.PP -.br -.B void pcre_free_substring(const char *\fIstringptr\fR); -.PP -.br -.B void pcre_free_substring_list(const char **\fIstringptr\fR); -.PP -.br -.B const unsigned char *pcre_maketables(void); -.PP -.br -.B int pcre_fullinfo(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR," -.ti +5n -.B int \fIwhat\fR, void *\fIwhere\fR); -.PP -.br -.B int pcre_info(const pcre *\fIcode\fR, int *\fIoptptr\fR, int -.B *\fIfirstcharptr\fR); -.PP -.br -.B char *pcre_version(void); -.PP -.br -.B void *(*pcre_malloc)(size_t); -.PP -.br -.B void (*pcre_free)(void *); - - - -.SH DESCRIPTION -The PCRE library is a set of functions that implement regular 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 \fBpcreposix\fR documentation. - -The native API function prototypes are defined in the header file \fBpcre.h\fR, -and on Unix systems the library itself is called \fBlibpcre.a\fR, so can be -accessed by adding \fB-lpcre\fR 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 \fBpcre_compile()\fR, \fBpcre_study()\fR, and \fBpcre_exec()\fR -are used for compiling and matching regular expressions. - -The functions \fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and -\fBpcre_get_substring_list()\fR are convenience functions for extracting -captured substrings from a matched subject string; \fBpcre_free_substring()\fR -and \fBpcre_free_substring_list()\fR are also provided, to free the memory used -for extracted strings. - -The function \fBpcre_maketables()\fR is used (optionally) to build a set of -character tables in the current locale for passing to \fBpcre_compile()\fR. - -The function \fBpcre_fullinfo()\fR is used to find out information about a -compiled pattern; \fBpcre_info()\fR is an obsolete version which returns only -some of the available information, but is retained for backwards compatibility. -The function \fBpcre_version()\fR returns a pointer to a string containing the -version of PCRE and its date of release. - -The global variables \fBpcre_malloc\fR and \fBpcre_free\fR initially contain -the entry points of the standard \fBmalloc()\fR and \fBfree()\fR 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. - - -.SH MULTI-THREADING -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by \fBpcre_malloc\fR -and \fBpcre_free\fR 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. - - -.SH COMPILING A PATTERN -The function \fBpcre_compile()\fR 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 \fIpattern\fR. A pointer to a single block of memory -that is obtained via \fBpcre_malloc\fR is returned. This contains the -compiled code and related data. The \fBpcre\fR type is defined for this for -convenience, but in fact \fBpcre\fR is just a typedef for \fBvoid\fR, 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. -.PP -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 replicated. -.PP -The \fIoptions\fR 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 expressions -below). For these options, the contents of the \fIoptions\fR 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. -.PP -If \fIerrptr\fR is NULL, \fBpcre_compile()\fR returns NULL immediately. -Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fR returns -NULL, and sets the variable pointed to by \fIerrptr\fR 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 -\fIerroffset\fR, which must not be NULL. If it is, an immediate error is given. -.PP -If the final argument, \fItableptr\fR, is NULL, PCRE uses a default set of -character tables which are built when it is compiled, using the default C -locale. Otherwise, \fItableptr\fR must be the result of a call to -\fBpcre_maketables()\fR. See the section on locale support below. -.PP -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 newlines). 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, newlines are excluded. This option is -equivalent to Perl's /s option. A negative class such as [^a] always matches a -newline character, independent of the setting of this option. - - PCRE_EXTENDED - -If this bit is set, whitespace data characters in the pattern are totally -ignored except when escaped or inside a character class, and characters between -an unescaped # outside 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 subpattern. - - 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 immediately before any newline in the subject -string, respectively, as well as at the very start and end. This is equivalent -to Perl's /m option. If there are no "\\n" characters 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, experimental, and incomplete. -Details of exactly what it entails are given below. - - -.SH 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 \fBpcre_study()\fR takes a pointer to a compiled pattern as its first -argument, and returns a pointer to a \fBpcre_extra\fR block (another \fBvoid\fR -typedef) containing additional information about the pattern; this can be -passed to \fBpcre_exec()\fR. If no additional information is available, NULL -is returned. - -The second argument contains option bits. At present, no options are defined -for \fBpcre_study()\fR, and this argument should always be zero. - -The third argument for \fBpcre_study()\fR 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. - - -.SH LOCALE SUPPORT -PCRE handles caseless matching, and determines whether characters 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 -compiled. This is used when the final argument of \fBpcre_compile()\fR is NULL, -and is sufficient for many applications. - -An alternative set of tables can, however, be supplied. Such tables are built -by calling the \fBpcre_maketables()\fR function, which has no arguments, in the -relevant locale. The result can then be passed to \fBpcre_compile()\fR 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 \fBpcre_malloc\fR. The -pointer that is passed to \fBpcre_compile\fR is saved with the compiled -pattern, and the same tables are used via this pointer by \fBpcre_study()\fR -and \fBpcre_exec()\fR. 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 responsibility to ensure that the -memory containing the tables remains available for as long as it is needed. - - -.SH INFORMATION ABOUT A PATTERN -The \fBpcre_fullinfo()\fR function returns information about a compiled -pattern. It replaces the obsolete \fBpcre_info()\fR function, which is -nevertheless retained for backwards compability (and is documented below). - -The first argument for \fBpcre_fullinfo()\fR is a pointer to the compiled -pattern. The second argument is the result of \fBpcre_study()\fR, 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 variable -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 \fIcode\fR was NULL - the argument \fIwhere\fR was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADOPTION the value of \fIwhat\fR was invalid - -The possible values for the third argument are defined in \fBpcre.h\fR, and are -as follows: - - PCRE_INFO_OPTIONS - -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to au \fBunsigned long int\fR variable. These option bits -are those specified in the call to \fBpcre_compile()\fR, 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 \fBpcre_malloc()\fR when PCRE was getting memory in which to -place the compiled data. The fourth argument should point to a \fBsize_t\fR -variable. - - PCRE_INFO_CAPTURECOUNT - -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an \fbint\fR variable. - - PCRE_INFO_BACKREFMAX - -Return the number of the highest back reference in the pattern. The fourth -argument should point to an \fBint\fR variable. 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 -\fIwhere\fR. 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 construction of a 256-bit -table indicating a fixed set of characters 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 \fBunsigned char *\fR -variable. - - PCRE_INFO_LASTLITERAL - -For a non-anchored pattern, return the value of the rightmost literal character -which must exist in any matched string, other than at its start. The fourth -argument should point to an \fBint\fR 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 \fBpcre_info()\fR function is now obsolete because its interface is too -restrictive to return all the available data about a compiled pattern. New -programs should use \fBpcre_fullinfo()\fR instead. The yield of -\fBpcre_info()\fR is the number of capturing subpatterns, or one of the -following negative numbers: - - PCRE_ERROR_NULL the argument \fIcode\fR was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - -If the \fIoptptr\fR 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 \fIfirstcharptr\fR argument is not NULL, -it is used to pass back information about the first character of any matched -string (see PCRE_INFO_FIRSTCHAR above). - - -.SH MATCHING A PATTERN -The function \fBpcre_exec()\fR is called to match a subject string against a -pre-compiled pattern, which is passed in the \fIcode\fR argument. If the -pattern has been studied, the result of the study should be passed in the -\fIextra\fR argument. Otherwise this must be NULL. - -The PCRE_ANCHORED option can be passed in the \fIoptions\fR argument, 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 dollar metacharacter -should not match it nor (except in multiline 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 pattern, 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 \fBsplit()\fR 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 \fIsubject\fR, a length in -\fIlength\fR, and a starting offset in \fIstartoffset\fR. Unlike the pattern -string, it may contain binary zero characters. 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 \fBpcre_exec()\fR again after a previous success. -Setting \fIstartoffset\fR 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 \fBpcre_exec()\fR finds the first -occurrence. If \fBpcre_exec()\fR 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 -\fBpcre_exec()\fR is passed the entire string again, but with \fIstartoffset\fR -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 subject, 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 subpattern 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 \fIovector\fR. The number of elements in the vector -is passed in \fIovecsize\fR. 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 \fBpcre_exec()\fR while -matching capturing subpatterns, and is not available for passing back -information. The length passed in \fIovecsize\fR 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 \fIovector\fR, 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, \fIovector[0]\fR and \fIovector[1]\fR, 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 \fBpcre_exec()\fR -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 \fIn+1\fR to match some -part of the subject when subpattern \fIn\fR 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 substrings, 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, -\fBpcre_exec()\fR may be called with \fIovector\fR passed as NULL and -\fIovecsize\fR as zero. However, if the pattern contains back references and -the \fIovector\fR 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 \fIovector\fR. - -Note that \fBpcre_info()\fR can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -\fIovector\fR that will allow for \fIn\fR captured substrings in addition to -the offsets of the substring matched by the whole pattern is (\fIn\fR+1)*3. - -If \fBpcre_exec()\fR fails, it returns a negative number. The following are -defined in the header file: - - PCRE_ERROR_NOMATCH (-1) - -The subject string did not match the pattern. - - PCRE_ERROR_NULL (-2) - -Either \fIcode\fR or \fIsubject\fR was passed as NULL, or \fIovector\fR was -NULL and \fIovecsize\fR was not zero. - - PCRE_ERROR_BADOPTION (-3) - -An unrecognized bit was set in the \fIoptions\fR argument. - - PCRE_ERROR_BADMAGIC (-4) - -PCRE stores a 4-byte "magic number" at the start of the compiled 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 encountered 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 \fIovector\fR that is passed to -\fBpcre_exec()\fR 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 \fBpcre_malloc()\fR fails, this error is given. The memory is freed at -the end of matching. - - -.SH EXTRACTING CAPTURED SUBSTRINGS -Captured substrings can be accessed directly by using the offsets returned by -\fBpcre_exec()\fR in \fIovector\fR. For convenience, the functions -\fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and -\fBpcre_get_substring_list()\fR 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 functions: \fIsubject\fR -is the subject string which has just been successfully matched, \fIovector\fR -is a pointer to the vector of integer offsets that was passed to -\fBpcre_exec()\fR, and \fIstringcount\fR 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 \fBpcre_exec\fR if it -is greater than zero. If \fBpcre_exec()\fR returned zero, indicating that it -ran out of space in \fIovector\fR, the value passed as \fIstringcount\fR should -be the size of the vector divided by three. - -The functions \fBpcre_copy_substring()\fR and \fBpcre_get_substring()\fR -extract a single substring, whose number is given as \fIstringnumber\fR. A -value of zero extracts the substring that matched the entire pattern, while -higher values extract the captured substrings. For \fBpcre_copy_substring()\fR, -the string is placed in \fIbuffer\fR, whose length is given by -\fIbuffersize\fR, while for \fBpcre_get_substring()\fR a new block of memory is -obtained via \fBpcre_malloc\fR, and its address is returned via -\fIstringptr\fR. 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 \fBpcre_copy_substring()\fR, or the attempt to get -memory failed for \fBpcre_get_substring()\fR. - - PCRE_ERROR_NOSUBSTRING (-7) - -There is no substring whose number is \fIstringnumber\fR. - -The \fBpcre_get_substring_list()\fR function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory which is obtained via \fBpcre_malloc\fR. The address of the memory block -is returned via \fIlistptr\fR, 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 \fIn+1\fR matches some part of the -subject, but subpattern \fIn\fR 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 \fIovector\fR, which is negative for unset -substrings. - -The two convenience functions \fBpcre_free_substring()\fR and -\fBpcre_free_substring_list()\fR can be used to free the memory returned by -a previous call of \fBpcre_get_substring()\fR or -\fBpcre_get_substring_list()\fR, respectively. They do nothing more than call -the function pointed to by \fBpcre_free\fR, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language which cannot use -\fBpcre_free\fR directly; it is for these cases that the functions are -provided. - - -.SH 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 -subpatterns, assertions, and other types of subpattern, is 200. - -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, PCRE uses recursion to handle subpatterns -and indefinite repetition. This means that the available stack space may limit -the size of a subject string that can be processed by certain patterns. - - -.SH 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 \fBisspace()\fR recognizes, though it is possible to compile PCRE with -alternative character type tables. Normally \fBisspace()\fR matches space, -formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5 -no longer includes vertical tab in its set of whitespace characters. The \\v -escape that was in the Perl documentation for a long time was never in fact -recognized. However, the character 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 lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sets its -numerical variables 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 subject 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 pattern 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 experimental 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 repetition 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 -\fBpcre_exec()\fR 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.) - - -.SH REGULAR EXPRESSION DETAILS -The syntax and semantics of the regular expressions supported 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 \fBpcre_compile()\fR 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 characters 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 pattern. These are encoded in the pattern by the use of -\fImeta-characters\fR, 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. - - -.SH 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 following 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 particular, -if you want to match a backslash, you write "\\\\". - -If a pattern is compiled with the PCRE_EXTENDED option, whitespace 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 characters, 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 \fIback reference\fR. 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 following 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 introduced 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 character 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 controlled 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 character 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 assertions. 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 \fIstartoffset\fR argument of -\fBpcre_exec()\fR 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. - - -.SH 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 \fIstartoffset\fR argument of -\fBpcre_exec()\fR 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 alternatives 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 constructs 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. Consequently, patterns that are anchored in single line mode -because all branches start with "^" are not anchored in multiline mode, and a -match for circumflex is possible when the \fIstartoffset\fR argument of -\fBpcre_exec()\fR 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. - - -.SH FULL STOP (PERIOD, DOT) -Outside a character class, a dot in the pattern matches any one character in -the subject, including a non-printing character, 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. - - -.SH SQUARE BRACKETS -An opening square bracket introduces a character class, terminated 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 circumflex, 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 circumflex, 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 convenient 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 -caseful 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 interpreted 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 "-") followed 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 interpreted 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 -restricted 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. - - -.SH 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 supported 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 ^ character 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. - - -.SH 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 alternatives 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. - - -.SH 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" settings apply to the whole pattern (unless -there are other changes inside subpatterns). If there is more than one setting -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 otherwise. - -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. - - -.SH SUBPATTERNS -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Marking part of a pattern as a subpattern does two things: - -1. It localizes a set of alternatives. For example, the pattern - - cat(aract|erpillar|) - -matches one of the words "cat", "cataract", or "caterpillar". 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 portion of the subject string that matched -the subpattern is passed back to the caller via the \fIovector\fR argument of -\fBpcre_exec()\fR. Opening parentheses are counted from left to right (starting -from 1) to obtain the numbers of the capturing 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 subpattern 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 pattern - - the ((?:red|white) (king|queen)) - -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of captured substrings 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". - - -.SH 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 -quantifier, 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 permitted 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 comments 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 preferred number of matches. -Do not confuse this use of question 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 maximum, 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 -character 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 pattern -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 example, after - - (tweedle[dume]{3}\\s*)+ - -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after - - /(a|(b))+/ - -matches "aba" the value of the second captured substring is "b". - - -.SH 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 handling of digits following a backslash. - -A back reference matches whatever actually matched the capturing 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 responsibility", 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 caselessly. - -There may be more than one back reference to the same subpattern. 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 pattern - - (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. - - -.SH 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 -complicated 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 assertions and (? 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 standalone 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 maximizing 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 complicated subpatterns, -and it can be nested. - -Once-only subpatterns can be used in conjunction with lookbehind 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 backtracks 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 subpattern 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 consist 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 example 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 happens quickly. - - -.SH CONDITIONAL SUBPATTERNS -It is possible to cause the matching process to obey a subpattern -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; otherwise 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 containing non-significant white space, and with the two -alternatives 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. - - -.SH COMMENTS -The sequence (?# marks the start of a comment which continues 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 continues up to the next newline -character in the pattern. - - -.SH 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 pattern 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 matching 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 subpattern 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 \fBpcre_malloc\fR, freeing it via \fBpcre_free\fR 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. - - -.SH 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 principle 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. - - -.SH 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 \fBpcre_compile()\fR with the PCRE_UTF8 option -flag. When you do this, both the pattern and any subject 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 additional 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 contents 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 follow 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 single 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 implemented: - -1. The escape sequence \\C to match a single byte. - -2. The use of Unicode tables and properties and escapes \\p, \\P, and \\X. - -.SH AUTHOR -Philip Hazel -.br -University Computing Service, -.br -New Museums Site, -.br -Cambridge CB2 3QG, England. -.br -Phone: +44 1223 334714 - -Last updated: 28 August 2000, -.br - the 250th anniversary of the death of J.S. Bach. -.br -Copyright (c) 1997-2000 University of Cambridge. diff --git a/pcre/doc/pcre.html b/pcre/doc/pcre.html deleted file mode 100644 index b12b2126..00000000 --- a/pcre/doc/pcre.html +++ /dev/null @@ -1,2397 +0,0 @@ - - -pcre specification - - -

    pcre specification

    -This HTML document has been generated automatically from the original man page. -If there is any nonsense in it, please consult the man page in case the -conversion went wrong. - -
  • 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, int -*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 regular 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 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 -convenience, 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 replicated. -

    -

    -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 expressions -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 newlines). 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, newlines are excluded. This option is -equivalent to Perl's /s option. A negative class such as [^a] always matches a -newline character, independent of the setting of this option. -

    -

    -

    -  PCRE_EXTENDED
    -
    -

    -

    -If this bit is set, whitespace data characters in the pattern are totally -ignored except when escaped or inside a character class, and characters between -an unescaped # outside 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 subpattern. -

    -

    -

    -  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 immediately before any newline in the subject -string, respectively, as well as at the very start and end. This is equivalent -to Perl's /m option. If there are no "\n" characters 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, experimental, 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 pattern; 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 characters 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 -compiled. This is used when the final argument of pcre_compile() is NULL, -and is sufficient for many applications. -

    -

    -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 responsibility 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() function, which is -nevertheless retained for backwards compability (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 variable -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 compiled. 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 \fbint\fR variable. -

    -

    -

    -  PCRE_INFO_BACKREFMAX
    -
    -

    -

    -Return the number of the highest back reference in the pattern. The fourth -argument should point to an int variable. 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 construction of a 256-bit -table indicating a fixed set of characters 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 rightmost 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 interface 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 argument, 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 dollar metacharacter -should not match it nor (except in multiline 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 pattern, 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 characters. 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 subject, 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 subpattern 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 ovector[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 substrings, 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 capturing -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 following 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 compiled 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 encountered 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 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 functions: 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 ovector, 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 stringnumber. 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 available 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 negative 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. However, 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 -subpatterns, assertions, and other types of subpattern, is 200. -

    -

    -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, PCRE uses recursion to handle subpatterns -and indefinite repetition. This means that the available stack space may limit -the size of a subject string that can be processed by certain 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 characters. The \v -escape that was in the Perl documentation for a long time was never in fact -recognized. However, the character 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 lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sets its -numerical variables 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 subject 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 pattern 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 experimental 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 repetition 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 supported 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 characters 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 pattern. 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 following 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 particular, -if you want to match a backslash, you write "\\". -

    -

    -If a pattern is compiled with the PCRE_EXTENDED option, whitespace 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 characters, 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 following 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 introduced 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 character 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 controlled 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 character 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 assertions. 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 argument 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 alternatives 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 constructs 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. Consequently, patterns that are anchored in single line mode -because all branches start with "^" are not anchored in multiline 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 character, 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, terminated 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 circumflex, 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 circumflex, 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 convenient 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 -caseful 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 interpreted 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 "-") followed 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 interpreted 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 -restricted 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 supported 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 ^ character 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 alternatives 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" settings apply to the whole pattern (unless -there are other changes inside subpatterns). If there is more than one setting -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 otherwise. -

    -

    -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 subpattern does two things: -

    -

    -1. It localizes a set of alternatives. For example, the pattern -

    -

    -

    -  cat(aract|erpillar|)
    -
    -

    -

    -matches one of the words "cat", "cataract", or "caterpillar". 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 portion 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 capturing 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 subpattern 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 pattern -

    -

    -

    -  the ((?:red|white) (king|queen))
    -
    -

    -

    -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of captured substrings 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 -quantifier, 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 permitted 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 comments 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 preferred number of matches. -Do not confuse this use of question 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 maximum, 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 -character 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 pattern -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 example, after -

    -

    -

    -  (tweedle[dume]{3}\s*)+
    -
    -

    -

    -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, 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 handling of digits following a backslash. -

    -

    -A back reference matches whatever actually matched the capturing 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 responsibility", 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 caselessly. -

    -

    -There may be more than one back reference to the same subpattern. 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 pattern -

    -

    -

    -  (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 -complicated 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 assertions 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 different 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 rewritten 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 matching 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 standalone 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 maximizing 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 complicated subpatterns, -and it can be nested. -

    -

    -Once-only subpatterns can be used in conjunction with lookbehind 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 backtracks 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 subpattern 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 consist 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 example 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 happens quickly. -

    -
  • CONDITIONAL SUBPATTERNS -

    -It is possible to cause the matching process to obey a subpattern -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; otherwise 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 containing non-significant white space, and with the two -alternatives 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 continues 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 continues 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 pattern 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 matching 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 subpattern 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 principle 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 subject 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 additional 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 contents 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 follow 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 single 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 implemented: -

    -

    -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. diff --git a/pcre/doc/pcre.txt b/pcre/doc/pcre.txt deleted file mode 100644 index 1db4b537..00000000 --- a/pcre/doc/pcre.txt +++ /dev/null @@ -1,2125 +0,0 @@ -NAME - pcre - Perl-compatible regular expressions. - - - -SYNOPSIS - #include - - 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 (? 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 - 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. diff --git a/pcre/doc/pcregrep.1 b/pcre/doc/pcregrep.1 deleted file mode 100644 index ec733fa1..00000000 --- a/pcre/doc/pcregrep.1 +++ /dev/null @@ -1,76 +0,0 @@ -.TH PCREGREP 1 -.SH NAME -pcregrep - a grep with Perl-compatible regular expressions. -.SH SYNOPSIS -.B pcregrep [-Vchilnsvx] pattern [file] ... - - -.SH DESCRIPTION -\fBpcregrep\fR searches files for character patterns, in the same way as other -grep commands do, but it uses the PCRE regular expression library to support -patterns that are compatible with the regular expressions of Perl 5. See -\fBpcre(3)\fR for a full description of syntax and semantics. - -If no files are specified, \fBpcregrep\fR reads the standard input. By default, -each line that matches the pattern is copied to the standard output, and if -there is more than one file, the file name is printed before each line of -output. However, there are options that can change how \fBpcregrep\fR behaves. - -Lines are limited to BUFSIZ characters. BUFSIZ is defined in \fB\fR. -The newline character is removed from the end of each line before it is matched -against the pattern. - - -.SH OPTIONS -.TP 10 -\fB-V\fR -Write the version number of the PCRE library being used to the standard error -stream. -.TP -\fB-c\fR -Do not print individual lines; instead just print a count of the number of -lines that would otherwise have been printed. If several files are given, a -count is printed for each of them. -.TP -\fB-h\fR -Suppress printing of filenames when searching multiple files. -.TP -\fB-i\fR -Ignore upper/lower case distinctions during comparisons. -.TP -\fB-l\fR -Instead of printing lines from the files, just print the names of the files -containing lines that would have been printed. Each file name is printed -once, on a separate line. -.TP -\fB-n\fR -Precede each line by its line number in the file. -.TP -\fB-s\fR -Work silently, that is, display nothing except error messages. -The exit status indicates whether any matches were found. -.TP -\fB-v\fR -Invert the sense of the match, so that lines which do \fInot\fR match the -pattern are now the ones that are found. -.TP -\fB-x\fR -Force the pattern to be anchored (it must start matching at the beginning of -the line) and in addition, require it to match the entire line. This is -equivalent to having ^ and $ characters at the start and end of each -alternative branch in the regular expression. - - -.SH SEE ALSO -\fBpcre(3)\fR, Perl 5 documentation - - -.SH DIAGNOSTICS -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors or inacessible files (even if matches were found). - - -.SH AUTHOR -Philip Hazel -.br -Copyright (c) 1997-2000 University of Cambridge. diff --git a/pcre/doc/pcregrep.html b/pcre/doc/pcregrep.html deleted file mode 100644 index 19f733c4..00000000 --- a/pcre/doc/pcregrep.html +++ /dev/null @@ -1,105 +0,0 @@ - - -pcregrep specification - - -

    pcregrep specification

    -This HTML document has been generated automatically from the original man page. -If there is any nonsense in it, please consult the man page in case the -conversion went wrong. - -
  • NAME -

    -pcregrep - a grep with Perl-compatible regular expressions. -

    -
  • SYNOPSIS -

    -pcregrep [-Vchilnsvx] pattern [file] ... -

    -
  • DESCRIPTION -

    -pcregrep searches files for character patterns, in the same way as other -grep commands do, but it uses the PCRE regular expression library to support -patterns that are compatible with the regular expressions of Perl 5. See -pcre(3) for a full description of syntax and semantics. -

    -

    -If no files are specified, pcregrep reads the standard input. By default, -each line that matches the pattern is copied to the standard output, and if -there is more than one file, the file name is printed before each line of -output. However, there are options that can change how pcregrep behaves. -

    -

    -Lines are limited to BUFSIZ characters. BUFSIZ is defined in <stdio.h>. -The newline character is removed from the end of each line before it is matched -against the pattern. -

    -
  • OPTIONS -

    --V -Write the version number of the PCRE library being used to the standard error -stream. -

    -

    --c -Do not print individual lines; instead just print a count of the number of -lines that would otherwise have been printed. If several files are given, a -count is printed for each of them. -

    -

    --h -Suppress printing of filenames when searching multiple files. -

    -

    --i -Ignore upper/lower case distinctions during comparisons. -

    -

    --l -Instead of printing lines from the files, just print the names of the files -containing lines that would have been printed. Each file name is printed -once, on a separate line. -

    -

    --n -Precede each line by its line number in the file. -

    -

    --s -Work silently, that is, display nothing except error messages. -The exit status indicates whether any matches were found. -

    -

    --v -Invert the sense of the match, so that lines which do not match the -pattern are now the ones that are found. -

    -

    --x -Force the pattern to be anchored (it must start matching at the beginning of -the line) and in addition, require it to match the entire line. This is -equivalent to having ^ and $ characters at the start and end of each -alternative branch in the regular expression. -

    -
  • SEE ALSO -

    -pcre(3), Perl 5 documentation -

    -
  • DIAGNOSTICS -

    -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors or inacessible files (even if matches were found). -

    -
  • AUTHOR -

    -Philip Hazel <ph10@cam.ac.uk> -
    -Copyright (c) 1997-2000 University of Cambridge. diff --git a/pcre/doc/pcregrep.txt b/pcre/doc/pcregrep.txt deleted file mode 100644 index 871350ca..00000000 --- a/pcre/doc/pcregrep.txt +++ /dev/null @@ -1,87 +0,0 @@ -NAME - pcregrep - a grep with Perl-compatible regular expressions. - - - -SYNOPSIS - pcregrep [-Vchilnsvx] pattern [file] ... - - - -DESCRIPTION - pcregrep searches files for character patterns, in the same - way as other grep commands do, but it uses the PCRE regular - expression library to support patterns that are compatible - with the regular expressions of Perl 5. See pcre(3) for a - full description of syntax and semantics. - - If no files are specified, pcregrep reads the standard - input. By default, each line that matches the pattern is - copied to the standard output, and if there is more than one - file, the file name is printed before each line of output. - However, there are options that can change how pcregrep - behaves. - - Lines are limited to BUFSIZ characters. BUFSIZ is defined in - . The newline character is removed from the end of - each line before it is matched against the pattern. - - - -OPTIONS - -V Write the version number of the PCRE library being - used to the standard error stream. - - -c Do not print individual lines; instead just print - a count of the number of lines that would other- - wise have been printed. If several files are - given, a count is printed for each of them. - - -h Suppress printing of filenames when searching mul- - tiple files. - - -i Ignore upper/lower case distinctions during com- - parisons. - - -l Instead of printing lines from the files, just - print the names of the files containing lines that - would have been printed. Each file name is printed - once, on a separate line. - - -n Precede each line by its line number in the file. - - -s Work silently, that is, display nothing except - error messages. The exit status indicates whether - any matches were found. - - -v Invert the sense of the match, so that lines which - do not match the pattern are now the ones that are - found. - - -x Force the pattern to be anchored (it must start - matching at the beginning of the line) and in - addition, require it to match the entire line. - This is equivalent to having ^ and $ characters at - the start and end of each alternative branch in - the regular expression. - - - -SEE ALSO - pcre(3), Perl 5 documentation - - - - - -DIAGNOSTICS - Exit status is 0 if any matches were found, 1 if no matches - were found, and 2 for syntax errors or inacessible files - (even if matches were found). - - - -AUTHOR - Philip Hazel - Copyright (c) 1997-2000 University of Cambridge. - diff --git a/pcre/doc/pcreposix.3 b/pcre/doc/pcreposix.3 deleted file mode 100644 index 4853a97f..00000000 --- a/pcre/doc/pcreposix.3 +++ /dev/null @@ -1,149 +0,0 @@ -.TH PCRE 3 -.SH NAME -pcreposix - POSIX API for Perl-compatible regular expressions. -.SH SYNOPSIS -.B #include -.PP -.SM -.br -.B int regcomp(regex_t *\fIpreg\fR, const char *\fIpattern\fR, -.ti +5n -.B int \fIcflags\fR); -.PP -.br -.B int regexec(regex_t *\fIpreg\fR, const char *\fIstring\fR, -.ti +5n -.B size_t \fInmatch\fR, regmatch_t \fIpmatch\fR[], int \fIeflags\fR); -.PP -.br -.B size_t regerror(int \fIerrcode\fR, const regex_t *\fIpreg\fR, -.ti +5n -.B char *\fIerrbuf\fR, size_t \fIerrbuf_size\fR); -.PP -.br -.B void regfree(regex_t *\fIpreg\fR); - - -.SH DESCRIPTION -This set of functions provides a POSIX-style API to the PCRE regular expression -package. See the \fBpcre\fR 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 \fBpcreposix.h\fR header -file, and on Unix systems the library itself is called \fBpcreposix.a\fR, so -can be accessed by adding \fB-lpcreposix\fR to the command for linking an -application which uses them. Because the POSIX functions call the native ones, -it is also necessary to add \fR-lpcre\fR. - -I have implemented only those option bits that can be reasonably 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, subject to the setting of various PCRE options, as -described below. - -The header for these functions is supplied as \fBpcreposix.h\fR to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as \fBregex.h\fR, which is the "correct" name. It provides two -structure types, \fIregex_t\fR for compiled internal forms, and -\fIregmatch_t\fR for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. - - -.SH COMPILING A PATTERN - -The function \fBregcomp()\fR 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 \fIpattern\fR. The \fIpreg\fR argument is a pointer -to a regex_t structure which is used as a base for storing information about -the compiled expression. - -The argument \fIcflags\fR 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 -\fIsome\fR 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 \fBregcomp()\fR is zero on success, and non-zero otherwise. The -\fIpreg\fR structure is filled in on success, and one member of the structure -is publicized: \fIre_nsub\fR contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. - - -.SH MATCHING A PATTERN -The function \fBregexec()\fR is called to match a pre-compiled pattern -\fIpreg\fR against a given \fIstring\fR, which is terminated by a zero byte, -subject to the options in \fIeflags\fR. 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 \fIpmatch\fR argument, which points to an array of -\fInmatch\fR structures of type \fIregmatch_t\fR, containing the members -\fIrm_so\fR and \fIrm_eo\fR. 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 \fIstring\fR 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. - - -.SH ERROR MESSAGES -The \fBregerror()\fR function maps a non-zero errorcode from either -\fBregcomp\fR or \fBregexec\fR to a printable message. If \fIpreg\fR is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in \fIerrbuf\fR. The length of the -message, including the zero, is limited to \fIerrbuf_size\fR. The yield of the -function is the size of buffer needed to hold the whole message. - - -.SH STORAGE -Compiling a regular expression causes memory to be allocated and associated -with the \fIpreg\fR structure. The function \fBregfree()\fR frees all such -memory, after which \fIpreg\fR may no longer be used as a compiled expression. - - -.SH AUTHOR -Philip Hazel -.br -University Computing Service, -.br -New Museums Site, -.br -Cambridge CB2 3QG, England. -.br -Phone: +44 1223 334714 - -Copyright (c) 1997-2000 University of Cambridge. diff --git a/pcre/doc/pcreposix.html b/pcre/doc/pcreposix.html deleted file mode 100644 index 79ff544b..00000000 --- a/pcre/doc/pcreposix.html +++ /dev/null @@ -1,191 +0,0 @@ - - -pcreposix specification - - -

    pcreposix specification

    -This HTML document has been generated automatically from the original man page. -If there is any nonsense in it, please consult the man page in case the -conversion went wrong. - -
  • NAME -

    -pcreposix - POSIX API for Perl-compatible regular expressions. -

    -
  • 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 \fR-lpcre\fR. -

    -

    -I have implemented only those option bits that can be reasonably 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, subject 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 expression. -

    -

    -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 otherwise. 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 regfree() 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. diff --git a/pcre/doc/pcreposix.txt b/pcre/doc/pcreposix.txt deleted file mode 100644 index 2d76f7cd..00000000 --- a/pcre/doc/pcreposix.txt +++ /dev/null @@ -1,159 +0,0 @@ -NAME - pcreposix - POSIX API for Perl-compatible regular expres- - sions. - - - -SYNOPSIS - #include - - 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 - University Computing Service, - New Museums Site, - Cambridge CB2 3QG, England. - Phone: +44 1223 334714 - - Copyright (c) 1997-2000 University of Cambridge. diff --git a/pcre/doc/pcretest.txt b/pcre/doc/pcretest.txt deleted file mode 100644 index 722e6b86..00000000 --- a/pcre/doc/pcretest.txt +++ /dev/null @@ -1,246 +0,0 @@ -The pcretest program --------------------- - -This program is intended for testing PCRE, but it can also be used for -experimenting with regular expressions. - -If it is given two filename arguments, it reads from the first and writes to -the second. If it is given only one filename argument, it reads from that file -and writes to stdout. Otherwise, it reads from stdin and writes to stdout, and -prompts for each line of input, using "re>" to prompt for regular expressions, -and "data>" to prompt for data lines. - -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against the pattern. An empty line signals the end of the -data lines, at which point a new regular expression is read. The regular -expressions are given enclosed in any non-alphameric delimiters other than -backslash, for example - - /(a|bc)x+yz/ - -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. See the test input files in the testdata directory for many -examples. It is possible to include the delimiter within the pattern by -escaping it, for example - - /abc\/def/ - -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphameric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, - - /abc/\ - -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because - - /abc\/ - -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. - - -PATTERN MODIFIERS ------------------ - -The pattern may be followed by i, m, s, or x to set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively. For -example: - - /caseless/i - -These modifier letters have the same effect as they do in Perl. There are -others which set PCRE options that do not correspond to anything in Perl: /A, -/E, and /X set PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and PCRE_EXTRA respectively. - -Searching for all possible matches within each subject string can be requested -by the /g or /G modifier. After finding a match, PCRE is called again to search -the remainder of the subject string. The difference between /g and /G is that -the former uses the startoffset argument to pcre_exec() to start searching at -a new point within the entire string (which is in effect what Perl does), -whereas the latter passes over a shortened substring. This makes a difference -to the matching process if the pattern begins with a lookbehind assertion -(including \b or \B). - -If any call to pcre_exec() in a /g or /G sequence matches an empty string, the -next call is done with the PCRE_NOTEMPTY and PCRE_ANCHORED flags set in order -to search for another, non-empty, match at the same point. If this second match -fails, the start offset is advanced by one, and the normal match is retried. -This imitates the way Perl handles such cases when using the /g modifier or the -split() function. - -There are a number of other modifiers for controlling the way pcretest -operates. - -The /+ modifier requests that as well as outputting the substring that matched -the entire pattern, pcretest should in addition output the remainder of the -subject string. This is useful for tests where the subject contains multiple -copies of the same substring. - -The /L modifier must be followed directly by the name of a locale, for example, - - /pattern/Lfr - -For this reason, it must be the last modifier letter. The given locale is set, -pcre_maketables() is called to build a set of character tables for the locale, -and this is then passed to pcre_compile() when compiling the regular -expression. Without an /L modifier, NULL is passed as the tables pointer; that -is, /L applies only to the expression on which it appears. - -The /I modifier requests that pcretest output information about the compiled -expression (whether it is anchored, has a fixed first character, and so on). It -does this by calling pcre_fullinfo() after compiling an expression, and -outputting the information it gets back. If the pattern is studied, the results -of that are also output. - -The /D modifier is a PCRE debugging feature, which also assumes /I. It causes -the internal form of compiled regular expressions to be output after -compilation. - -The /S modifier causes pcre_study() to be called after the expression has been -compiled, and the results used when the expression is matched. - -The /M modifier causes the size of memory block used to hold the compiled -pattern to be output. - -The /P modifier causes pcretest to call PCRE via the POSIX wrapper API rather -than its native API. When this is done, all other modifiers except /i, /m, and -/+ are ignored. REG_ICASE is set if /i is present, and REG_NEWLINE is set if /m -is present. The wrapper functions force PCRE_DOLLAR_ENDONLY always, and -PCRE_DOTALL unless REG_NEWLINE is set. - -The /8 modifier causes pcretest to call PCRE with the PCRE_UTF8 option set. -This turns on the (currently incomplete) support for UTF-8 character handling -in PCRE, provided that it was compiled with this support enabled. This modifier -also causes any non-printing characters in output strings to be printed using -the \x{hh...} notation if they are valid UTF-8 sequences. - - -DATA LINES ----------- - -Before each data line is passed to pcre_exec(), leading and trailing whitespace -is removed, and it is then scanned for \ escapes. The following are recognized: - - \a alarm (= BEL) - \b backspace - \e escape - \f formfeed - \n newline - \r carriage return - \t tab - \v vertical tab - \nnn octal character (up to 3 octal digits) - \xhh hexadecimal character (up to 2 hex digits) - \x{hh...} hexadecimal UTF-8 character - - \A pass the PCRE_ANCHORED option to pcre_exec() - \B pass the PCRE_NOTBOL option to pcre_exec() - \Cdd call pcre_copy_substring() for substring dd after a successful - match (any decimal number less than 32) - \Gdd call pcre_get_substring() for substring dd after a successful - match (any decimal number less than 32) - \L call pcre_get_substringlist() after a successful match - \N pass the PCRE_NOTEMPTY option to pcre_exec() - \Odd set the size of the output vector passed to pcre_exec() to dd - (any number of decimal digits) - \Z pass the PCRE_NOTEOL option to pcre_exec() - -A backslash followed by anything else just escapes the anything else. If the -very last character is a backslash, it is ignored. This gives a way of passing -an empty line as data, since a real empty line terminates the data input. - -If /P was present on the regex, causing the POSIX wrapper API to be used, only -\B, and \Z have any effect, causing REG_NOTBOL and REG_NOTEOL to be passed to -regexec() respectively. - -The use of \x{hh...} to represent UTF-8 characters is not dependent on the use -of the /8 modifier on the pattern. It is recognized always. There may be any -number of hexadecimal digits inside the braces. The result is from one to six -bytes, encoded according to the UTF-8 rules. - - -OUTPUT FROM PCRETEST --------------------- - -When a match succeeds, pcretest outputs the list of captured substrings that -pcre_exec() returns, starting with number 0 for the string that matched the -whole pattern. Here is an example of an interactive pcretest run. - - $ pcretest - PCRE version 2.06 08-Jun-1999 - - re> /^abc(\d+)/ - data> abc123 - 0: abc123 - 1: 123 - data> xyz - No match - -If the strings contain any non-printing characters, they are output as \0x -escapes, or as \x{...} escapes if the /8 modifier was present on the pattern. -If the pattern has the /+ modifier, then the output for substring 0 is followed -by the the rest of the subject string, identified by "0+" like this: - - re> /cat/+ - data> cataract - 0: cat - 0+ aract - -If the pattern has the /g or /G modifier, the results of successive matching -attempts are output in sequence, like this: - - re> /\Bi(\w\w)/g - data> Mississippi - 0: iss - 1: ss - 0: iss - 1: ss - 0: ipp - 1: pp - -"No match" is output only if the first match attempt fails. - -If any of \C, \G, or \L are present in a data line that is successfully -matched, the substrings extracted by the convenience functions are output with -C, G, or L after the string number instead of a colon. This is in addition to -the normal full list. The string length (that is, the return from the -extraction function) is given in parentheses after each string for \C and \G. - -Note that while patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \n escape. - - -COMMAND LINE OPTIONS --------------------- - -If the -p option is given to pcretest, it is equivalent to adding /P to each -regular expression: the POSIX wrapper API is used to call PCRE. None of the -following flags has any effect in this case. - -If the option -d is given to pcretest, it is equivalent to adding /D to each -regular expression: the internal form is output after compilation. - -If the option -i is given to pcretest, it is equivalent to adding /I to each -regular expression: information about the compiled pattern is given after -compilation. - -If the option -m is given to pcretest, it outputs the size of each compiled -pattern after it has been compiled. It is equivalent to adding /M to each -regular expression. For compatibility with earlier versions of pcretest, -s is -a synonym for -m. - -If the -t option is given, each compile, study, and match is run 20000 times -while being timed, and the resulting time per compile or match is output in -milliseconds. Do not set -t with -m, because you will then get the size output -20000 times and the timing will be distorted. If you want to change the number -of repetitions used for timing, edit the definition of LOOPREPEAT at the top of -pcretest.c - -Philip Hazel -August 2000 diff --git a/pcre/doc/perltest.txt b/pcre/doc/perltest.txt deleted file mode 100644 index 33155c1a..00000000 --- a/pcre/doc/perltest.txt +++ /dev/null @@ -1,29 +0,0 @@ -The perltest program --------------------- - -The perltest program tests Perl's regular expressions; it has the same -specification as pcretest, and so can be given identical input, except that -input patterns can be followed only by Perl's lower case modifiers and /+ (as -used by pcretest), which is recognized and handled by the program. - -The data lines are processed as Perl double-quoted strings, so if they contain -" \ $ or @ characters, these have to be escaped. For this reason, all such -characters in testinput1 and testinput3 are escaped so that they can be used -for perltest as well as for pcretest, and the special upper case modifiers such -as /A that pcretest recognizes are not used in these files. The output should -be identical, apart from the initial identifying banner. - -For testing UTF-8 features, an alternative form of perltest, called perltest8, -is supplied. This requires Perl 5.6 or higher. It recognizes the special -modifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput5 -file can be fed to perltest8. - -The testinput2 and testinput4 files are not suitable for feeding to perltest, -since they do make use of the special upper case modifiers and escapes that -pcretest uses to test some features of PCRE. The first of these files also -contains malformed regular expressions, in order to check that PCRE diagnoses -them correctly. Similarly, testinput6 tests UTF-8 features that do not relate -to Perl. - -Philip Hazel -August 2000 diff --git a/pcre/doc/readme b/pcre/doc/readme deleted file mode 100644 index d124ee01..00000000 --- a/pcre/doc/readme +++ /dev/null @@ -1,270 +0,0 @@ -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 -August 2000 diff --git a/pcre/get.c b/pcre/get.c deleted file mode 100644 index 42e9bd49..00000000 --- a/pcre/get.c +++ /dev/null @@ -1,227 +0,0 @@ -/************************************************* -* 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 - - 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 . */ - - -/* 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 */ diff --git a/pcre/install b/pcre/install deleted file mode 100644 index 08802812..00000000 --- a/pcre/install +++ /dev/null @@ -1,185 +0,0 @@ -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. diff --git a/pcre/install-sh b/pcre/install-sh deleted file mode 100644 index e9de2384..00000000 --- a/pcre/install-sh +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5 (mit/util/scripts/install.sh). -# -# Copyright 1991 by the Massachusetts Institute of Technology -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in advertising or -# publicity pertaining to distribution of the software without specific, -# written prior permission. M.I.T. makes no representations about the -# suitability of this software for any purpose. It is provided "as is" -# without express or implied warranty. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -transformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - chmodcmd="" - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/pcre/internal.h b/pcre/internal.h deleted file mode 100644 index 25bb7f8f..00000000 --- a/pcre/internal.h +++ /dev/null @@ -1,381 +0,0 @@ -/************************************************* -* 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 - - 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 -#include -#include -#include -#include -#include -#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 */ diff --git a/pcre/licence b/pcre/licence deleted file mode 100644 index 34d20db9..00000000 --- a/pcre/licence +++ /dev/null @@ -1,46 +0,0 @@ -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 - -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 diff --git a/pcre/ltconfig b/pcre/ltconfig deleted file mode 100644 index a01334f9..00000000 --- a/pcre/ltconfig +++ /dev/null @@ -1,3078 +0,0 @@ -#! /bin/sh - -# ltconfig - Create a system-specific libtool. -# Copyright (C) 1996-1999 Free Software Foundation, Inc. -# Originally by Gordon Matzigkeit , 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 </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 <&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 <&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 &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 <&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 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 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 <&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 <&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 < conftest.c -#ifdef __cplusplus -extern "C" { -#endif - -EOF - # Now generate the symbol file. - eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' - - cat <> 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 <&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 <&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 < -/* 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 <&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 < -/* 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 <&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 < -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 < -#endif - -#include - -#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 < -#endif - -#include - -#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 < "$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 , 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 < "$cfgfile" -# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. -# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) -EOF - ;; -esac - -cat <> "$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: diff --git a/pcre/ltmain.sh b/pcre/ltmain.sh deleted file mode 100644 index ab65054f..00000000 --- a/pcre/ltmain.sh +++ /dev/null @@ -1,4012 +0,0 @@ -# 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 , 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 <&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 -# #undef WIN32_LEAN_AND_MEAN -# #include -# -# #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 -# 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 /* for printf() */ -# #include /* for open(), lseek(), read() */ -# #include /* for O_RDONLY, O_BINARY */ -# #include /* 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&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 </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: diff --git a/pcre/maketables.c b/pcre/maketables.c deleted file mode 100644 index c0f06c03..00000000 --- a/pcre/maketables.c +++ /dev/null @@ -1,132 +0,0 @@ -/************************************************* -* 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 - - 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 */ diff --git a/pcre/pcre-config b/pcre/pcre-config deleted file mode 100644 index ac9ccfe9..00000000 --- a/pcre/pcre-config +++ /dev/null @@ -1,59 +0,0 @@ -#!/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 diff --git a/pcre/pcre-config.in b/pcre/pcre-config.in deleted file mode 100644 index 8daded9f..00000000 --- a/pcre/pcre-config.in +++ /dev/null @@ -1,59 +0,0 @@ -#!/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 diff --git a/pcre/pcre.c b/pcre/pcre.c deleted file mode 100644 index 5149f8da..00000000 --- a/pcre/pcre.c +++ /dev/null @@ -1,5151 +0,0 @@ -/************************************************* -* 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 - - 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 "); -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 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 */ diff --git a/pcre/pcre.def b/pcre/pcre.def deleted file mode 100644 index 0e8cf3f4..00000000 --- a/pcre/pcre.def +++ /dev/null @@ -1,19 +0,0 @@ -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 diff --git a/pcre/pcre.h b/pcre/pcre.h deleted file mode 100644 index d27ba859..00000000 --- a/pcre/pcre.h +++ /dev/null @@ -1,110 +0,0 @@ -/************************************************* -* 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 - -/* 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 */ diff --git a/pcre/pcre.in b/pcre/pcre.in deleted file mode 100644 index d698f403..00000000 --- a/pcre/pcre.in +++ /dev/null @@ -1,110 +0,0 @@ -/************************************************* -* 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 - -/* 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 */ diff --git a/pcre/pcregrep.c b/pcre/pcregrep.c deleted file mode 100644 index e8c934ef..00000000 --- a/pcre/pcregrep.c +++ /dev/null @@ -1,228 +0,0 @@ -/************************************************* -* pcregrep program * -*************************************************/ - -/* This is a grep program that uses the PCRE regular expression library to do -its pattern matching. */ - -#include -#include -#include -#include -#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)? "" : 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 */ diff --git a/pcre/pcreposix.c b/pcre/pcreposix.c deleted file mode 100644 index 519d2dd5..00000000 --- a/pcre/pcreposix.c +++ /dev/null @@ -1,280 +0,0 @@ -/************************************************* -* 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 - - 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 */ diff --git a/pcre/pcreposix.h b/pcre/pcreposix.h deleted file mode 100644 index 7660acbd..00000000 --- a/pcre/pcreposix.h +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************* -* 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 - -/* 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 */ diff --git a/pcre/pcretest.c b/pcre/pcretest.c deleted file mode 100644 index ee5df5f0..00000000 --- a/pcre/pcretest.c +++ /dev/null @@ -1,1225 +0,0 @@ -/************************************************* -* PCRE testing program * -*************************************************/ - -#include -#include -#include -#include -#include -#include - -/* 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] [ []]\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: \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 */ diff --git a/pcre/study.c b/pcre/study.c deleted file mode 100644 index 676db946..00000000 --- a/pcre/study.c +++ /dev/null @@ -1,397 +0,0 @@ -/************************************************* -* 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 - - 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 */ diff --git a/pcre/vc_dftables.dsp b/pcre/vc_dftables.dsp deleted file mode 100755 index a02add5b..00000000 --- a/pcre/vc_dftables.dsp +++ /dev/null @@ -1,296 +0,0 @@ -# Microsoft Developer Studio Project File - Name="vc_dftables" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 5.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=vc_dftables - Win32 Debug with Win32 threads -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "vc_dftables.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "vc_dftables.mak"\ - CFG="vc_dftables - Win32 Debug with Win32 threads" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "vc_dftables - Win32 Release" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "vc_dftables - Win32 Debug" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "vc_dftables - Win32 Debug with Win32 threads" (based on\ - "Win32 (x86) Console Application") -!MESSAGE "vc_dftables - Win32 Release with Win32 threads" (based on\ - "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "vc_dftables - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "vc_dftables" -# PROP Intermediate_Dir "vc_dftables" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x809 /d "NDEBUG" -# ADD RSC /l 0x809 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# 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 -# Begin Special Build Tool -OutDir=.\vc_dftables -SOURCE=$(InputPath) -PostBuild_Desc=Running program to generate chartables.c -PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c -# End Special Build Tool - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "vc_dftables_dbg" -# PROP Intermediate_Dir "vc_dftables_dbg" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x809 /d "_DEBUG" -# ADD RSC /l 0x809 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# 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 -# Begin Special Build Tool -OutDir=.\vc_dftables_dbg -SOURCE=$(InputPath) -PostBuild_Desc=Running program to generate chartables.c -PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c -# End Special Build Tool - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "vc_dftab" -# PROP BASE Intermediate_Dir "vc_dftab" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "vc_dftables_dbg" -# PROP Intermediate_Dir "vc_dftables_dbg" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x809 /d "_DEBUG" -# ADD RSC /l 0x809 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# 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 -# Begin Special Build Tool -OutDir=.\vc_dftables_dbg -SOURCE=$(InputPath) -PostBuild_Desc=Running program to generate chartables.c -PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c -# End Special Build Tool - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "vc_dfta0" -# PROP BASE Intermediate_Dir "vc_dfta0" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "vc_dftables" -# PROP Intermediate_Dir "vc_dftables" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x809 /d "NDEBUG" -# ADD RSC /l 0x809 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# 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 -# Begin Special Build Tool -OutDir=.\vc_dftables -SOURCE=$(InputPath) -PostBuild_Desc=Running program to generate chartables.c -PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c -# End Special Build Tool - -!ENDIF - -# Begin Target - -# Name "vc_dftables - Win32 Release" -# Name "vc_dftables - Win32 Debug" -# Name "vc_dftables - Win32 Debug with Win32 threads" -# Name "vc_dftables - Win32 Release with Win32 threads" -# Begin Group "File Copy" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\config.h.win - -!IF "$(CFG)" == "vc_dftables - Win32 Release" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Copying config.h.win -WkspDir=. -InputPath=..\config.h.win - -"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy "$(InputPath)" "$(WkspDir)\..\config.h" - -# End Custom Build - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Copying config.h.win -WkspDir=. -InputPath=..\config.h.win - -"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy "$(InputPath)" "$(WkspDir)\..\config.h" - -# End Custom Build - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads" - -# PROP Exclude_From_Build 1 -# PROP Ignore_Default_Tool 1 - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads" - -# PROP Exclude_From_Build 1 -# PROP Ignore_Default_Tool 1 - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\config.h.win32threads.win - -!IF "$(CFG)" == "vc_dftables - Win32 Release" - -# PROP Exclude_From_Build 1 -# PROP Ignore_Default_Tool 1 - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug" - -# PROP Exclude_From_Build 1 -# PROP Ignore_Default_Tool 1 - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Copying config.h.win32threads.win -WkspDir=. -InputPath=..\config.h.win32threads.win - -"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy "$(InputPath)" "$(WkspDir)\..\config.h" - -# End Custom Build - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads" - -# PROP Ignore_Default_Tool 1 -# Begin Custom Build - Copying config.h.win32threads.win -WkspDir=. -InputPath=..\config.h.win32threads.win - -"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" - copy "$(InputPath)" "$(WkspDir)\..\config.h" - -# End Custom Build - -!ENDIF - -# End Source File -# End Group -# Begin Source File - -SOURCE=..\config.h -# End Source File -# Begin Source File - -SOURCE=.\config.h -# End Source File -# Begin Source File - -SOURCE=.\dftables.c -# End Source File -# Begin Source File - -SOURCE=.\internal.h -# End Source File -# Begin Source File - -SOURCE=.\maketables.c - -!IF "$(CFG)" == "vc_dftables - Win32 Release" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=.\pcre.h -# End Source File -# End Target -# End Project diff --git a/pcrs.c b/pcrs.c index 45a471b9..033268a7 100644 --- a/pcrs.c +++ b/pcrs.c @@ -1,83 +1,52 @@ -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 - * 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 * * * 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 @@ -98,12 +67,33 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $"; * - Removed create_pcrs_job() which was useless * - Fixed a bug in pcrs_execute * - Success flag is now handled by pcrs instead of user + * - Removed logentry from cancelled commit * * Revision 1.6 2001/06/03 19:12:45 oes * added FIXME * * Revision 1.5 2001/05/29 09:50:24 jongfoster - * (Fixed one int -> size_t) + * Unified blocklist/imagelist/permissionslist. + * File format is still under discussion, but the internal changes + * are (mostly) done. + * + * Also modified interceptor behaviour: + * - We now intercept all URLs beginning with one of the following + * prefixes (and *only* these prefixes): + * * http://i.j.b/ + * * http://ijbswa.sf.net/config/ + * * http://ijbswa.sourceforge.net/config/ + * - New interceptors "home page" - go to http://i.j.b/ to see it. + * - Internal changes so that intercepted and fast redirect pages + * are not replaced with an image. + * - Interceptors now have the option to send a binary page direct + * to the client. (i.e. ijb-send-banner uses this) + * - Implemented show-url-info interceptor. (Which is why I needed + * the above interceptors changes - a typical URL is + * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif". + * The previous mechanism would not have intercepted that, and + * if it had been intercepted then it then it would have replaced + * it with an image.) * * Revision 1.4 2001/05/25 14:12:40 oes * Fixed bug: Empty substitutes now detected @@ -113,12 +103,48 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $"; * * Revision 1.2 2001/05/22 18:46:04 oes * - * Added support for PCRE_UNGREEDY behaviour to pcrs, + * - Enabled filtering banners by size rather than URL + * by adding patterns that replace all standard banner + * sizes with the "Junkbuster" gif to the re_filterfile + * + * - Enabled filtering WebBugs by providing a pattern + * which kills all 1x1 images + * + * - Added support for PCRE_UNGREEDY behaviour to pcrs, * which is selected by the (nonstandard and therefore * capital) letter 'U' in the option string. * It causes the quantifiers to be ungreedy by default. * Appending a ? turns back to greedy (!). * + * - Added a new interceptor ijb-send-banner, which + * sends back the "Junkbuster" gif. Without imagelist or + * MSIE detection support, or if tinygif = 1, or the + * URL isn't recognized as an imageurl, a lame HTML + * explanation is sent instead. + * + * - Added new feature, which permits blocking remote + * script redirects and firing back a local redirect + * to the browser. + * The feature is conditionally compiled, i.e. it + * can be disabled with --disable-fast-redirects, + * plus it must be activated by a "fast-redirects" + * line in the config file, has its own log level + * and of course wants to be displayed by show-proxy-args + * Note: Boy, all the #ifdefs in 1001 locations and + * all the fumbling with configure.in and acconfig.h + * were *way* more work than the feature itself :-( + * + * - Because a generic redirect template was needed for + * this, tinygif = 3 now uses the same. + * + * - Moved GIFs, and other static HTTP response templates + * to project.h + * + * - Some minor fixes + * + * - Removed some >400 CRs again (Jon, you really worked + * a lot! ;-) + * * Revision 1.1.1.1 2001/05/15 13:59:02 oes * Initial import of version 2.9.3 source tree * @@ -128,71 +154,13 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $"; #include #include -#include - #include "pcrs.h" - const char pcrs_h_rcs[] = PCRS_H_VERSION; -/* - * Internal prototypes - */ - -static int pcrs_parse_perl_options(const char *optstring, int *flags); -static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, - int capturecount, int *errptr); /********************************************************************* * - * Function : pcrs_strerror - * - * Description : Return a string describing a given error code. - * - * Parameters : - * 1 : error = the error code - * - * Returns : char * to the descriptive string - * - *********************************************************************/ -const char *pcrs_strerror(const int error) -{ - if (error < 0) - { - switch (error) - { - /* Passed-through PCRE error: */ - case PCRE_ERROR_NOMEMORY: return "(pcre:) No memory"; - - /* Shouldn't happen unless PCRE or PCRS bug, or user messed with compiled job: */ - case PCRE_ERROR_NULL: return "(pcre:) NULL code or subject or ovector"; - case PCRE_ERROR_BADOPTION: return "(pcre:) Unrecognized option bit"; - case PCRE_ERROR_BADMAGIC: return "(pcre:) Bad magic number in code"; - case PCRE_ERROR_UNKNOWN_NODE: return "(pcre:) Bad node in pattern"; - - /* Can't happen / not passed: */ - case PCRE_ERROR_NOSUBSTRING: return "(pcre:) Fire in power supply"; - case PCRE_ERROR_NOMATCH: return "(pcre:) Water in power supply"; - - /* PCRS errors: */ - case PCRS_ERR_NOMEM: return "(pcrs:) No memory"; - case PCRS_ERR_CMDSYNTAX: return "(pcrs:) Syntax error while parsing command"; - case PCRS_ERR_STUDY: return "(pcrs:) PCRE error while studying the pattern"; - case PCRS_ERR_BADJOB: return "(pcrs:) Bad job - NULL job, pattern or substitute"; - case PCRS_WARN_BADREF: return "(pcrs:) Backreference out of range"; - - /* What's that? */ - default: return "Unknown error"; - } - } - /* error >= 0: No error */ - return "(pcrs:) Everything's just fine. Thanks for asking."; - -} - - -/********************************************************************* - * - * Function : pcrs_parse_perl_options + * Function : pcrs_compile_perl_options * * Description : This function parses a string containing the options to * Perl's s/// operator. It returns an integer that is the @@ -209,19 +177,16 @@ const char *pcrs_strerror(const int error) * Returns : option integer suitable for pcre * *********************************************************************/ -static int pcrs_parse_perl_options(const char *optstring, int *flags) +int pcrs_compile_perl_options(char *optstring, int *flags) { size_t i; int rc = 0; *flags = 0; - - if (NULL == optstring) return 0; - - for (i = 0; i < strlen(optstring); i++) + for (i=0; i < strlen(optstring); i++) { switch(optstring[i]) { - case 'e': break; /* ToDo ;-) */ + case 'e': break; case 'g': *flags |= PCRS_GLOBAL; break; case 'i': rc |= PCRE_CASELESS; break; case 'm': rc |= PCRE_MULTILINE; break; @@ -229,8 +194,8 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags) case 's': rc |= PCRE_DOTALL; break; case 'x': rc |= PCRE_EXTENDED; break; case 'U': rc |= PCRE_UNGREEDY; break; - case 'T': *flags |= PCRS_TRIVIAL; break; - default: break; + case 'T': *flags |= PCRS_TRIVIAL; break; + default: break; } } return rc; @@ -250,11 +215,7 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags) * Parameters : * 1 : replacement = replacement part of s/// operator * in perl syntax - * 2 : trivialflag = Flag that causes backreferences to be - * ignored. - * 3 : capturecount = Number of capturing subpatterns in - * the pattern. Needed for $+ handling. - * 4 : errptr = pointer to an integer in which error + * 2 : errptr = pointer to an integer in which error * conditions can be returned. * * Returns : pcrs_substitute data structure, or NULL if an @@ -262,178 +223,89 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags) * the reason. * *********************************************************************/ -static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, int capturecount, int *errptr) +pcrs_substitute *pcrs_compile_replacement(char *replacement, int trivialflag, int *errptr) { - int i, k, l, quoted; - size_t length; - char *text; + int length, i, k = 0, l = 0, quoted = 0, idx; + char *text, *num_ptr, *numbers = "0123456789"; pcrs_substitute *r; - i = k = l = quoted = 0; - - /* - * Sanity check - */ - if (NULL == replacement) - { - replacement = ""; - } + r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute)); + if (r == NULL) return NULL; + memset(r, '\0', sizeof(pcrs_substitute)); - /* - * Get memory or fail - */ - if (NULL == (r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute)))) + text = strdup(replacement); /* must be free()d by caller */ + if (text == NULL) { *errptr = PCRS_ERR_NOMEM; + free(r); return NULL; } - memset(r, '\0', sizeof(pcrs_substitute)); length = strlen(replacement); - if (NULL == (text = (char *)malloc(length + 1))) - { - free(r); - *errptr = PCRS_ERR_NOMEM; - return NULL; - } - memset(text, '\0', length + 1); - - - /* - * In trivial mode, just copy the substitute text - */ if (trivialflag) { - text = strncpy(text, replacement, length + 1); - k = length; + k = length; } - - /* - * Else, parse, cut out and record all backreferences - */ else { - while (i < (int)length) + for (i=0; i < length; i++) { - /* Quoting */ + /* Backslash treatment */ if (replacement[i] == '\\') { if (quoted) { - text[k++] = replacement[i++]; + text[k++] = replacement[i]; quoted = 0; } else { - if (replacement[i+1] && strchr("tnrfae0", replacement[i+1])) - { - switch (replacement[++i]) - { - case 't': - text[k++] = '\t'; - break; - case 'n': - text[k++] = '\n'; - break; - case 'r': - text[k++] = '\r'; - break; - case 'f': - text[k++] = '\f'; - break; - case 'a': - text[k++] = 7; - break; - case 'e': - text[k++] = 27; - break; - case '0': - text[k++] = '\0'; - break; - } - i++; - } - else - { - quoted = 1; - i++; - } + quoted = 1; } continue; } - /* Backreferences */ - if (replacement[i] == '$' && !quoted && i < (int)(length - 1)) + /* Dollar treatment */ + if (replacement[i] == '$' && !quoted && i < length - 1) { - char *symbol, symbols[] = "'`+&"; - r->block_length[l] = k - r->block_offset[l]; - - /* Numerical backreferences */ - if (isdigit((int)replacement[i + 1])) + if (strchr("0123456789&", replacement[i + 1]) == NULL) { - while (i < (int)length && isdigit((int)replacement[++i])) - { - r->backref[l] = r->backref[l] * 10 + replacement[i] - 48; - } - if (r->backref[l] > capturecount) - { - *errptr = PCRS_WARN_BADREF; - } + text[k++] = replacement[i]; } - - /* Symbolic backreferences: */ - else if (NULL != (symbol = strchr(symbols, replacement[i + 1]))) + else { - - if (symbol - symbols == 2) /* $+ */ + r->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; } @@ -444,7 +316,8 @@ plainchar: * Function : pcrs_free_job * * Description : Frees the memory used by a pcrs_job struct and its - * dependant structures. + * dependant structures. Returns a pointer to the next + * job, if there was any, or NULL otherwise. * * Parameters : * 1 : job = pointer to the pcrs_job structure to be freed @@ -477,7 +350,6 @@ pcrs_job *pcrs_free_job(pcrs_job *job) } - /********************************************************************* * * Function : pcrs_free_joblist @@ -503,12 +375,11 @@ void pcrs_free_joblist(pcrs_job *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 @@ -520,16 +391,15 @@ void pcrs_free_joblist(pcrs_job *joblist) * has the reason. * *********************************************************************/ -pcrs_job *pcrs_compile_command(const char *command, int *errptr) +pcrs_job *pcrs_compile(char *command, int *errptr) { - int i, k, l, quoted = FALSE; - size_t limit; + int i, k, l, limit, quoted = FALSE; char delimiter; char *tokens[4]; pcrs_job *newjob; - + i = k = l = 0; - + /* * Tokenize the perl command */ @@ -541,38 +411,36 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr) } else { - delimiter = command[1]; + delimiter = command[1]; } tokens[l] = (char *) malloc(limit + 1); - for (i = 0; i <= (int)limit; i++) + for (i=0; i <= limit; i++) { - + if (command[i] == delimiter && !quoted) { - if (l == 3) - { - l = -1; + if (l == 3) + { + l = -1; break; } - tokens[0][k++] = '\0'; + tokens[0][k++] = '\0'; tokens[++l] = tokens[0] + k; continue; } - - else if (command[i] == '\\' && !quoted) + + else if (command[i] == '\\' && !quoted && i+1 < limit && command[i+1] == delimiter) { quoted = TRUE; - if (command[i+1] == delimiter) continue; - } - else - { - quoted = FALSE; + continue; } tokens[0][k++] = command[i]; + quoted = FALSE; } + /* * Syntax error ? */ @@ -582,17 +450,17 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr) free(tokens[0]); return NULL; } - - newjob = pcrs_compile(tokens[1], tokens[2], tokens[3], errptr); + + 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. @@ -609,21 +477,18 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr) * has the reason. * *********************************************************************/ -pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr) +pcrs_job *pcrs_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 @@ -639,7 +504,7 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char * /* * Evaluate the options */ - newjob->options = pcrs_parse_perl_options(options, &flags); + newjob->options = pcrs_compile_perl_options(options, &flags); newjob->flags = flags; @@ -667,21 +532,10 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char * } - /* - * Determine the number of capturing subpatterns. - * This is needed for handling $+ in the substitute. - */ - if (0 > (*errptr = pcre_fullinfo(newjob->pattern, newjob->hints, PCRE_INFO_CAPTURECOUNT, &capturecount))) - { - pcrs_free_job(newjob); - return NULL; - } - - /* * Compile the substitute */ - if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, capturecount, errptr))) + if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, errptr))) { pcrs_free_job(newjob); return NULL; @@ -692,73 +546,16 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char * } -/********************************************************************* - * - * Function : pcrs_execute_list - * - * Description : This is a multiple job wrapper for pcrs_execute(). - * Apply the regular substitutions defined by the jobs in - * the joblist to the subject. - * The subject itself is left untouched, memory for the result - * is malloc()ed and it is the caller's responsibility to free - * the result when it's no longer needed. - * - * Parameters : - * 1 : joblist = the chained list of pcrs_jobs to be executed - * 2 : subject = the subject string - * 3 : subject_length = the subject's length - * INCLUDING the terminating zero, if string! - * 4 : result = char** for returning the result - * 5 : result_length = size_t* for returning the result's length - * - * Returns : On success, the number of substitutions that were made. - * May be > 1 if job->flags contained PCRS_GLOBAL - * On failiure, the (negative) pcre error code describing the - * failiure, which may be translated to text using pcrs_strerror(). - * - *********************************************************************/ -int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, char **result, size_t *result_length) -{ - pcrs_job *job; - char *old, *new; - int hits, total_hits; - - old = subject; - *result_length = subject_length; - hits = total_hits = 0; - - for (job = joblist; job != NULL; job = job->next) - { - hits = pcrs_execute(job, old, *result_length, &new, result_length); - - if (old != subject) free(old); - - if (hits < 0) - { - return(hits); - } - else - { - total_hits += hits; - old = new; - } - } - - *result = new; - return(total_hits); - -} - - /********************************************************************* * * Function : pcrs_execute * - * Description : Apply the regular substitution defined by the job to the - * subject. - * The subject itself is left untouched, memory for the result - * is malloc()ed and it is the caller's responsibility to free - * the result when it's no longer needed. + * Description : Modify the subject by executing the regular substitution + * defined by the job. Since the result may be longer than + * the subject, its space requirements are precalculated in + * the matching phase and new memory is allocated accordingly. + * It is the caller's responsibility to free the result when + * it's no longer needed. * * Parameters : * 1 : job = the pcrs_job to be executed @@ -766,30 +563,26 @@ int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c * 3 : subject_length = the subject's length * INCLUDING the terminating zero, if string! * 4 : result = char** for returning the result - * 5 : result_length = size_t* for returning the result's length + * 5 : result_length = int* for returning the result's length * - * Returns : On success, the number of substitutions that were made. - * May be > 1 if job->flags contained PCRS_GLOBAL - * On failiure, the (negative) pcre error code describing the - * failiure, which may be translated to text using pcrs_strerror(). + * Returns : the number of substitutions that were made. May be > 1 + * if job->flags contained PCRS_GLOBAL * *********************************************************************/ -int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length) +int pcrs_execute(pcrs_job *job, char *subject, int subject_length, char **result, int *result_length) { int offsets[3 * PCRS_MAX_SUBMATCHES], - offset, - i, k, + offset, i, k, matches_found, - submatches, - max_matches = PCRS_MAX_MATCH_INIT; - size_t newsize; - pcrs_match *matches, *dummy; + newsize, + submatches; + pcrs_match matches[PCRS_MAX_MATCHES]; char *result_offset; offset = i = k = 0; /* - * Sanity check & memory allocation + * Sanity check */ if (job == NULL || job->pattern == NULL || job->substitute == NULL) { @@ -797,26 +590,18 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res return(PCRS_ERR_BADJOB); } - if (NULL == (matches = (pcrs_match *)malloc(max_matches * sizeof(pcrs_match)))) - { - *result = NULL; - return(PCRS_ERR_NOMEM); - } - memset(matches, '\0', max_matches * sizeof(pcrs_match)); - - + /* * Find the pattern and calculate the space - * requirements for the result + * requirements for the result (newsize) */ - newsize = subject_length; + newsize=subject_length; - while ((submatches = pcre_exec(job->pattern, job->hints, subject, (int)subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0) + while ((submatches = pcre_exec(job->pattern, job->hints, subject, subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0) { job->flags |= PCRS_SUCCESS; matches[i].submatches = submatches; - - for (k = 0; k < submatches; k++) + for (k=0; k < submatches; k++) { matches[i].submatch_offset[k] = offsets[2 * k]; @@ -829,35 +614,12 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res /* plus replacement text size minus match text size */ newsize += strlen(job->substitute->text) - matches[i].submatch_length[0]; - /* chunk before match */ - matches[i].submatch_offset[PCRS_MAX_SUBMATCHES] = 0; - matches[i].submatch_length[PCRS_MAX_SUBMATCHES] = offsets[0]; - newsize += offsets[0] * job->substitute->backref_count[PCRS_MAX_SUBMATCHES]; - - /* chunk after match */ - matches[i].submatch_offset[PCRS_MAX_SUBMATCHES + 1] = offsets[1]; - matches[i].submatch_length[PCRS_MAX_SUBMATCHES + 1] = subject_length - offsets[1] - 1; - newsize += (subject_length - offsets[1]) * job->substitute->backref_count[PCRS_MAX_SUBMATCHES + 1]; - - /* Storage for matches exhausted? -> Extend! */ - if (++i >= max_matches) - { - max_matches = (int)(max_matches * PCRS_MAX_MATCH_GROW); - if (NULL == (dummy = (pcrs_match *)realloc(matches, max_matches * sizeof(pcrs_match)))) - { - free(matches); - *result = NULL; - return(PCRS_ERR_NOMEM); - } - matches = dummy; - } - /* Non-global search or limit reached? */ - if (!(job->flags & PCRS_GLOBAL)) break; + if (++i >= PCRS_MAX_MATCHES || !(job->flags & PCRS_GLOBAL) ) break; /* Don't loop on empty matches */ if (offsets[1] == offset) - if ((size_t)offset < subject_length) + if (offset < subject_length) offset++; else break; @@ -865,12 +627,8 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res else offset = offsets[1]; } - /* Pass pcre error through if (bad) failiure */ - if (submatches < PCRE_ERROR_NOMATCH) - { - free(matches); - return submatches; - } + /* Pass pcre error through if failiure*/ + if (submatches < -1) return submatches; matches_found = i; @@ -879,7 +637,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res */ if ((*result = (char *)malloc(newsize)) == NULL) /* must be free()d by caller */ { - free(matches); return PCRS_ERR_NOMEM; } @@ -890,27 +647,27 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res offset = 0; result_offset = *result; - for (i = 0; i < matches_found; i++) + for (i=0; i < matches_found; i++) { /* copy the chunk preceding the match */ - memcpy(result_offset, subject + offset, (size_t)matches[i].submatch_offset[0] - offset); + memcpy(result_offset, subject + offset, matches[i].submatch_offset[0] - offset); result_offset += matches[i].submatch_offset[0] - offset; /* For every segment of the substitute.. */ - for (k = 0; k <= job->substitute->backrefs; k++) + for (k=0; k <= job->substitute->backrefs; k++) { /* ...copy its text.. */ memcpy(result_offset, job->substitute->text + job->substitute->block_offset[k], job->substitute->block_length[k]); 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]], @@ -926,7 +683,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res memcpy(result_offset, subject + offset, subject_length - offset); *result_length = newsize; - free(matches); return matches_found; } diff --git a/pcrs.h b/pcrs.h index a14b8165..6b635fb4 100644 --- a/pcrs.h +++ b/pcrs.h @@ -1,41 +1,31 @@ -#ifndef PCRS_H_INCLUDED -#define PCRS_H_INCLUDED +#ifndef _PCRS_H +#define _PCRS_H /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/pcrs.h,v $ * - * Purpose : Header file for pcrs.c + * Purpose : This is the pre-pre-alpha realease of libpcrs. It is only + * published at this (ugly) stage of development, because it is + * needed for a new feature in JunkBuster. * - * Copyright : see pcrs.c + * Apart from the code being quite a mess, no inconsistencies, + * memory leaks or functional bugs **should** be present. * - * Revisions : - * $Log: pcrs.h,v $ - * Revision 1.10 2002/03/08 13:44:48 oes - * Hiding internal functions, preventing double inclusion of pcre.h - * - * Revision 1.9 2001/08/18 11:35:29 oes - * - Introduced pcrs_strerror() - * - added pcrs_execute_list() - * - * 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 * @@ -59,16 +49,10 @@ * *********************************************************************/ -#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 $" -#ifndef _PCRE_H #include -#endif - -#ifdef __cplusplus -extern "C" { -#endif /* * Constants: @@ -78,88 +62,68 @@ extern "C" { #define TRUE 1 /* Capacity */ -#define PCRS_MAX_SUBMATCHES 33 /* Maximum number of capturing subpatterns allowed. MUST be <= 99! FIXME: Should be dynamic */ -#define PCRS_MAX_MATCH_INIT 40 /* Initial amount of matches that can be stored in global searches */ -#define PCRS_MAX_MATCH_GROW 1.6 /* Factor by which storage for matches is extended if exhausted */ +#define PCRS_MAX_MATCHES 300 +#define PCRS_MAX_SUBMATCHES 33 /* Error codes */ #define PCRS_ERR_NOMEM -10 /* Failed to acquire memory. */ #define PCRS_ERR_CMDSYNTAX -11 /* Syntax of s///-command */ #define PCRS_ERR_STUDY -12 /* pcre error while studying the pattern */ #define PCRS_ERR_BADJOB -13 /* NULL job pointer, pattern or substitute */ -#define PCRS_WARN_BADREF -14 /* Backreference out of range */ /* Flags */ #define PCRS_GLOBAL 1 /* Job should be applied globally, as with perl's g option */ -#define PCRS_TRIVIAL 2 /* Backreferences in the substitute are ignored */ -#define PCRS_SUCCESS 4 /* Job did previously match */ - +#define PCRS_SUCCESS 2 /* Job did previously match */ +#define PCRS_TRIVIAL 4 /* 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: diff --git a/privoxy-rh.spec b/privoxy-rh.spec deleted file mode 100644 index 87c0810f..00000000 --- a/privoxy-rh.spec +++ /dev/null @@ -1,778 +0,0 @@ -# $Id: privoxy-rh.spec,v 1.16 2002/03/26 22:29:55 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# Defines should happen in the begining of the file -%define veryoldname junkbust -%define oldname junkbuster -%define privoxyconf %{_sysconfdir}/%{name} - -Name: privoxy -# ATTENTION -# Version and release should be updated acordingly on configure.in and -# configure. Otherwise, the package can be build with the wrong value -Version: 2.9.13 -Release: 3 -Summary: Privoxy - privacy enhancing proxy -License: GPL -Vendor: http://www.privoxy.org -Source0: http://www.waldherr.org/%{name}/%{name}-%{version}.tar.gz -BuildRoot: %{_tmppath}/%{name}-%{version}-root -Group: Networking/Utilities -URL: http://www.privoxy.org/ -Obsoletes: junkbuster-raw junkbuster-blank junkbuster -# Prereq: /usr/sbin/useradd , /sbin/chkconfig , /sbin/service -Prereq: shadow-utils, chkconfig, initscripts, sh-utils -BuildRequires: perl gzip sed docbook-utils libtool autoconf -Conflicts: junkbuster-raw junkbuster-blank junkbuster - -%description -Privoxy is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other -obnoxious Internet junk. Privoxy has a very flexible configuration and -can be customized to suit individual needs and tastes. Privoxy has application -for both stand-alone systems and multi-user networks. - -Privoxy is based on the code of the Internet Junkbuster. Junkbuster -was originally written by JunkBusters Corporation, and was released as -free open-source software under the GNU GPL. Stefan Waldherr made many -improvements, and started the SourceForge project to continue -development. Several other developers are now contributing. - -%prep -%setup -q -c - -%build -autoheader -autoconf -%configure -make -make redhat-dok - -## Explicitily stripping is not recomended. -## This is handled altomaticaly by RPM, and can couse troubles if -## anyone wants to build an unstriped version - morcego -#strip %{name} - -%install -[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} -mkdir -p %{buildroot}%{_sbindir} \ - %{buildroot}%{_mandir}/man1 \ - %{buildroot}%{_localstatedir}/log/%{name} \ - %{buildroot}%{privoxyconf}/templates \ - %{buildroot}%{_sysconfdir}/logrotate.d \ - %{buildroot}%{_sysconfdir}/rc.d/init.d - -## Manual gziping of manpages should not be done, once it can -## break the building on some distributions. Anyway, rpm does it -## automagicaly these days -## Gziping the documentation files is not recomended - morcego -#gzip README AUTHORS ChangeLog %{name}.1 || /bin/true - -install -s -m 744 %{name} %{buildroot}%{_sbindir}/%{name} - -cp -f %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 -cp -f *.action %{buildroot}%{privoxyconf}/ -cp -f default.filter %{buildroot}%{privoxyconf}/default.filter -cp -f trust %{buildroot}%{privoxyconf}/trust -cp -f templates/* %{buildroot}%{privoxyconf}/templates/ -cp -f %{name}.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name} -install -m 755 %{name}.init %{buildroot}%{_sysconfdir}/rc.d/init.d/%{name} -install -m 711 -d %{buildroot}%{_localstatedir}/log/%{name} - -# verify all file locations, etc. in the config file -# don't start with ^ or commented lines are not replaced -## Changing the sed paramter delimiter to @, so we don't have to -## escape the slashes -cat config | \ - sed 's@^confdir.*@confdir %{privoxyconf}@g' | \ -# sed 's/^permissionsfile.*/permissionsfile \/etc\/%{name}\/permissionsfile/g' | \ -# sed 's/^filterfile.*/default.filter \/etc\/%{name}\/default.filter/g' | \ -# sed 's/^logfile.*/logfile \%{_localstatedir}\/log\/%{name}\/logfile/g' | \ -# sed 's/^jarfile.*/jarfile \%{_localstatedir}\/log\/%{name}\/jarfile/g' | \ -# sed 's/^forward.*/forward \/etc\/%{name}\/forward/g' | \ -# sed 's/^aclfile.*/aclfile \/etc\/%{name}\/aclfile/g' > \ - sed 's@^logdir.*@logdir %{_localstatedir}/log/%{name}@g' > \ - %{buildroot}%{privoxyconf}/config -perl -pe 's/{-no-cookies}/{-no-cookies}\n\.redhat.com/' default.action >\ - %{buildroot}%{privoxyconf}/default.action - - -# Creating ghost init files -mkdir -p %{buildroot}/%{_sysconfdir}/rc.d/rc{0,1,2,3,4,5,6}.d -for i in 0 1 4 6 -do -ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/K09%{name} -done -for i in 2 3 5 -do -ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/S84%{name} -done - -## Macros are expanded even on commentaries. So, we have to use %% -## -- morcego -#%%makeinstall - -%pre -# This is where we handle old usernames (junkbust and junkbuster) -# I'm not sure we should do that, but this is the way we have been -# doing it for some time now -- morcego -# We should do it for the group as well -- morcego -# Doing it by brute force. Much cleaner (no more Mr. Nice Guy) -- morcego - -# Change the group name. Remove anything left behind. -groupmod -n %{name} %{oldname} > /dev/null 2>&1 ||: -groupmod -n %{name} %{veryoldname} > /dev/null 2>&1 ||: -groupdel %{oldname} > /dev/null 2>&1 ||: -groupdel %{veryoldname} > /dev/null 2>&1 ||: - -# Same for username -usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{oldname} > /dev/null 2>&1 || : -usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{veryoldname} > /dev/null 2>&1 || : -userdel %{oldname} > /dev/null 2>&1 ||: -userdel %{veryoldname} > /dev/null 2>&1 ||: - -# Check to see if everything is okey. Create user if it still does not -# exist -id %{name} > /dev/null 2>&1 -if [ $? -eq 1 ]; then - /usr/sbin/useradd -d %{_sysconfdir}/%{name} -r -s "" %{name} > /dev/null 2>&1 -fi - -%post -# for upgrade from 2.0.x -[ -f %{_localstatedir}/log/%{oldname}/logfile ] &&\ - mv -f %{_localstatedir}/log/%{oldname}/logfile %{_localstatedir}/log/%{name}/logfile || /bin/true -[ -f %{_localstatedir}/log/%{name}/%{name} ] &&\ - mv -f %{_localstatedir}/log/%{name}/%{name} %{_localstatedir}/log/%{name}/logfile || /bin/true -chown -R %{name}:%{name} %{_localstatedir}/log/%{name} 2>/dev/null -chown -R %{name}:%{name} /etc/%{name} 2>/dev/null -if [ "$1" = "1" ]; then - /sbin/service %{name} condrestart > /dev/null 2>&1 -fi - -%preun -/sbin/service %{veryoldname} stop > /dev/null 2>&1 ||: -/sbin/service %{oldname} stop > /dev/null 2>&1 ||: - -if [ "$1" = "0" ]; then - /sbin/service %{name} stop > /dev/null 2>&1 ||: - # No need to use chkconfig. The %%ghost files will handle it -fi - -%postun -#if [ "$1" -ge "1" ]; then -# /sbin/service %{name} condrestart > /dev/null 2>&1 -#fi -# We only remove it we this is not an upgrade -if [ "$1" = "0" ]; then - id privoxy > /dev/null 2>&1 && /usr/sbin/userdel privoxy || /bin/true -fi - -%clean -[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} - -%files -%defattr(0644,root,root,0755) -%doc README AUTHORS ChangeLog -%doc doc/text/developer-manual.txt doc/text/user-manual.txt -%doc doc/webserver/developer-manual -%doc doc/webserver/user-manual -%doc doc/webserver/faq -%doc doc/webserver/ijb_docs.css - -%dir %{privoxyconf} -%dir %{privoxyconf}/templates -%attr(0744,%{name},%{name}) %dir %{_localstatedir}/log/%{name} - -%attr(0744,%{name},%{name})%{_sbindir}/%{name} - -# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! -# We should not use wildchars here. This could mask missing files problems -# -- morcego -# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! -%config %{privoxyconf}/config -%config %{privoxyconf}/advanced.action -%config %{privoxyconf}/basic.action -%config %{privoxyconf}/intermediate.action -%config %{privoxyconf}/default.action -%config %{privoxyconf}/default.filter -%config %{privoxyconf}/trust - -%config %{privoxyconf}/templates/blocked -%config %{privoxyconf}/templates/blocked-compact -%config %{privoxyconf}/templates/cgi-error-404 -%config %{privoxyconf}/templates/cgi-error-bad-param -%config %{privoxyconf}/templates/cgi-error-disabled -%config %{privoxyconf}/templates/cgi-error-file -%config %{privoxyconf}/templates/cgi-error-modified -%config %{privoxyconf}/templates/cgi-error-parse -%config %{privoxyconf}/templates/connect-failed -%config %{privoxyconf}/templates/default -%config %{privoxyconf}/templates/edit-actions-add-url-form -%config %{privoxyconf}/templates/edit-actions-for-url -%config %{privoxyconf}/templates/edit-actions-list -%config %{privoxyconf}/templates/edit-actions-list-section -%config %{privoxyconf}/templates/edit-actions-list-url -%config %{privoxyconf}/templates/edit-actions-remove-url-form -%config %{privoxyconf}/templates/edit-actions-url-form -%config %{privoxyconf}/templates/no-such-domain -%config %{privoxyconf}/templates/show-request -%config %{privoxyconf}/templates/show-status -%config %{privoxyconf}/templates/show-status-file -%config %{privoxyconf}/templates/show-url-info -%config %{privoxyconf}/templates/show-version -%config %{privoxyconf}/templates/toggle -%config %{privoxyconf}/templates/toggle-mini -%config %{privoxyconf}/templates/untrusted -%config %{privoxyconf}/templates/edit-actions-for-url-filter -%config %{_sysconfdir}/logrotate.d/%{name} -%config %attr(0744,root,root) %{_sysconfdir}/rc.d/init.d/%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc0.d/K09%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc1.d/K09%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc2.d/S84%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc3.d/S84%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc4.d/K09%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc5.d/S84%{name} -%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc6.d/K09%{name} - -%{_mandir}/man1/%{name}.* - -%changelog -* Tue Mar 25 2002 Hal Burgiss -+ privoxy-2.9.13-3 -- Fix typo in Description. - -* Tue Mar 26 2002 Rodrigo Barbosa -+ privoxy-2.9.13-3 -- Added commentary asking to update the release value on the configure - script - -* Tue Mar 25 2002 Hal Burgiss -+ privoxy-2.9.13-3 -- Added the missing edit-actions-for-url-filter to templates. - -* Mon Mar 25 2002 Rodrigo Barbosa -+ privoxy-2.9.13-2 -- Fixing Release number - -* Sun Mar 24 2002 Hal Burgiss -+ privoxy-2.9.13-2 -- Added faq to docs. - -* Sun Mar 24 2002 Rodrigo Barbosa -+ 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 -+ junkbusterng-2.9.13-1 - Added autoheader. Added autoconf to buildrequires. - -* Sun Mar 24 2002 Hal Burgiss -+ 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 -+ 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 -- added ijb_docs.css to docs. - -* Mon Mar 11 2002 Hal Burgiss -+ junkbuster-2.9.11-8 -- Take out --enable-no-gifs, breaks some browsers. - -* Sun Mar 10 2002 Hal Burgiss -+ junkbuster-2.9.11-8 -- Add --enable-no-gifs to configure. - -* Fri Mar 08 2002 Rodrigo Barbosa -+ junkbuster-2.9.11-7 -- Added BuildRequires to libtool. - -* Tue Mar 06 2002 Rodrigo Barbosa -+ 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 -+ junkbuster-2.9.11-5 -- Added "make redhat-dok" to the build process -- Added docbook-utils to BuildRequires - -* Tue Mar 05 2002 Rodrigo Barbosa -+ 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 -+ junkbuster-2.9.11-3 -- Fixing permissions of the init script - -* Mon Mar 04 2002 Rodrigo Barbosa -+ 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 -- /bin/false for shell causes init script to fail. Reverting. - -* Wed Jan 09 2002 Hal Burgiss -- 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 -- add paranoia check for 'rm -rf %%{buildroot}' -- add gzip to 'BuildRequires' - -* Sat Dec 1 2001 Hal Burgiss -- actionsfile is now ijb.action. - -* Tue Nov 6 2001 Thomas Steudten -- Compress manpage -- Add more documents for installation -- Add version string to name and source - -* Wed Oct 24 2001 Hal Burigss -- Back to user 'junkbuster' and fix configure macro. - -* Wed Oct 10 2001 Hal Burigss -- More changes for user 'junkbust'. Init script had 'junkbuster'. - -* Sun Sep 23 2001 Hal Burgiss -- 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 -- 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 -- rework of RPM - -* Mon Sep 25 2000 Stefan Waldherr -- CLF Logging patch by davep@cyw.uklinux.net -- Hal DeVore fix akamaitech in blocklist - -* Sun Sep 17 2000 Stefan Waldherr -- 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 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" : 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 - Andrew 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 - 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 - Blank images are no longer cached, thanks to a hint from Markus - Breitenbach . 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 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 - . 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 - %%{_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 - Configure blank version via config file. No separate blank - version anymore. Added Roland's - patch to show a logo instead of a blank area. Added a suggestion - from Alex : %%{_localstatedir}/lock/subsys/junkbuster. - More regexps in the blocklist. Prepared the forwardfile for - squid. Extended image regexp with help from gabriel - . - -* Thu Nov 19 1998 Stefan Waldherr - 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 - 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 - Modified the blocking feature, so that only GIFs and JPEGs are - blocked and replaced but not HTML pages. Thanks to - "Gerd Flender" 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 - Moved config files to /etc/junkbuster directory, moved man page, - added BuildRoot directive (Thanks to Alexey Nogin ) - 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 -# + junkbuster-2.9.11-2 -# - General specfile fixup, using the best recomended practices, including: -# - Adding -q to %%setup -# - Using macros whereever possible -# - Not using wildchars on %%files section -# - Doubling the percentage char on changelog and comments, to -# avoid rpm expanding them -# -# Revision 1.29 2002/03/03 19:21:22 hal9 -# Init script fails if shell is /bin/false. -# -# Revision 1.28 2002/01/09 18:34:03 hal9 -# nit. -# -# Revision 1.27 2002/01/09 18:32:02 hal9 -# Removed RPM_OPT_FLAGS kludge. -# -# Revision 1.26 2002/01/09 18:21:10 hal9 -# A few minor updates. -# -# Revision 1.25 2001/12/28 01:45:36 steudten -# Add paranoia check and BuildReq: gzip -# -# Revision 1.24 2001/12/01 21:43:14 hal9 -# Allowed for new ijb.action file. -# -# Revision 1.23 2001/11/06 12:09:03 steudten -# Compress doc files. Install README and AUTHORS at last as document. -# -# Revision 1.22 2001/11/05 21:37:34 steudten -# Fix to include the actual version for name. -# Let the 'real' packager be included - sorry stefan. -# -# Revision 1.21 2001/10/31 19:27:27 swa -# consistent description. new name for suse since -# we had troubles with rpms of identical names -# on the webserver. -# -# Revision 1.20 2001/10/24 15:45:49 hal9 -# To keep Thomas happy (aka correcting my mistakes) -# -# Revision 1.19 2001/10/15 03:23:59 hal9 -# Nits. -# -# Revision 1.17 2001/10/10 18:59:28 hal9 -# Minor change for init script. -# -# Revision 1.16 2001/09/24 20:56:23 hal9 -# Minor changes. -# -# Revision 1.13 2001/09/10 17:44:43 swa -# integrate three pieces of documentation. needs work. -# will not build cleanly under redhat. -# -# Revision 1.12 2001/09/10 16:25:04 swa -# copy all templates. version updated. -# -# Revision 1.11 2001/07/03 11:00:25 sarantis -# replaced permissionsfile with actionsfile -# -# Revision 1.10 2001/07/03 09:34:44 sarantis -# bumped up version number. -# -# Revision 1.9 2001/06/12 18:15:29 swa -# the %% in front of configure (see tag below) confused -# the rpm build process on 7.1. -# -# Revision 1.8 2001/06/12 17:15:56 swa -# fixes, because a clean build on rh6.1 was impossible. -# GZIP confuses make, %% configure confuses rpm, etc. -# -# Revision 1.7 2001/06/11 12:17:26 sarantis -# fix typo in %%post -# -# Revision 1.6 2001/06/11 11:28:25 sarantis -# Further optimizations and adaptations in the spec file. -# -# Revision 1.5 2001/06/09 09:14:11 swa -# shamelessly adapted RPM stuff from the newest rpm that -# RedHat provided for the JB. -# -# Revision 1.4 2001/06/08 20:54:18 swa -# type with status file. remove forward et. al from file list. -# -# Revision 1.3 2001/06/07 17:28:10 swa -# cosmetics -# -# Revision 1.2 2001/06/04 18:31:58 swa -# files are now prefixed with either `confdir' or `logdir'. -# `make redhat-dist' replaces both entries confdir and logdir -# with redhat values -# -# Revision 1.1 2001/06/04 10:44:57 swa -# `make redhatr-dist' now works. Except for the paths -# in the config file. -# -# -# diff --git a/privoxy-suse.spec b/privoxy-suse.spec deleted file mode 100644 index 39aa6e0f..00000000 --- a/privoxy-suse.spec +++ /dev/null @@ -1,382 +0,0 @@ -# $Id: privoxy-suse.spec,v 1.6 2002/03/26 22:29:55 swa Exp $ -# -# Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# - -# do not set to %{name} -%define ijbconf %{_sysconfdir}/privoxy - -Summary: Privoxy - privacy enhancing proxy -Vendor: http://www.privoxy.org -Name: privoxy-suse -Distribution: defineme -Version: 2.9.13 -Release: 1 -Source: http://www.waldherr.org/%{name}/privoxy-%{version}.tar.gz -# not sure if this works -BuildRoot: %{_tmppath}/%{name}-%{version}-root -Packager: Stefan Waldherr -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 -+ privoxy-2.9.13-3 -- Minor fix to description. - -* Sun Mar 24 2002 Hal Burgiss -- added faq to docs. - -* Thu Mar 21 2002 Hal Burgiss -- added ijb_docs.css to docs. - -* Mon Mar 11 2002 Hal Burgiss -- Remove --enable-no-gifs from configure. - -* Sun Mar 03 2002 Hal Burgiss -- /bin/false for shell causes init script to fail. Reverting. - -* Wed Jan 09 2002 Hal Burgiss -- 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 -- add paranoia check for 'rm -rf $RPM_BUILD_ROOT' -- add gzip to 'BuildRequires' - -* Sat Dec 1 2001 Hal Burgiss -- actionsfile is now ijb.action. - -* Tue Nov 6 2001 Thomas Steudten -- Compress manpage -- Add more documents for installation -- Add version string to name and source - -* Wed Oct 24 2001 Hal Burigss -- Back to user 'junkbuster' and fix configure macro. - -* Wed Oct 10 2001 Hal Burigss -- More changes for user 'junkbust'. Init script had 'junkbuster'. - -* Sun Sep 23 2001 Hal Burgiss -- 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 -- 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 -- rework of RPM -* Wed Feb 14 2001 - uli@suse.de -- fixed init script -* Wed Dec 06 2000 - bjacke@suse.de -- renamed package to junkbuster -- fixed copyright tag -* Thu Nov 30 2000 - uli@suse.de -- moved init script to /etc/init.d -* Wed Feb 16 2000 - kukuk@suse.de -- Move /usr/man -> /usr/share/man -- Mark /etc/ijb as "config(noreplace)" -* Mon Sep 20 1999 - uli@suse.de -- fixed init script -* Mon Sep 13 1999 - bs@suse.de -- ran old prepare_spec on spec file to switch to new prepare_spec. -* Thu Apr 01 1999 - daniel@suse.de -- do not start ijb as root (security) -* Tue Mar 30 1999 - daniel@suse.de -- don´t use saclfile.ini -* Tue Mar 30 1999 - daniel@suse.de -- small fix to whitelist-configuration, - version is and was 2.0.2 WITHOUT Stefan Waldherr's patches - (http://www.waldherr.org/junkbuster/) -* Mon Mar 01 1999 - daniel@suse.de -- new package: version 2.0 - -# $Log: privoxy-suse.spec,v $ -# Revision 1.6 2002/03/26 22:29:55 swa -# we have a new homepage! -# -# Revision 1.5 2002/03/25 03:10:50 hal9 -# Added faq to docs. -# -# Revision 1.4 2002/03/24 12:56:21 swa -# name change related issues. -# -# Revision 1.3 2002/03/24 12:44:31 swa -# new version string -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.21 2002/03/21 16:04:33 hal9 -# added ijb_docs.css to %%doc -# -# Revision 1.20 2002/03/12 13:42:14 sarantis -# remove hardcoded "ijbswa" from build phase -# -# Revision 1.19 2002/03/11 22:59:05 hal9 -# Remove --enable-no-gifs -# -# Revision 1.18 2002/03/11 12:30:31 swa -# be consistent with rh spec file -# -# Revision 1.17 2002/03/08 19:30:23 swa -# remove user junkbuster after de-installation. -# synced suse with rh-specfile. installation -# and de-installation seem to work. -# -# Revision 1.16 2002/03/08 18:40:44 swa -# build requires tools. useradd and del works -# now. -# -# Revision 1.15 2002/03/07 19:23:50 swa -# i hate to scroll. suse: wrong configdir. -# -# Revision 1.14 2002/03/07 19:10:21 swa -# builds cleanly. thanks to kukuk@suse.de -# not yet tested. -# -# Revision 1.13 2002/03/07 18:25:56 swa -# synced redhat and suse build process -# -# Revision 1.12 2002/03/02 15:50:04 swa -# 2.9.11 version. more input for docs. -# -# Revision 1.11 2001/12/02 10:29:26 swa -# New version made these changes necessary. -# -# Revision 1.10 2001/10/31 19:27:27 swa -# consistent description. new name for suse since -# we had troubles with rpms of identical names -# on the webserver. -# -# Revision 1.9 2001/10/26 18:17:23 swa -# new version string -# -# Revision 1.8 2001/09/13 16:22:42 swa -# man page is legacy. suse rpm now contains html -# documentation. -# -# Revision 1.7 2001/09/10 17:44:22 swa -# integrate three pieces of documentation. -# -# Revision 1.6 2001/09/10 16:29:23 swa -# binary contained debug info. -# buildroot definition fucks up the build process under suse. -# program needs to write in varlogjunkbuster -# install all templates -# create varlogjunkbuster -# -# Revision 1.5 2001/06/09 09:13:29 swa -# description shorter -# -# Revision 1.4 2001/06/08 20:53:36 swa -# use buildroot, export init to separate file (better manageability) -# -# Revision 1.3 2001/06/07 17:28:10 swa -# cosmetics -# -# Revision 1.2 2001/06/07 17:18:44 swa -# header fixed -# -# diff --git a/privoxy.1 b/privoxy.1 deleted file mode 100644 index 0afd8922..00000000 --- a/privoxy.1 +++ /dev/null @@ -1,334 +0,0 @@ -.\" Revised man page 10/13/01, for development version. -.\" Hal Burgiss -.\" for Privoxy developers: ijbswa-developers@lists.sourceforge.net -.\" -.TH PRIVOXY 1 "v2.9.13 (beta) Date: 2002/03/24" - -.SH NAME -\fBprivoxy\fP -- Privacy enhancing -Proxy -.\"\s-2(TM)\s+2 -.SH SYNOPSIS -\fBprivoxy\fP -[--help] [--version] [--no-daemon] [--pidfile \fIpidfile\fP] [--user \fIuser\fP[.\fIgroup\fP]] -\fI\&[configfile]\fP (Unix) -.TP -\fBprivoxy.exe\fP \fI[configfile]\fP (Windows) -.br - -.SH OPTIONS -\fBPrivoxy\fP may be invoked with the following command-line options: -.TP -.BR --version " (unix only)" -Print version info and exit. -.TP -.BR --help " (unix only)" -Print a short usage info and exit. -.TP -.BR --no-daemon " (unix only)" -Don't become a daemon, i.e. don't fork and become process group -leader, don't detach from controlling tty, and do all logging -there. -.TP -\fB --pidfile\fP \fIpidfile\fP (unix only) -On startup, write the process ID to \fIpidfile\fP. Delete the -\fIpidfile\fP on exit. Failiure to create or delete the -\fIpidfile\fP is non-fatal. If no \fB--pidfile\fP option -is given, no PID file will be used. -.TP -\fB --user\fP \fIuser\fP[.\fIgroup\fP] (unix only) -After (optionally) writing the PID file, assume the user ID -of \fIuser\fP and the GID of \fIgroup\fP, or, if the optional -\fIgroup\fP was not given, the default group of \fIuser\fP. -Exit if the privileges are not sufficient to do so. - -.PP -If the \fIconfigfile\fP is not specified on the command line, -\fBPrivoxy\fP will look for a file named \fBconfig\fP in the -current directory (except on Win32 where it will try \fBconfig.txt\fP). - - -.SH DESCRIPTION -\fBPrivoxy\fP is a web proxy with advanced filtering capabilities for -protecting privacy, filtering web page content, managing cookies, -controlling access, and removing ads, banners, pop-ups and other -obnoxious Internet junk. \fBPrivoxy\fP has a very flexible configuration and -can be customized to suit individual needs and tastes. \fBPrivoxy\fP has -application for both stand-alone systems and multi-user networks. -.PP -\fBPrivoxy\fP is based on code of the \fBInternet Junkbuster (tm)\fP -\fBJunkbuster\fP was originally written by JunkBusters Corporation, and was -released as free open-source software under the GNU GPL. Stefan Waldherr made -many improvements, and started the SourceForge project to continue -development. - -.SH INSTALLATION AND USE -Browsers must be individually configured to use -\fBPrivoxy\fP as a HTTP proxy. -The default setting is for localhost, -on port 8118 (configurable in the main config file). -To set the -\s-2HTTP\s0 -proxy in Netscape and Mozilla, -go through: -\fB\&Edit\fP; -\fB\&Preferences\fP; -\fB\&Advanced\fP; -\fB\&Proxies\fP; -\fB\&Manual Proxy Configuration\fP; -\fB\&View\fP. -.PP -For Internet Explorer, -go through: -\fB\&Tools\fP; -\fB\&Internet Properties\fP; -\fB\&Connections\fP; -\fB\&LAN Settings\fP. -.PP -The -Secure (SSL) Proxy \" ijbfaq.html#security -should also be set to the same values, -otherwise -\fB\&https:\fP -\s-2URL\s0s -will not be proxied. -.PP -For other browsers, check the documentation. - -.SH CONFIGURATION -\fBPrivoxy\fP can be configured with the various configuration -files. The default configuration files are: \fIconfig\fP, -\fIdefault.action\fP, and \fIdefault.filter\fP. These are well commented. -On Unix and Unix-like systems, these are located in \fI/etc/privoxy/\fP -by default. On Windows, OS/2 and AmigaOS, these files are in the same directory -as the \fBPrivoxy\fP executable. -.PP -The name and number of configuration files has changed from previous versions, -and is subject to change as development progresses. In fact, the configuration -itself is changed and much more sophisticated. See the user-manual for a brief -explanation of all configuration options. -.PP -The actions list (ad blocks, etc) can also be configured with your -web browser at \fIhttp://www.privoxy.org/config\fP. -\fBPrivoxy's\fP configuration parameters can also be viewed -at the same page. In addition, \fBPrivoxy\fP can be toggled on/off. -This is an internal page. - -.SH "SAMPLE CONFIGURATION" -.PP -A brief example of what a \fIdefault.action\fP configuration might look like: -.PP -.nf - -# Define a few useful custom aliases for later use -{{alias}} - -# Don't accept cookies -+no-cookies = +no-cookies-set +no-cookies-read - -# Do accept cookies --no-cookies = -no-cookies-set -no-cookies-read - -# Treat these blocked URLs as images. -+imageblock = +block +image - -# Define page filters we want to use. -myfilters = +filter{html-annoyances} +filter{js-annoyances}\\ - +filter{no-popups} +filter{webbugs} - -## Default Policies (actions) ############################ -{ \\ - -block \\ - -downgrade \\ - +fast-redirects \\ - myfilters \\ - +no-compression \\ - +hide-forwarded \\ - +hide-from{block} \\ - +hide-referer{forge} \\ - -hide-user-agent \\ - -image \\ - +image-blocker{blank} \\ - +no-cookies-keep \\ - -no-cookies-read \\ - -no-cookies-set \\ - +no-popups \\ - -vanilla-wafer \\ - -wafer \\ -} -/ - -# Now set exceptions to the above defined policies ####### - -# Sites where we want persistant cookies -{-no-cookies -no-cookies-keep} - .redhat.com - .sun.com - .yahoo.com - .msdn.microsoft.com - -# This site requires cookies AND 'fast-redirects' on -{-no-cookies -no-cookies-keep -fast-redirects} - .nytimes.com - -# Add custom headers, and turn off filtering of page source -{+add-header{X-Privacy: Yes please} #-add-header{*} \\ - +add-header{X-User-Tracking: No thanks!} -filter} - privacy.net - -# Block, and treat these URLs as 'images'. -{+imageblock} - .adforce.imgis.com - .ad.preferences.com/image.* - .ads.web.aol.com - .ad-adex3.flycast.com - .ad.doubleclick.net - .ln.doubleclick.net - .ad.de.doubleclick.net - /.*/count\\.cgi\\?.*df= - 194.221.183.22[1-7] - a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/ - -# Block any URLs that match these patterns -{+block} - /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\\.(gif|jpe?g)) - /.*/(plain|live|rotate)[-_.]?ads?/ - /.*/(sponsor)s?[0-9]?/ - /.*/ad(server|stream|juggler)\\.(cgi|pl|dll|exe) - /.*/adbanners/ - /.*/adv((er)?ts?|ertis(ing|ements?))?/ - /.*/banners?/ - /.*/popupads/ - /.*/advert[0-9]+\\.jpg - /ad_images/ - /.*/ads/ - /images/.*/.*_anim\\.gif - /rotations/ - /.*(ms)?backoff(ice)?.*\\.(gif|jpe?g) - 195.63.104.*/(inbox|log|meld|folderlu|folderru|log(in|out)[lmr]u|) - .images.nytimes.com - .images.yahoo.com/adv/ - /.*cnnstore\\.gif - -.fi -.sp -.PP -See the comments in the configuration files themselves, or the user-manual -for explanations of the above syntax, and other \fBPrivoxy\fP configuration -options. - -.SH "FILES" -\fI/usr/sbin/privoxy\fP -.br -\fI/etc/privoxy/config\fP -.br -\fI/etc/privoxy/default.action\fP -.br -\fI/etc/privoxy/advanced.action\fP -.br -\fI/etc/privoxy/basic.action\fP -.br -\fI/etc/privoxy/intermediate.action\fP -.br -\fI/etc/privoxy/default.filter\fP -.br -\fI/etc/privoxy/trust\fP -.br -\fI/etc/privoxy/templates/*\fP -.br -\fI/var/log/privoxy/logfile\fP - -.PP -Various other files should be included, but may vary depending on platform -and build configuration. More documentation should be included in the local -documentation directory, though is not complete at this time. - -.SH SIGNALS -\fBPrivoxy\fP terminates on the \fBSIGINT\fP, \fBSIGTERM\fP and \fBSIGABRT\fP -signals. Log rotation scripts may cause a re-opening of the logfile by sending -a \fBSIGHUP\fP to \fBPrivoxy\fP. Note that unlike other daemons, \fBPrivoxy\fP -does not need to be made aware of config file changes by \fBSIGHUP\fP -- it will -detect them automatically. - -.SH NOTES -This is a \fBBETA\fP version of \fBPrivoxy\fP. Not all features are -complete or well tested. -.PP -Please see the user-maual on how to contact the developers for -feature requests, reporting problems, and other questions. - -.SH BUGS -Probably. Please see the user-manual for how and where to report bugs. - -.SH SEE ALSO -.br -http://www.privoxy.org/config -.br -http://www.privoxy.org/ -.br -http://sourceforge.net/projects/ijbswa -.br -http://www.waldherr.org/junkbuster/\" waldherr.org# -.br -http://www.junkbusters.com/ht/en/cookies.html\" cookies.html# -.br -http://privacy.net/analyze/ -.br -http://www.squid-cache.org/ -.br -http://linuxalpha.ch/packages/ - -.SH DEVELOPMENT TEAM -.br - Stefan Waldherr -.br - Andreas Oesterhelt -.br - Jon Foster -.br - Markus Breitenbach -.br - Thomas Steudten -.br - David Schmidt -.br - Haroon Rafique -.br - Joerg Strohmayer -.br - Shamim Mohamed -.br - Sarantis Paskalis -.br - Gabriel L. Somlo -.br - John Venvertloh -.br - Hal Burgiss -.br - Rodrigo Barbosa - -.SH COPYRIGHT AND LICENSE -\"Orginally written by, and copyrighted by, the Anonymous Coders and Junkbusters -\"Corporation. -\".PP -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. -.PP -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -.PP -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -.PP -Internet Junkbuster -Proxy -is a -trademark \" legal.html#marks -of Junkbusters Corporation. diff --git a/privoxy.init b/privoxy.init deleted file mode 100644 index a835405c..00000000 --- a/privoxy.init +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/privoxy.init,v $ -# -# Purpose : This shell script takes care of starting and stopping -# privoxy. -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: privoxy.init,v $ -# Revision 1.5 2002/03/25 06:14:18 morcego -# Removing the OPRG definition (no longer needed) -# -# Revision 1.4 2002/03/25 04:16:48 hal9 -# Fix proper config file location. -# -# Revision 1.3 2002/03/24 19:12:15 hal9 -# Fixed some naming conflicts. -# -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.1 2002/03/22 20:53:03 morcego -# - Ongoing process to change name to JunkbusterNG -# - configure/configure.in: no change needed -# - GNUmakefile.in: -# - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz -# - PROGRAM = jbng@EXEEXT@ -# - rh-spec now references as junkbusterng-rh.spec -# - redhat-upload: references changed to junkbusterng-* (package names) -# - tarball-dist: references changed to JunkbusterNG-distribution-* -# - tarball-src: now JunkbusterNG-* -# - install: initscript now junkbusterng.init and junkbusterng (when -# installed) -# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec -# - junkbusterng.spec: -# - References to the expression ijb where changed where possible -# - New package name: junkbusterng (all in lower case, acording to -# the LSB recomendation) -# - Version changed to: 2.9.13 -# - Release: 1 -# - Added: junkbuster to obsoletes and conflicts (Not sure this is -# right. If it obsoletes, why conflict ? Have to check it later) -# - Summary changed: Stefan, please check and aprove it -# - Changes description to use the new name -# - Sed string was NOT changed. Have to wait to the manpage to -# change first -# - Keeping the user junkbuster for now. It will require some aditional -# changes on the script (scheduled for the next specfile release) -# - Added post entry to move the old logfile to the new log directory -# - Removing "chkconfig --add" entry (not good to have it automaticaly -# added to the startup list). -# - Added preun section to stop the service with the old name, as well -# as remove it from the startup list -# - Removed the chkconfig --del entry from the conditional block on -# the preun scriptlet (now handled on the %files section) -# - junkbuster.init: renamed to junkbusterng.init -# - junkbusterng.init: -# - Changed JB_BIN to jbng -# - Created JB_OBIN with the old value of JB_BIN (junkbuster), to -# be used where necessary (config dir) -# -# Aditional notes: -# - The config directory is /etc/junkbuster yet. Have to change it on the -# specfile, after it is changes on the code -# - The only files that got renamed on the cvs tree were the rh specfile and -# the init file. Some file references got changes on the makefile and on the -# rh-spec (as listed above) -# -# Revision 1.15 2002/03/09 15:05:58 swa -# wrong user.group -# -# Revision 1.14 2002/03/06 06:13:40 hal9 -# Adapted for Andreas' changes for --user and --pidfile. -# -# Revision 1.13 2002/03/05 05:10:10 oes -# Changed pidfile path to conform with FHS -# -# Revision 1.12 2002/03/04 20:44:36 oes -# Changed to new cmdline syntax -# -# Revision 1.11 2001/12/30 14:07:32 steudten -# - Add signal handling (unix) -# - Add SIGHUP handler (unix) -# - Add creation of pidfile (unix) -# - Add action 'top' in rc file (RH) -# - Add entry 'SIGNALS' to manpage -# - Add exit message to logfile (unix) -# -# Revision 1.10 2001/11/05 21:30:23 steudten -# Make JB startup without & due to be a 'real' daemon right now. -# Make the script easy to change. -# -# Revision 1.9 2001/09/15 01:53:12 steudten -# -# Remove test for subsys flag in start. Some minor changes. -# -# Revision 1.8 2001/06/28 13:50:36 sarantis -# swap ?$ with $?; remove bogus ";;" -# -# Revision 1.7 2001/06/28 13:40:26 sarantis -# remove single quotes from $JB; it was not expanded. -# -# Revision 1.6 2001/06/28 13:38:42 sarantis -# formatting changes; individual return values are returned from the init script. -# -# Revision 1.5 2001/06/11 11:37:40 sarantis -# Minor editing changes. -# -# Revision 1.4 2001/06/09 09:14:11 swa -# shamelessly adapted RPM stuff from the newest rpm that -# RedHat provided for the JB. -# -# Revision 1.3 2001/05/25 10:12:44 oes -# Fixed default case in switch statement (# -> *) -# -# Revision 1.2 2001/05/24 07:52:24 swa -# added header. removed ^M. -# -# -# ********************************************************************/ - -# This is file /etc/rc.d/init.d/privoxy and was put here -# by the privoxy rpm -# -# chkconfig: 235 84 09 -# -# description: This shell script takes care of starting and stopping \ -# privoxy. -# - - -# Source function library. -. /etc/rc.d/init.d/functions - -. /etc/sysconfig/network - -# Check that networking is up. -[ ${NETWORKING} = "no" ] && exit 0 - -JB_PRG="privoxy" -JB_BIN="/usr/sbin/$JB_PRG" -JB_CONF="/etc/$JB_PRG/config" -JB_USER="privoxy" -JB_PID=/var/run/$JB_PRG.pid -JB_LOCK=/var/lock/subsys/$JB_PRG -JB="$JB_BIN --user $JB_USER.$JB_USER --pidfile $JB_PID $JB_CONF" - -# some checks for us -! [ -x $JB_BIN ] && echo "Can't find $JB_BIN, exit." && exit 0 -! [ -f $JB_CONF ] && echo "Can't find $JB_CONF, exit." && exit 0 - -# See how we were called. - -start () { - # start daemon - echo -n $"Starting $JB_PRG: " - if [ -f $JB_PID ]; then - killproc $JB_PRG && rm -f $JB_LOCK $JB_PID - RETVAL=$? - [ $RETVAL != 0 ] && return $RETVAL - fi - daemon $JB - RETVAL=$? - echo - [ $RETVAL = 0 ] && touch $JB_LOCK - return $RETVAL -} - -stop () { - # stop daemon - echo -n $"Stopping $JB_PRG: " - killproc $JB_PRG && rm -f $JB_LOCK $JB_PID - RETVAL=$? - echo - return $RETVAL -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - reload) - if [ -f $JB_PID ] ; then - kill -HUP `cat $JB_PID` - RETVAL=$? - fi - ;; - restart) - stop - start - RETVAL=$? - ;; - condrestart) - # restart only if already running - if [ -f $JB_PID ] ; then - stop - start - RETVAL=$? - fi - ;; - status) - status $JB_PRG - RETVAL=$? - ;; - top) - if [ -f $JB_PID ]; then - a="" - for i in `pidof $JB_PRG` ; do - a="$a -p $i" - done - top $a - fi - ;; - *) - echo $"Usage: $JB_PRG {start|stop|reload|restart|condrestart|status|top}" - exit 1 -esac - -exit $RETVAL diff --git a/privoxy.init.suse b/privoxy.init.suse deleted file mode 100644 index 7bab6def..00000000 --- a/privoxy.init.suse +++ /dev/null @@ -1,117 +0,0 @@ -#! /bin/sh -# ******************************************************************** -# -# File : $Source: /cvsroot/ijbswa/current/privoxy.init.suse,v $ -# -# Purpose : This shell script takes care of starting and stopping -# privoxy. -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Based on the Internet Junkbuster originally written -# by and Copyright (C) 1997 Anonymous Coders and -# Junkbusters Corporation. http://www.junkbusters.com -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: privoxy.init.suse,v $ -# Revision 1.2 2002/03/24 11:40:14 swa -# name change -# -# Revision 1.1 2002/03/24 11:23:44 swa -# name change -# -# Revision 1.7 2002/03/11 11:44:46 oes -# Working in suggestions by Thorsten Kukuk -# -# 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 diff --git a/project.h b/project.h index 6ba5c578..7830259a 100644 --- a/project.h +++ b/project.h @@ -1,6 +1,6 @@ -#ifndef PROJECT_H_INCLUDED -#define PROJECT_H_INCLUDED -#define PROJECT_H_VERSION "$Id: project.h,v 1.61 2002/03/26 22:29:55 swa Exp $" +#ifndef _PROJECT_H +#define _PROJECT_H +#define PROJECT_H_VERSION "$Id: project.h,v 1.19 2001/06/29 13:33:36 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/project.h,v $ @@ -10,13 +10,13 @@ * (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 @@ -36,206 +36,6 @@ * * 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 @@ -413,199 +213,96 @@ /* * 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 (System library) + * */ +#if (defined(REGEX) && defined(PCRE)) || defined(PCRS) +# ifdef STATIC +# include "pcre.h" +# else +# include +# 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 -#endif - -#ifdef STATIC_PCRS -# include "pcrs.h" -#else -# include -#endif - -#if defined(REGEX_PCRE) -# ifdef STATIC_PCRE +#if defined(REGEX) && defined(PCRE) +# ifdef STATIC # include "pcreposix.h" # else # include # 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 -#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 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 */ @@ -614,11 +311,13 @@ struct url_spec char *spec; /* The string which was parsed to produce this */ /* url_spec. Used for debugging or display only. */ - /* Hostname matching, or dbuffer == NULL to match all hosts */ - char *dbuffer; /* Buffer with '\0'-delimited domain name. */ - char **dvec; /* List of pointers to the strings in dbuffer. */ - int dcount; /* How many parts to this domain? (length of dvec) */ - int unanchored; /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT. */ + /* Hostname matching: */ + char *domain; /* Fully qalified domain name (FQDN) pattern. */ + /* May contain "*". */ + char *dbuf; /* Buffer with '\0'-delimited fqdn */ + char **dvec; /* Domain ptr vector into dbuf */ + int dcnt; /* How many domains in fqdn? */ + int unanchored; /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT */ /* Port matching: */ int port; /* The port number, or 0 to match all ports. */ @@ -631,17 +330,12 @@ struct url_spec regex_t *preg; /* Regex for matching path part */ #endif }; -#ifdef REGEX -#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL } -#else /* ifndef REGEX */ -#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0 } -#endif /* ndef REGEX */ -/* Constants for host part matching in URLs */ #define ANCHOR_LEFT 1 #define ANCHOR_RIGHT 2 + /* An I/O buffer */ struct iob { @@ -654,46 +348,35 @@ 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. @@ -703,7 +386,7 @@ struct iob */ struct current_action_spec { - unsigned long flags; /* a bit set to "1" = add action */ + unsigned flags; /* a bit set to "1" = add action */ /* For those actions that require parameters: */ @@ -722,8 +405,8 @@ struct current_action_spec */ struct action_spec { - unsigned long mask; /* a bit set to "0" = remove action */ - unsigned long add; /* a bit set to "1" = add action */ + unsigned mask; /* a bit set to "0" = remove action */ + unsigned add; /* a bit set to "1" = add action */ /* For those actions that require parameters: */ @@ -756,23 +439,29 @@ struct url_actions }; +/* Constants defining bitmask for csp->accept_types */ + +#ifdef DETECT_MSIE_IMAGES + +/* MSIE detected by user-agent string */ +#define ACCEPT_TYPE_IS_MSIE 0x0001 + /* - * Flags for use in csp->flags + * *If* this is MSIE, it wants an image. (Or this is a shift-reload, or + * it's got an image from this URL before... yuck!) + * Only meaningful if ACCEPT_TYPE_IS_MSIE set */ -#define CSP_FLAG_ACTIVE 0x01 /* Set if this client is processing data. - * Cleared when the thread associated with - * this structure dies. */ -#define CSP_FLAG_CHUNKED 0x02 /* Set if the server's reply is in "chunked" - * transfer encoding */ -#define CSP_FLAG_FORCED 0x04 /* Set if this request was enforced, although - * it would normally have been blocked. */ -#define CSP_FLAG_MODIFIED 0x08 /* Set if any modification to the body was done */ -#define CSP_FLAG_REJECTED 0x10 /* Set if request was blocked. */ -#define CSP_FLAG_TOGGLED_ON 0x20 /* Set if we are toggled on (FEATURE_TOGGLE) */ +#define ACCEPT_TYPE_MSIE_IMAGE 0x0002 /* - * The state of a Privoxy processing thread. + * *If* this is MSIE, it wants a HTML document. + * Only meaningful if ACCEPT_TYPE_IS_MSIE set */ +#define ACCEPT_TYPE_MSIE_HTML 0x0004 + +#endif /* def DETECT_MSIE_IMAGES */ + + struct client_state { /* The proxy's configuration */ @@ -782,13 +471,26 @@ struct client_state struct current_action_spec action[1]; /* socket to talk to client (web browser) */ - jb_socket cfd; + int cfd; /* socket to talk to server (web server or proxy) */ - jb_socket sfd; + int sfd; + + +#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. @@ -805,6 +507,18 @@ struct client_state char *my_ip_addr_str; char *my_hostname; +#ifdef TRUST_FILES + /* The referer in this request, if one was specified. */ + char *referrer; +#endif /* def TRUST_FILES */ + +#if defined(DETECT_MSIE_IMAGES) + /* Types the client will accept. + * Bitmask - see ACCEPT_TYPE_XXX constants. + */ + int accept_types; +#endif /* defined(DETECT_MSIE_IMAGES) */ + /* The URL that was requested */ struct http_request http[1]; @@ -817,61 +531,51 @@ struct client_state /* List of all cookies for this request */ struct list cookie_list[1]; - /* MIME-Type key, see CT_* above */ - unsigned short int content_type; +#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 { /* @@ -879,11 +583,11 @@ struct file_list * Read-only once the structure has been created. */ void *f; - + /* Normally NULL. When we are finished with file (i.e. when we have * loaded a new one), set to a pointer to an unloader function. * Unloader will be called by sweep() (called from main loop) when - * all clients using this file are done. This prevents threading + * all clients using this file are done. This prevents threading * problems. */ void (*unloader)(void *); @@ -891,6 +595,13 @@ struct file_list /* Used internally by sweep(). Do not access from elsewhere. */ int active; +#ifndef SPLIT_PROXY_ARGS + /* String to be displayed as part of show-proxy-args display. + * Read-only once the structure has been created. + */ + char *proxy_args; +#endif /* ndef SPLIT_PROXY_ARGS */ + /* Following variables allow us to check if file has been changed. * Read-only once the structure has been created. */ @@ -907,14 +618,14 @@ struct file_list }; -#ifdef FEATURE_TRUST +#ifdef TRUST_FILES struct block_spec { struct url_spec url[1]; int reject; struct block_spec *next; }; -#endif /* def FEATURE_TRUST */ +#endif /* def TRUST_FILES */ #define SOCKS_NONE 0 /* Don't use a SOCKS server */ @@ -939,25 +650,18 @@ struct forward_spec /* For the linked list */ struct forward_spec *next; }; -#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL } -/* - * This struct represents one filter (one block) from - * the re_filterfile. If there is more than one filter - * in the file, the file will be represented by a - * chained list of re_filterfile specs. - */ +#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 */ @@ -976,17 +680,12 @@ struct access_control_list short action; struct access_control_list *next; }; -#endif /* def FEATURE_ACL */ +#endif /* def ACL_FILES */ /* Maximum number of loaders (actions, re_filter, ...) */ #define NLOADERS 8 - -#define RUNTIME_FEATURE_CGI_EDIT_ACTIONS 1 -#define RUNTIME_FEATURE_CGI_TOGGLE 2 - - /* * Data loaded from the configuration file. * @@ -997,9 +696,6 @@ struct configuration_spec int debug; int multi_threaded; - /* Features that can be enabled/disabled throuigh the config file */ - unsigned feature_flags; - const char *logfile; const char *confdir; @@ -1012,33 +708,41 @@ struct configuration_spec /* 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; @@ -1058,57 +762,28 @@ struct configuration_spec #define SZ(X) (sizeof(X) / sizeof(*X)) -#ifdef FEATURE_FORCE_LOAD -#define FORCE_PREFIX "/PRIVOXY-FORCE" -#endif /* def FEATURE_FORCE_LOAD */ - -#ifdef FEATURE_NO_GIFS -#define BUILTIN_IMAGE_MIMETYPE "image/png" -#else -#define BUILTIN_IMAGE_MIMETYPE "image/gif" -#endif /* def FEATURE_NO_GIFS */ - +#ifdef FORCE_LOAD +#define FORCE_PREFIX "/IJB-FORCE-LOAD" +#endif /* def FORCE_LOAD */ /* Hardwired URLs */ -#define HOME_PAGE_URL "http://www.privoxy.org" -#define REDIRECT_URL HOME_PAGE_URL "/redirect.php?v=" VERSION "&to=" - -/* - * The "hosts" to intercept and display CGI pages. - * First one is a hostname only, second one can specify host and path. - * - * Notes: - * 1) Do not specify the http: prefix - * 2) CGI_SITE_2_PATH must not end with /, one will be added automatically. - * 3) CGI_SITE_2_PATH must start with /, unless it is the empty string. - */ -#define CGI_SITE_1_HOST "p.p" -#define CGI_SITE_2_HOST "config.privoxy.org" -#define CGI_SITE_2_PATH "" - -/* - * The prefix for CGI pages. Written out in generated HTML. - * INCLUDES the trailing slash. - */ -#define CGI_PREFIX "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/" - +#define HOME_PAGE_URL "http://ijbswa.sourceforge.net" +#define REDIRECT_URL HOME_PAGE_URL "/redirect.php?v=" VERSION "&to=" +#define CGI_PREFIX_HOST "i.j.b" /* HTTP snipplets */ static const char CSUCCEED[] = "HTTP/1.0 200 Connection established\n" - "Proxy-Agent: Privoxy/" VERSION "\r\n\r\n"; + "Proxy-Agent: IJ/" VERSION "\n\n"; static const char CHEADER[] = - "HTTP/1.0 400 Invalid header received from browser\r\n\r\n"; - -static const char CFORBIDDEN[] = - "HTTP/1.0 403 Connection not allowable\r\nX-Hint: If you read this message interactively, then you know why this happens ,-)\r\n\r\n"; + "HTTP/1.0 400 Invalid header received from browser\n\n"; #ifdef __cplusplus } /* extern "C" */ #endif -#endif /* ndef PROJECT_H_INCLUDED */ +#endif /* ndef _PROJECT_H */ /* Local Variables: diff --git a/re_filterfile b/re_filterfile new file mode 100644 index 00000000..0c6c9f6d --- /dev/null +++ b/re_filterfile @@ -0,0 +1,159 @@ +# ******************************************************************** +# +# 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/()/$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/]*http-equiv[^>]*refresh.*URL=([^>]*?)"?>//i +s/]*http-equiv="?page-enter"?[^>]*content=[^>]*>//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/(]+?)border=['"]?(no|0)['"]?/$1/ig +s/(]+?)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|]*?(width=['"]?468\D)[^>]*(height=['"]?60)[^>]*?>||sig +s|]*?(width=['"]?234\D)[^>]*(height=['"]?60)[^>]*?>||sig +s|]*?(width=['"]?88\D)[^>]*(height=['"]?31)[^>]*?>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?90)[^>]*?>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?600)[^>]*?>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?60)[^>]*?>||sig +s|]*?(width=['"]?160\D)[^>]*(height=['"]?600)[^>]*?>||sig +s|]*?(width=['"]?125\D)[^>]*(height=['"]?125)[^>]*?>||sig +s|]*?(width=['"]?120\D)[^>]*(height=['"]?240)[^>]*?>||sig +s|]*?(width=['"]?180\D)[^>]*(height=['"]?150)[^>]*?>||sig +s|]*?(width=['"]?300\D)[^>]*(height=['"]?250)[^>]*?>||sig +s|]*?(width=['"]?250\D)[^>]*(height=['"]?250)[^>]*?>||sig +s|]*?(width=['"]?240\D)[^>]*(height=['"]?400)[^>]*?>||sig +s|]*?(width=['"]?336\D)[^>]*(height=['"]?280)[^>]*?>||sig + +# Where is that from? +s|]*?(width=['"]?200\D)[^>]*(height=['"]?50)[^>]*?>||sig + +# ********************************************************************/ +# +# Squish WebBugs: +# +# ********************************************************************/ +s/]*?(width|height)\s+=\s+['"]?1\D[^>]*?(width|height)\s+=\s+['"]?1\D[^>]*?>//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%^.*(?Blocked

    Blocked due to possible adult content. Please see this site.

    %is +#s+^.*warez.*$+No Warez

    You're not searching for illegal stuff, are you?

    +is + +# ********************************************************************/ +# +# http://www.farscapezone.com/wwwboard/messages/1451.html +# +# ********************************************************************/ +s/(\w+) was tired/$1 needed more coffee<\/b>/ig diff --git a/showargs.c b/showargs.c new file mode 100644 index 00000000..fa4163f9 --- /dev/null +++ b/showargs.c @@ -0,0 +1,462 @@ +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 + * + * + *********************************************************************/ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#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, "%s ", c, c); + } + freez(c); + } + if ( ( NULL != o ) && ( '\0' != *o ) ) + { + if ((o = html_encode(o))) + { + if (strncmpic(o, "http://", 7) == 0) + { + strcat(buf, ""); + strcat(buf, o); + strcat(buf, ""); + } + else + { + strcat(buf, o); + } + } + freez(o); + } + + strcat(buf, "
    \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, "
  • #define REGEX - Support for regular expressions in the path specs.
  • \n"); +#else /* ifndef REGEX */ + b = strsav(b, "
  • #undef REGEX - No support for regular expressions in the path specs.
  • \n"); +#endif /* ndef REGEX */ + +#ifdef PCRE + b = strsav(b, "
  • #define PCRE - Use PCRE rather than old GNU regex library.
  • \n"); +#else /* ifndef PCRE */ + b = strsav(b, "
  • #undef PCRE - Use old GNU regex library rather than PCRE.
  • \n"); +#endif /* ndef PCRE */ + +#ifdef PCRS + b = strsav(b, "
  • #define PCRS - Enables arbitrary content modification regexps.
  • \n"); +#else /* ifndef PCRS */ + b = strsav(b, "
  • #undef PCRS - Disables arbitrary content modification regexps.
  • \n"); +#endif /* ndef PCRS */ + +#ifdef TOGGLE + b = strsav(b, "
  • #define TOGGLE - Allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.
  • \n"); +#else /* ifndef TOGGLE */ + b = strsav(b, "
  • #undef TOGGLE - Do not allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.
  • \n"); +#endif /* ndef TOGGLE */ + +#ifdef FORCE_LOAD + b = strsav(b, "
  • #define FORCE_LOAD - Enables bypassing filtering for a single page using the prefix \"" FORCE_PREFIX "\".
  • \n"); +#else /* ifndef FORCE_LOAD */ + b = strsav(b, "
  • #undef FORCE_LOAD - Disables bypassing filtering for a single page.
  • \n"); +#endif /* ndef FORCE_LOAD */ + +#ifdef DENY_GZIP + b = strsav(b, "
  • #define DENY_GZIP - Prevents requests from being compressed - required for PCRS.
  • \n"); +#else /* ifndef DENY_GZIP */ + b = strsav(b, "
  • #undef DENY_GZIP - Allows requests to be compressed if the browser and server support it.
  • \n"); +#endif /* ndef DENY_GZIP */ + +#ifdef STATISTICS + b = strsav(b, "
  • #define STATISTICS - Enables statistics function.
  • \n"); +#else /* ifndef STATISTICS */ + b = strsav(b, "
  • #undef STATISTICS - Disables statistics function.
  • \n"); +#endif /* ndef STATISTICS */ + +#ifdef SPLIT_PROXY_ARGS + b = strsav(b, "
  • #define SPLIT_PROXY_ARGS - Split this page up by placing the configuration files on separate pages.
  • \n"); +#else /* ifndef SPLIT_PROXY_ARGS */ + b = strsav(b, "
  • #undef SPLIT_PROXY_ARGS - This page contains the text of the configuration files, they are not split onto separate pages.
  • \n"); +#endif /* ndef SPLIT_PROXY_ARGS */ + +#ifdef KILLPOPUPS + b = strsav(b, "
  • #define KILLPOPUPS - Enables killing JavaScript popups.
  • \n"); +#else /* ifndef KILLPOPUPS */ + b = strsav(b, "
  • #undef KILLPOPUPS - Disables killing JavaScript popups.
  • \n"); +#endif /* ndef KILLPOPUPS */ + +#ifdef WEBDAV + b = strsav(b, "
  • #define WEBDAV - Enables support for webDAV - e.g. stops Microsoft Outlook from accessing HotMail e-mail.
  • \n"); +#else /* ifndef WEBDAV */ + b = strsav(b, "
  • #undef WEBDAV - Disables support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail.
  • \n"); +#endif /* ndef WEBDAV */ + +#ifdef DETECT_MSIE_IMAGES + b = strsav(b, "
  • #define DETECT_MSIE_IMAGES - Enables detecting image requests automatically for MSIE.
  • \n"); +#else /* ifndef DETECT_MSIE_IMAGES */ + b = strsav(b, "
  • #undef DETECT_MSIE_IMAGES - Disables detecting image requests automatically for MSIE.
  • \n"); +#endif /* ndef DETECT_MSIE_IMAGES */ + +#ifdef IMAGE_BLOCKING + b = strsav(b, "
  • #define IMAGE_BLOCKING - Enables sending \"blocked\" images instead of HTML.
  • \n"); +#else /* ifndef IMAGE_BLOCKING */ + b = strsav(b, "
  • #undef IMAGE_BLOCKING - Disables sending \"blocked\" images instead of HTML.
  • \n"); +#endif /* ndef IMAGE_BLOCKING */ + +#ifdef ACL_FILES + b = strsav(b, "
  • #define ACL_FILES - Enables the use of ACL files to control access to the proxy by IP address.
  • \n"); +#else /* ifndef ACL_FILES */ + b = strsav(b, "
  • #undef ACL_FILES - Disables the use of ACL files to control access to the proxy by IP address.
  • \n"); +#endif /* ndef ACL_FILES */ + +#ifdef TRUST_FILES + b = strsav(b, "
  • #define TRUST_FILES - Enables the use of trust files.
  • \n"); +#else /* ifndef TRUST_FILES */ + b = strsav(b, "
  • #undef TRUST_FILES - Disables the use of trust files.
  • \n"); +#endif /* ndef TRUST_FILES */ + +#ifdef JAR_FILES + b = strsav(b, "
  • #define JAR_FILES - Enables the use of jar files to capture cookies.
  • \n"); +#else /* ifndef JAR_FILES */ + b = strsav(b, "
  • #undef JAR_FILES - Disables the use of jar files to capture cookies.
  • \n"); +#endif /* ndef JAR_FILES */ + +#ifdef FAST_REDIRECTS + b = strsav(b, "
  • #define FAST_REDIRECTS - Enables intercepting remote script redirects.
  • \n"); +#else /* ifndef FAST_REDIRECTS */ + b = strsav(b, "
  • #undef FAST_REDIRECTS - Disables intercepting remote script redirects.
  • \n"); +#endif /* ndef FAST_REDIRECTS */ + + return b; +} + + +/* + Local Variables: + tab-width: 3 + end: +*/ diff --git a/showargs.h b/showargs.h new file mode 100644 index 00000000..48df8317 --- /dev/null +++ b/showargs.h @@ -0,0 +1,75 @@ +#ifndef _SHOWARGS_H +#define _SHOWARGS_H +#define SHOWARGS_H_VERSION "$Id: showargs.h,v 1.4 2001/06/03 19:13:05 oes Exp $" +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/showargs.h,v $ + * + * Purpose : Contains various utility routines needed to + * generate the show-proxy-args page. + * + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net + * + * Based on the Internet Junkbuster originally written + * by and Copyright (C) 1997 Anonymous Coders and + * Junkbusters Corporation. http://www.junkbusters.com + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will + * be useful, but WITHOUT ANY WARRANTY; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public + * License for more details. + * + * The GNU General Public License should be included with + * this file. If not, you can view it at + * http://www.gnu.org/copyleft/gpl.html + * or write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Revisions : + * $Log: showargs.h,v $ + * Revision 1.4 2001/06/03 19:13:05 oes + * moved stuff to cgi.c + * + * Revision 1.3 2001/05/29 23:11:38 oes + * + * - Moved strsav() from showargs to miscutil + * + * Revision 1.2 2001/05/26 00:28:36 jongfoster + * Automatic reloading of config file. + * Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32). + * Most of the global variables have been moved to a new + * struct configuration_spec, accessed through csp->config->globalname + * Most of the globals remaining are used by the Win32 GUI. + * + * Revision 1.1.1.1 2001/05/15 13:59:03 oes + * Initial import of version 2.9.3 source tree + * + * + *********************************************************************/ + + +#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 */ diff --git a/ssplit.c b/ssplit.c index ff362568..c0315bcf 100644 --- a/ssplit.c +++ b/ssplit.c @@ -1,4 +1,4 @@ -const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; +const char ssplit_rcs[] = "$Id: ssplit.c,v 1.2 2001/05/17 23:01:01 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/ssplit.c,v $ @@ -6,7 +6,7 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; * Purpose : A function to split a string at specified deliminters. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -32,18 +32,6 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; * * Revisions : * $Log: ssplit.c,v $ - * Revision 1.5 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.4 2001/11/13 00:16:38 jongfoster - * Replacing references to malloc.h with the standard stdlib.h - * (See ANSI or K&R 2nd Ed) - * - * Revision 1.3 2001/05/29 08:54:25 jongfoster - * Rewrote the innards of ssplit() to be easier to understand, - * faster, and to use less memory. Didn't change the interface - * except to give the parameters meaningful names. - * * Revision 1.2 2001/05/17 23:01:01 oes * - Cleaned CRLF's from the sources and related files * @@ -59,6 +47,10 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $"; #include #include +#ifdef _WIN32 +#include +#endif + #include "ssplit.h" #include "miscutil.h" diff --git a/ssplit.h b/ssplit.h index 397dda2a..757a98e2 100644 --- a/ssplit.h +++ b/ssplit.h @@ -1,6 +1,6 @@ -#ifndef SSPLIT_H_INCLUDED -#define SSPLIT_H_INCLUDED -#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.4 2002/03/24 13:25:43 swa Exp $" +#ifndef _SSPLIT_H +#define _SSPLIT_H +#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.1.1.1 2001/05/15 13:59:04 oes Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/ssplit.h,v $ @@ -8,7 +8,7 @@ * Purpose : A function to split a string at specified deliminters. * * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -34,18 +34,6 @@ * * Revisions : * $Log: ssplit.h,v $ - * Revision 1.4 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.3 2001/07/29 18:43:08 jongfoster - * Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to - * ANSI C rules. - * - * Revision 1.2 2001/05/29 08:54:25 jongfoster - * Rewrote the innards of ssplit() to be easier to understand, - * faster, and to use less memory. Didn't change the interface - * except to give the parameters meaningful names. - * * Revision 1.1.1.1 2001/05/15 13:59:04 oes * Initial import of version 2.9.3 source tree * @@ -68,7 +56,7 @@ extern const char ssplit_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef SSPLIT_H_INCLUDED */ +#endif /* ndef _SSPLIT_H */ /* Local Variables: diff --git a/templates/blocked b/templates/blocked index 9097b522..4d0d77e7 100644 --- a/templates/blocked +++ b/templates/blocked @@ -1,12 +1,12 @@ ########################################################## # -# "Blocked" Error Output template for Privoxy. +# "Blocked" Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: # --------------------- # -# Template files are written in plain HTML, with a few +# Template files are written win plain HTML, with a few # additions: # # - Lines that start with a '#' character like this one @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -49,8 +49,12 @@ # # 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: @@ -58,27 +62,19 @@ # # 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 # - Request blocked (Privoxy@@my-hostname@) + Request blocked (Junkbuster@@my-hostname@) @@ -92,16 +88,33 @@

    BLOCKED

    -

    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@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + + + + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Request for blocked URL

    -

    Your request for @hostport@@path@ was blocked. -
    See why +

    Your request for @hostport-html@@path-html@ was blocked. +
    See why or go there anyway. @@ -112,60 +125,24 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - diff --git a/templates/blocked-compact b/templates/blocked-compact deleted file mode 100644 index f0ff59fa..00000000 --- a/templates/blocked-compact +++ /dev/null @@ -1,86 +0,0 @@ -########################################################## -# -# "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 -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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 -# - - - - Request blocked (Privoxy@@my-hostname@) - - - - - -

    Your request for @hostport@@path@ was blocked. -
    See why - - or go there anyway. - -
    More info. -

    - - - diff --git a/templates/cgi-error-404 b/templates/cgi-error-404 deleted file mode 100644 index c7e51da0..00000000 --- a/templates/cgi-error-404 +++ /dev/null @@ -1,166 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. -# - - - - 404 - Privoxy Configuration Page not found - - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    404

    -
    -

    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@

    -
    -

    Privoxy Configuration page not found

    -
    -

    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.

    -

    If you got here by clicking a link in the - configuration interface, please file a bug report!

    -

    You can use the menu below to select from the available - configuration options

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-bad-param b/templates/cgi-error-bad-param deleted file mode 100644 index 699b7042..00000000 --- a/templates/cgi-error-bad-param +++ /dev/null @@ -1,173 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. -# - - - - Privoxy: Bad parameter - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    Bad parameter to Privoxy configuration page

    -
    -

    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.

    -

    Possible causes:

    -
      -
    • 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.
    • -
    • 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.
    • -
    • If you got here using your browser's "back" button, then - that is deliberately disabled for this page.
    • -
    • If you got here by clicking a link in the - configuration interface, please file a bug report!
    • -
    -

    You can use the menu below to select from the available - configuration options

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-disabled b/templates/cgi-error-disabled deleted file mode 100644 index bfe67158..00000000 --- a/templates/cgi-error-disabled +++ /dev/null @@ -1,160 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. -# - - - - Configuration Page Disabled - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    Privoxy Configuration page diasabled

    -
    -

    The Privoxy administrator has decided to disable this - feature. If you want to use it, you must ask them to - enable it.

    -

    If you are the Privoxy administrator, you can enable - this feature by changing the appropriate line in your - configuration file.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-file b/templates/cgi-error-file deleted file mode 100644 index d9d0d6a0..00000000 --- a/templates/cgi-error-file +++ /dev/null @@ -1,156 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. -# - - - - Privoxy: Actions file not found - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    Actions file not found

    -
    -

    The actions file you are trying to edit (@f@.action) - does not exist, or cannot be read.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-modified b/templates/cgi-error-modified deleted file mode 100644 index af5e5af9..00000000 --- a/templates/cgi-error-modified +++ /dev/null @@ -1,175 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. -# - - - - Privoxy: URL out of date - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    URL out of date - file has changed since it was generated

    -
    -

    The URL you're viewing is out of date. To prevent possible - damage to your configuration file, this action has been ignored. -

    -

    Possible causes:

    -
      -
    • 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.
    • -
    • 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.
    • -
    • 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.
    • -
    -

    You can go back into the edit interface using the menu below, - or by clicking here.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/cgi-error-parse b/templates/cgi-error-parse deleted file mode 100644 index f96bc9c6..00000000 --- a/templates/cgi-error-parse +++ /dev/null @@ -1,192 +0,0 @@ -########################################################## -# -# No-Such-Domain Error Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. -# - - - - Privoxy: Parse error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    Parse error

    -
    -

    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.

    -

    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!

    -

    When you've fixed the problem, you can go back into the edit - interface using the menu below, or by clicking here.

    -
    -
    -

    Problem description:

    -

    @parse-error@

    -
    -

    The line which caused the problem:

    -
    @line-raw@
    -
    -

    The line which caused the problem, with comments removed

    -

    @line-data@

    -
    -

    Note

    -

    Only the first error is reported - the file may contain other - errors, as well as the one reported above.

    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/connect-failed b/templates/connect-failed index 56468915..d60b1bb3 100644 --- a/templates/connect-failed +++ b/templates/connect-failed @@ -1,6 +1,6 @@ ########################################################## # -# No-Such-Domain Error Output template for Privoxy. +# No-Such-Domain Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -51,8 +51,12 @@ # 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: @@ -60,23 +64,15 @@ # # 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. # - 503 - Connect failed (Privoxy@@my-hostname@) + 503 - Connect failed (Junkbuster@@my-hostname@) @@ -90,16 +86,33 @@

    503

    -

    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@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + + + + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Connect failed

    -

    Your request for http://@hostport@@path@ could not be fulfilled, because the connection - to @host@ (@host-ip@) could not be established.

    +

    Your request for http://@hostport-html@@path-html@ could not be fulfilled, because the connection + to @host-html@ (@host-ip@) could not be established.

    This is often a temporary failiure, so you might just try again.

    @@ -108,61 +121,24 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - - diff --git a/templates/default b/templates/default index 263a1c5b..b4e4b7bc 100644 --- a/templates/default +++ b/templates/default @@ -1,6 +1,6 @@ ########################################################## # -# Default-CGI Output template for Privoxy. +# Default-CGI Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -52,23 +52,15 @@ # # 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. # - Privoxy@@my-hostname@ + Junkbuster@@my-hostname@ @@ -79,15 +71,8 @@ - - - - @@ -95,52 +80,39 @@ # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - + + + + - -
    -

    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@

    -
    -

    Thank you for using Privoxy!

    -

    Please choose from the following options:

    -
      @menu@
    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems!
    Use at your own risk. See the license for details.

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Thank you for using the SourceForge edition of Internet Junkbuster!

    +

    Please choose from the following options:

    +
      @menu@
    +
    -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    diff --git a/templates/edit-actions-add-url-form b/templates/edit-actions-add-url-form deleted file mode 100644 index d690c865..00000000 --- a/templates/edit-actions-add-url-form +++ /dev/null @@ -1,169 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-add-url-form,v $ -# -# Purpose : Template used to add a URL pattern to the actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: edit-actions-add-url-form,v $ -# Revision 1.9 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.8 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.7 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.6 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.5 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.4 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.3 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.2 2002/01/17 21:21:03 jongfoster -# DOS->Unix line endings -# -# Revision 1.1 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# section -# -############################################################################# - - - - - - - - - -Privoxy: Edit URL Pattern - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    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@

    -
    -

    Add URL Pattern

    -
    -

    - - - -
    -   -   - Cancel -

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - - diff --git a/templates/edit-actions-for-url b/templates/edit-actions-for-url deleted file mode 100644 index 93cc322a..00000000 --- a/templates/edit-actions-for-url +++ /dev/null @@ -1,815 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-for-url,v $ -# -# Purpose : Template used to edit the actions associated with a -# particular section in an actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: edit-actions-for-url,v $ -# Revision 1.18 2002/03/24 16:32:08 jongfoster -# Removing logo option -# -# Revision 1.17 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.16 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.15 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.14 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.13 2002/03/16 14:28:38 jongfoster -# First version of modular filters support -# -# Revision 1.12 2002/03/12 01:42:50 oes -# Introduced modular filters -# -# Revision 1.11 2002/03/08 18:19:14 jongfoster -# Adding +image-blocker{pattern} option to edit interface -# -# Revision 1.10 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.9 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.8 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.7 2002/01/17 21:21:03 jongfoster -# DOS->Unix line endings -# -# Revision 1.6 2001/11/22 21:58:41 jongfoster -# Adding action +no-cookies-keep -# -# Revision 1.5 2001/11/13 21:12:17 jongfoster -# Added support for the following actions: -# +downgrade, +limit-connect, +no-compression -# -# Revision 1.4 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Browser support for the JavaScript on this page: -# MS Internet Explorer 5.5 - Tested, Yes -# Netscape 6.0 - Tested, Yes -# Netscape 4.75 - Tested, NO -# Opera 5.12 - Tested, NO -# MS Internet Explorer 4+ - Untested, Yes -# MS IE 3.x, NS3.x - Untested, NO -# Mozilla >=0.6 - Untested, Yes -# -# All browsers should work, you just might not get the pretty DHTML effects. -# -# The effects that only work under the browsers marked "Yes" above are: -# - Text edit boxes that won't have any effect are disabled. -# - Table rows containing additional settings are hidden if the feature in -# question is disabled. -# -# There are major kludges to get around these problems with NS4, but they -# screw up the HTML too much for other browsers. If anyone wants to try, -# here's some descriptions of the kludges: -# http://www.webreference.com/js/tips/991114.html -# http://www.webreference.com/dhtml/column12/outDisplay.html -# -# If you're favorite browser isn't listed, please test and add it. -# -# -############################################################################# -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# action-name-y -# action-name-n -# action-name-x -# -# deanimate-gifs-param-first -# deanimate-gifs-param-last -# hide-from-param-block -# hide-from-param-custom -# hide-from-param -# hide-referer-param-forge -# hide-referer-param-block -# hide-referer-param-custom -# hide-referer-param -# hide-user-agent-param -# image-blocker-param-pattern -# image-blocker-param-blank -# image-blocker-param-custom -# -# -############################################################################# - - - - - - - - - -Privoxy: Edit actions - - - - - - - - -
    - - - - - - - - - -
    -

    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@

    -
    -

    Edit Actions - - - -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@filter-params@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    EnableDisableNo ChangeActionDescription
    +add-headerAdds HTTP headers.
        Editing the settings for this option, or turning - it on if it was off, is not yet supported using this web-based - editor.
    +blockBlock the request
    +deanimate-gifsReplace animated GIFs with their (first/last) frame.
        Use the   
    +fast-redirectsBypass some tracking URLs.
    +downgradeChange HTTP/1.1 requests to HTTP/1.0. Only change if you know - what you're doing!
       +filterFilter the website through regular expression filters. - You can enable or disable the filters individually.
       All filters applied by previous rules
    +hide-forwardedBlock any existing X-Forwarded-for header, and do not add a new one.
    +hide-fromStop old web browsers from sending the user's e-mail address with - every request.
        
    -
    -
    +hide-refererHelps prevent tracking by not sending the URL of the previous web - page. 
         (breaks images - on some free web hosts).
    - (fools checks for in-site links.)
    -
    -
    +hide-user-agentPretend to be using a different web browser.  (Breaks many web - sites).
        User Agent string to send:
    -
    +imageRequest is for an image (only useful in conjunction with the +block - and +image-blocker options).
    +image-blockerSpecifies how to block images.  Disable to always send a HTML - "blocked" page.
        
    -
    -
    -
    +limit-connectSpecify which ports are allowed for SSL (HTTP CONNECT) access. - Note that this allows arbitrary tunnelling, so opening all - ports would be a security hole.
        Legal SSL ports (comma separated, ranges allowed):
    -
    +no-compressionDisables 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.
    +no-cookies-keepAny 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 no-cookies-read and - no-cookies-set.
    +no-cookies-readPrevent the website from reading cookies.
    +no-cookies-setPrevent the website from setting cookies.
    +no-popupsFilter the website through a built-in filter to disable JavaScript - pop-up windows.
    +vanilla-waferIf you use a jarfile, automatically adds a special wafer.
    +waferAdds user-specified cookies.
        Editing the settings for this option, or turning - it on if it was off, is not yet supported using this web-based - editor.
    - - - - - - - - - - - - - - - - - -
    -

    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    -
    - - - - - diff --git a/templates/edit-actions-for-url-filter b/templates/edit-actions-for-url-filter deleted file mode 100644 index 06020cba..00000000 --- a/templates/edit-actions-for-url-filter +++ /dev/null @@ -1,6 +0,0 @@ - - - - -   @description@ (@name@) - diff --git a/templates/edit-actions-list b/templates/edit-actions-list deleted file mode 100644 index 24d62957..00000000 --- a/templates/edit-actions-list +++ /dev/null @@ -1,260 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-list,v $ -# -# Purpose : Template used to edit the actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: edit-actions-list,v $ -# Revision 1.13 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.12 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.11 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.10 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.9 2002/03/05 00:24:51 jongfoster -# Patch to always edit the current actions file. -# -# Revision 1.8 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.7 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.6 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.5 2002/01/17 21:21:05 jongfoster -# DOS->Unix line endings -# -# Revision 1.4 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Browser support for the CSS on this page: -# MS Internet Explorer 5.5 - Yes - everything works. -# Netscape 6.2 - Yes - everything works. -# Netscape 4.75 - No - CSS buttons look really bad, but they are -# usable. Everything else works. -# Opera 5.12 - Yes - everything works. -# MS Internet Explorer 4+ - Untested -# MS IE 3.x, NS3.x - Untested (Don't support CSS, so everything -# should work, but will look ugly). -# Mozilla >=0.6 - Untested -# -# All browsers should work, you just might not get the pretty CSS buttons. -# -# If you're favorite browser isn't listed/tested, please test and add it. -# -# -############################################################################# -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# -# -############################################################################# - - - - - - - - - -Privoxy: Edit actions file - - - - - - - - - - - - -
    -

    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@

    -
    - -
    - - - - - -
    -

    Editing Actions File

    -

    Insert new section at top

    -
    - -@sections@ - -
    - - - - - - - - - - -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - diff --git a/templates/edit-actions-list-section b/templates/edit-actions-list-section deleted file mode 100644 index 2de8ce24..00000000 --- a/templates/edit-actions-list-section +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-section,v $ -# -# Purpose : Template which forms part of edit-actions-list -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: edit-actions-list-section,v $ -# Revision 1.6 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.5 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.4 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.3 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# sectionid -# urls -# -############################################################################# -# -# ** Important note: ** -# -# It is important to keep this file small. That's why all the -# identifiers in the HTML are short and cryptic. Currently, the main -# edit-actions page is ~300k. Before it was optimized, it was ~550k. -# -############################################################################# - - - - - - - - - - - - - - -@urls@ - - - - - - - -
    Actions:Edit@actions@
    ----
    URLs:Add 
    -
    Advanced: - - - - - - - - - -
      @if-s-prev-exists-start@Move section up   @if-s-prev-exists-end@   Insert new section below  
      @if-s-next-exists-start@Move section down   @if-s-next-exists-end@   @if-empty-section-start@Delete whole section  @if-empty-section-end@
    -
    -

     

    - diff --git a/templates/edit-actions-list-url b/templates/edit-actions-list-url deleted file mode 100644 index fcaa7c4d..00000000 --- a/templates/edit-actions-list-url +++ /dev/null @@ -1,73 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-url,v $ -# -# Purpose : Template which forms part of edit-actions-list -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: edit-actions-list-url,v $ -# Revision 1.6 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.5 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.4 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.3 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# sectionid -# urls -# -############################################################################# -# -# ** Important note: ** -# -# It is *extremely* important to keep this file small. That's why all the -# identifiers in the HTML are short and cryptic. Currently, the main -# edit-actions page is ~300k. Before it was optimized, it was ~550k. -# -############################################################################# -  -Remove   Edit  -@url-html@ - diff --git a/templates/edit-actions-remove-url-form b/templates/edit-actions-remove-url-form deleted file mode 100644 index 596391e9..00000000 --- a/templates/edit-actions-remove-url-form +++ /dev/null @@ -1,153 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-remove-url-form,v $ -# -# Purpose : Template used to confirm removal of a particular URL -# pattern from an actions file. Only used on browsers that -# don't support JavaScript. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: edit-actions-remove-url-form,v $ -# Revision 1.9 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.8 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.7 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.6 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.5 2002/03/03 10:29:12 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.4 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.3 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.2 2002/01/17 21:21:05 jongfoster -# DOS->Unix line endings -# -# Revision 1.1 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# filename -# ver -# section -# pattern -# oldval -# -############################################################################# - - - - - - - - - -Privoxy: Remove URL Pattern - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    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@

    -
    -

    Remove URL Pattern

    -

    Are you sure you want to delete this URL pattern? The pattern is:

    -

    @u@

    -

    - OK -   - Cancel -

    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - - diff --git a/templates/edit-actions-url-form b/templates/edit-actions-url-form deleted file mode 100644 index f3766b43..00000000 --- a/templates/edit-actions-url-form +++ /dev/null @@ -1,171 +0,0 @@ -############################################################################## -# -# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-url-form,v $ -# -# Purpose : Template used to edit a URL pattern in an actions file. -# -# -# Copyright : Written by and Copyright (C) 2001 the SourceForge -# Privoxy team. http://www.privoxy.org/ -# -# Original Author: Copyright (C) 2001 Jonathan Foster -# http://www.jon-foster.co.uk/ -# -# This program is free software; you can redistribute it -# and/or modify it under the terms of the GNU General -# Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will -# be useful, but WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. See the GNU General Public -# License for more details. -# -# The GNU General Public License should be included with -# this file. If not, you can view it at -# http://www.gnu.org/copyleft/gpl.html -# or write to the Free Software Foundation, Inc., 59 -# Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Revisions : -# $Log: edit-actions-url-form,v $ -# Revision 1.9 2002/03/24 15:23:33 jongfoster -# Name changes -# -# Revision 1.8 2002/03/24 11:01:06 swa -# name change -# -# Revision 1.7 2002/03/23 16:18:15 swa -# renamed every reference to the old name with foobar. -# fixed "application foobar application" tag, fixed -# "the foobar" with "foobar". left junkbuster in cvs -# comments and remarks to history untouched. should -# make final rename easier. -# -# Revision 1.6 2002/03/16 15:22:19 jongfoster -# Moving 'alpha' warning to the end of the page -# -# Revision 1.5 2002/03/03 10:29:13 swa -# point users to the right feedback forms, -# not necessarily the developer list. -# -# Revision 1.4 2002/01/23 00:26:45 jongfoster -# Reducing length of URLs -# Where encoded and unencoded versions of a string existed, removing -# the unencoded one. -# -# Revision 1.3 2002/01/17 21:33:00 jongfoster -# Replacing all references to the URL of the config interface -# with @default-cgi@ -# -# Revision 1.2 2002/01/17 21:21:05 jongfoster -# DOS->Unix line endings -# -# Revision 1.1 2001/11/13 00:58:18 jongfoster -# New version of actions file editor templates -# -# -############################################################################## -# -# Standard support: -# -# This file currently produces valid HTML 4.01 Strict. -# -# If you change it, please save the generated page from your web browser -# and then upload it to http://validator.w3.org/ for checking. -# -############################################################################# -# -# Available variables include: -# -# f - filename -# v - version -# s - section -# p - pattern -# u - old value of URL -# -############################################################################# - - - - - - - - - -Privoxy: Edit URL Pattern - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    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@

    -
    -

    Edit URL Pattern

    -
    -

    - - - -
    -   -   - Cancel -

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    - Valid HTML 4.01 Strict -
    - - - - - diff --git a/templates/no-such-domain b/templates/no-such-domain index e119f759..a8c02024 100644 --- a/templates/no-such-domain +++ b/templates/no-such-domain @@ -1,6 +1,6 @@ ########################################################## # -# No-Such-Domain Error Output template for Privoxy. +# No-Such-Domain Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -32,8 +32,8 @@ # my-hostname: # The hostname associated with my-ip-addr # admin-address: -# The email address of the proxy's administrator, as configured -# in the 'config' file +# The email address of the pxoxy's administrator, as configured +# in the config file # default-cgi: # The URL for the "main menu" builtin CGI of this proxy # menu: @@ -47,38 +47,32 @@ # 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. # - 404 - No such Domain (Privoxy@@my-hostname@) + 404 - No such Domain (Junkbuster@@my-hostname@) @@ -92,16 +86,33 @@

    404

    -

    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@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    + + + +

    No such domain

    -

    Your request for http://@hostport@@path@ could not be fulfilled, because - the domain name @host@ could not be resolved.

    +

    Your request for http://@hostport-html@@path-html@ could not be fulfilled, because + the domain name @host-html@ could not be resolved.

    This is often a temporary failiure, so you might just try again.

    @@ -110,61 +121,24 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - - diff --git a/templates/show-request b/templates/show-request deleted file mode 100644 index c1badf40..00000000 --- a/templates/show-request +++ /dev/null @@ -1,172 +0,0 @@ -########################################################## -# -# Show-Request-CGI Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. -# - - - - Privoxy@@my-hostname@ - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    Show-Request

    -
    - 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. -
    - -

    Original Client Request:

    -
    -
    @client-request@
    -
    - -

    Processed Request:

    -
    -
    @processed-request@
    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/show-status b/templates/show-status index 6d9ccfca..e3f8e258 100644 --- a/templates/show-status +++ b/templates/show-status @@ -1,6 +1,6 @@ ########################################################## # -# Show-Status-CGI Output template for Privoxy. +# Show-Status-CGI Output template for junkbuster 2.9.x # # USING HTML TEMPLATES: # --------------------- @@ -14,7 +14,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -47,10 +47,10 @@ # software. # # redirect-url: -# The URL to a script that will redirect to the Privoxy +# The URL to a script that will redirect to the junkbuster # documentation for a given item # invocation: -# The command line with whitch Privoxy was invoked +# The command line with whitch junkbuster was invoked # options: # The options read from the configfile, linked to their # explanations, plus warnings if parsing acl or forward @@ -59,7 +59,7 @@ # A HTML-formatted list of the individual source file cvs versions # defines: # A HTML-formatted list of all conditional #defines used when -# Privoxy was compiled +# junkbuster was compiled # # # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS: @@ -67,20 +67,12 @@ # # 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 @@ -94,21 +86,36 @@ # 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 +# - Privoxy@@my-hostname@: Proxy Status + Junkbuster@@my-hostname@: Proxy Status @@ -119,9 +126,26 @@ + + + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + + + + + + - + - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + - + + + + + + + + + + - - + + + + -
    -

    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@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    +
    +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    @@ -144,7 +168,7 @@
    @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@. There haven't been any requests so far. @@ -153,6 +177,7 @@

    The following files are in use:

    @@ -168,167 +193,71 @@
    -

    Conditional #defines:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #define Enabled? Effects when enabled
    FEATURE_ACL@if-FEATURE_ACL-then@ Yes @else-not-FEATURE_ACL@ No @endif-FEATURE_ACL@Allows the use of an ACL to control access to the proxy by IP address.
    FEATURE_CGI_EDIT_ACTIONS@if-FEATURE_CGI_EDIT_ACTIONS-then@ Yes @else-not-FEATURE_CGI_EDIT_ACTIONS@ No @endif-FEATURE_CGI_EDIT_ACTIONS@Allows the use of the web-based actions file - editor@if-FEATURE_CGI_EDIT_ACTIONS-then@, which is here@else-not-FEATURE_CGI_EDIT_ACTIONS@@endif-FEATURE_CGI_EDIT_ACTIONS@.
    FEATURE_COOKIE_JAR@if-FEATURE_COOKIE_JAR-then@ Yes @else-not-FEATURE_COOKIE_JAR@ No @endif-FEATURE_COOKIE_JAR@Allows the use of a "cookie jar" file to capture cookies.
    FEATURE_FAST_REDIRECTS@if-FEATURE_FAST_REDIRECTS-then@ Yes @else-not-FEATURE_FAST_REDIRECTS@ No @endif-FEATURE_FAST_REDIRECTS@Allows the +fast-redirects action, to bypass redirect and logging scripts.
    FEATURE_FORCE_LOAD@if-FEATURE_FORCE_LOAD-then@ Yes @else-not-FEATURE_FORCE_LOAD@ No @endif-FEATURE_FORCE_LOAD@Allows bypassing all filtering for a single page using the prefix "@FORCE_PREFIX@".
    FEATURE_IMAGE_BLOCKING@if-FEATURE_IMAGE_BLOCKING-then@ Yes @else-not-FEATURE_IMAGE_BLOCKING@ No @endif-FEATURE_IMAGE_BLOCKING@Allows the +image ation, to send "blocked" images instead of HTML.
    FEATURE_IMAGE_DETECT_MSIE@if-FEATURE_IMAGE_DETECT_MSIE-then@ Yes @else-not-FEATURE_IMAGE_DETECT_MSIE@ No @endif-FEATURE_IMAGE_DETECT_MSIE@Enables automatic detection of image and HTML requests from - Microsoft Internet Explorer users, overriding the setting of - +image in the actions file.
    FEATURE_KILL_POPUPS@if-FEATURE_KILL_POPUPS-then@ Yes @else-not-FEATURE_KILL_POPUPS@ No @endif-FEATURE_KILL_POPUPS@Allows the +no-popups action, to block JavaScript popups.
    FEATURE_NO_GIFS@if-FEATURE_NO_GIFS-then@ Yes @else-not-FEATURE_NO_GIFS@ No @endif-FEATURE_NO_GIFS@Use PNG instead of GIF for the built-in images.
    FEATURE_PTHREAD@if-FEATURE_PTHREAD-then@ Yes @else-not-FEATURE_PTHREAD@ No @endif-FEATURE_PTHREAD@Use POSIX threads rather than native threads
    FEATURE_STATISTICS@if-FEATURE_STATISTICS-then@ Yes @else-not-FEATURE_STATISTICS@ No @endif-FEATURE_STATISTICS@Enables the statistics function.
    FEATURE_TOGGLE@if-FEATURE_TOGGLE-then@ Yes @else-not-FEATURE_TOGGLE@ No @endif-FEATURE_TOGGLE@Allow Privoxy to be "disabled" so it is just a normal non-blocking non-anonymizing proxy.
    FEATURE_TRUST@if-FEATURE_TRUST-then@ Yes @else-not-FEATURE_TRUST@ No @endif-FEATURE_TRUST@Allows the use of trust files.
    REGEX_GNU@if-REGEX_GNU-then@ Yes @else-not-REGEX_GNU@ No @endif-REGEX_GNU@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.
    REGEX_PCRE@if-REGEX_PCRE-then@ Yes @else-not-REGEX_PCRE@ No @endif-REGEX_PCRE@
    STATIC_PCRE@if-STATIC_PCRE-then@ Yes @else-not-STATIC_PCRE@ No @endif-STATIC_PCRE@Use the supplied statically-linked PCRE library. This is set automatically - by ./configure if you do not have the libpcre installed.
    STATIC_PCRS@if-STATIC_PCRS-then@ Yes @else-not-STATIC_PCRS@ No @endif-STATIC_PCRS@Use the supplied statically-linked PCRS library. This is set automatically - by ./configure if you do not have the libpcrs installed.
    +

    Actions List:

    +
    @alist@
    -

    More Privoxy:

    -
      @menu@
    +
    +

    Regex Filter List:

    +
    @rlist@
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    +
    +

    Trust List:

    +
    @tlist@
    +
    +

    Source code versions:

    +
    @sourceversions@
    +
    +

    Conditional #defines:

    +
      @defines@
    -

    Local Privoxy support:

    +

    More Junkbuster:

    +
      @menu@
    +
    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - + \ No newline at end of file diff --git a/templates/show-status-file b/templates/show-status-file index e8a2b7e6..659cf0d3 100644 --- a/templates/show-status-file +++ b/templates/show-status-file @@ -1,6 +1,6 @@ ########################################################## # -# Show-Status-CGI Output template for Privoxy. +# Show-Status-CGI Output template for junkbuster 2.9.x # (Variant for the show-file mode) # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -60,23 +60,15 @@ # # 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. # - Privoxy@@my-hostname@: Contents of @file-description@ + Junkbuster@@my-hostname@: Contents of @file-description@ @@ -87,68 +79,50 @@ - - - - # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - + + + + -
    -

    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@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    -

    Contents of @file-description@ (@filepath@)

    -
    @contents@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems!
    Use at your own risk. See the license for details.

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    + +

    Feel free to mail the developers + with any problems you might have +

    +

    Contents of @file-description@ (@filepath@)

    +
    @contents@
    +
    -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    +

    Back to the main page.

    - + \ No newline at end of file diff --git a/templates/show-url-info b/templates/show-url-info index 76fc5f04..56c3373c 100644 --- a/templates/show-url-info +++ b/templates/show-url-info @@ -1,6 +1,6 @@ ########################################################## # -# Show-Url-Info-CGI Output template for Privoxy. +# Show-Url-Info-CGI Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -52,23 +52,17 @@ # # unstable: # this is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # url-given: # The CGI was called with a url parameter. In that case, the # following symbols are available: # url: # The given URL +# url-html: +# The given URL, HTML-encoded # default: # The system default for actions # matches: @@ -82,7 +76,7 @@ - Privoxy@@my-hostname@ URL Info + Junkbuster@@my-hostname@ URL Info @@ -93,22 +87,38 @@ + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + + + + + + + + @@ -116,7 +126,7 @@ @@ -126,7 +136,7 @@

    Look up the actions for a new URL:

    - + @@ -135,61 +145,24 @@ - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - -
    -

    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@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    +
    - -

    NOTE:

    -

    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.

    -

     

    - -

    Matches for @url@:

    +

    System default actions:

    +

    {@default@}

    +
    +

    Matches for http://@url-html@:

    @matches@

    Final results:

    -

    @final@

    +

    @final@

    -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    diff --git a/templates/show-version b/templates/show-version deleted file mode 100644 index debd5d71..00000000 --- a/templates/show-version +++ /dev/null @@ -1,174 +0,0 @@ -########################################################## -# -# Show-Status-CGI Output template for Privoxy. -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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. - - - - Privoxy@@my-hostname@: Detailed proxy version information - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    Source code versions:

    -

    (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 @version@ - and the type of download you got.)

    -

     

    -
    @sourceversions@
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/toggle b/templates/toggle deleted file mode 100644 index 6dc0f009..00000000 --- a/templates/toggle +++ /dev/null @@ -1,199 +0,0 @@ -########################################################## -# -# Toggle Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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@ -# - - - - - @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@ - - - - - - - - - - - - - - - - - - - - - - - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - - - - - - - - - - -
    -

    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@

    -
    -

    Privoxy is @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@

    -
    -

    When enabled, Privoxy performs its magic - blocking - adverts, filtering cookies, regex-filtering, etc.

    -

    When disabled, Privoxy behaves as a normal HTTP proxy, - and will not affect your web browsing.

    -

    Click - here to @if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@ Privoxy.

    -
    -
    -

    Bookmarklets

    -
    -

    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 - not by clicking the links - below (although that will work for testing).

    - -

    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.

    - - - -

    Credit: The site which gave me the general idea for these - bookmarklets is - www.bookmarklets.com. - They have more information - about bookmarklets.

    -
    -
    -

    More Privoxy:

    -
      @menu@
    -
    -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    -
    -

    Local Privoxy support:

    - - -

    You can consult the online documentation for more information about this Privoxy installation. - - - -

    Address e-mail questions about this service to - @admin-address@, - who will be glad to help you. - - -

    -
    - - - diff --git a/templates/toggle-mini b/templates/toggle-mini deleted file mode 100644 index 68f87f5a..00000000 --- a/templates/toggle-mini +++ /dev/null @@ -1,90 +0,0 @@ -########################################################## -# -# Toggle Output template for Privoxy. -# -# -# USING HTML TEMPLATES: -# --------------------- -# -# Template files are written win plain HTML, with a few -# additions: -# -# - Lines that start with a '#' character like this one -# are ignored -# -# - Each item in the below list of exported symbols will -# be replaced by dynamically generated text, if they -# are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. -# -# - One special application of this is to make whole blocks -# of the HTML template disappear if the condition -# is not given. Simply enclose the block between the two -# strings @if-start and if--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
  • 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@ -# - - - - - @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@ - - - - -
    -Privoxy is -@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@. -@if-enabled-display-then@[Disable]@else-not-enabled-display@[Enable]@endif-enabled-display@ -
    -[Close] -
    - - diff --git a/templates/untrusted b/templates/untrusted index 9db1aa02..2bf22284 100644 --- a/templates/untrusted +++ b/templates/untrusted @@ -1,6 +1,6 @@ ########################################################## # -# "Untrusted" Error Output template for Privoxy. +# "Untrusted" Error Output template for junkbuster 2.9.x. # # # USING HTML TEMPLATES: @@ -15,7 +15,7 @@ # - Each item in the below list of exported symbols will # be replaced by dynamically generated text, if they # are enclosed in '@'-characters. E.g. The string @version@ -# will be replaced by the version number of Privoxy. +# will be replaced by the version number of Junkbuster. # # - One special application of this is to make whole blocks # of the HTML template disappear if the condition @@ -49,10 +49,16 @@ # # 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 @@ -63,20 +69,12 @@ # # unstable: # This is an alpha or beta release of the proxy software -# have-adminaddr-info: -# An e-mail address for the local Privoxy adminstrator has -# been specified and is available through the "admin-address" -# symbol # have-proxy-info: # A URL for online documentation about this proxy has been # specified and is available through the "proxy-info-url" # symbol -# have-help-info: -# If either have-proxy-info is true or have-adminaddr-info is -# true, have-help-info is true. Used to conditionally include -# a grey box for any and all help info. # force-support: -# Privoxy has been compiled with support for forced loading +# Junkbuster has been compiled with support for forced loading # of blocked content. In that case, the symbol "force-prefix" is # avaiable, which translates to the FORCE_PREFIX # have-trust-info: @@ -88,7 +86,7 @@ - Untrusted request (Privoxy@@my-hostname@) + Untrusted request (Junkbuster@@my-hostname@) @@ -103,17 +101,35 @@

    UNTRUSTED

    -

    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@

    +

    This is the Internet JUNKBUSTER + @version@ on @my-hostname@ (@my-ip-address@), port @my-port@

    + +# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in + + +

    Please note that this is a @code-status@ release, + of the proxy software, not intended for production systems! +
    Use at your own risk. See the license for details.
    +

    + +

    Feel free to mail the developers + with any problems you might have +

    + + + + +

    Request for untrusted URL

    -

    Your request for @hostport@@path@ was blocked, +

    Your request for @hostport-html@@path-html@ was blocked, because neither the request URL itself, nor its referrer - (@referrer@) were trusted. + (@referrer-html@) were trusted.

    (You can go there anyway.)

    @@ -148,62 +164,26 @@ -

    More Privoxy:

    +

    More Junkbuster:

      @menu@
    - -# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in - - -

    Please note that this @code-status@ release - of the proxy software is not intended for production systems! -
    Use at your own risk. See the license for details.
    -

    -

    -

    Support and Service via Sourceforge

    -

    -We value your feedback. However, to provide you with the best support, -please note: -

    -

    -

    -For any other issues, feel free to use the mailing lists. -

    - - - - - -

    Local Privoxy support:

    +

    If you have any questions about this service, -

    You can consult the online documentation for more information about this Privoxy installation. + consult the online documentation or - -

    Address e-mail questions about this service to - @admin-address@, + send mail to @admin-address@ who will be glad to help you. - -

    - - + \ No newline at end of file diff --git a/testdrive.status b/testdrive.status deleted file mode 100644 index 36275484..00000000 --- a/testdrive.status +++ /dev/null @@ -1,31 +0,0 @@ -CHUNK: ASSIGNED TO: RUN1: RUN2: ---------------------------------------------------------------------- -testdrive-intl-aa -testdrive-intl-ab -testdrive-intl-ac -testdrive-intl-ad -testdrive-intl-ae -testdrive-intl-af -testdrive-intl-ag -testdrive-intl-ah -testdrive-intl-ai swa x -testdrive-intl-aj -testdrive-intl-ak -testdrive-unstable -testdrive-us-aa -testdrive-us-ab -testdrive-us-ac -testdrive-us-ad Hal x -testdrive-us-ae -testdrive-us-af -testdrive-us-ag -testdrive-us-ah -testdrive-us-ai -testdrive-us-aj -testdrive-us-ak -testdrive-us-al -testdrive-us-am -testdrive-us-an -testdrive-us-ao -testdrive-us-ap - diff --git a/urlmatch.c b/urlmatch.c deleted file mode 100644 index 772261de..00000000 --- a/urlmatch.c +++ /dev/null @@ -1,824 +0,0 @@ -const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.6 2002/03/24 13:25:43 swa Exp $"; -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/urlmatch.c,v $ - * - * Purpose : Declares functions to match URLs against URL - * patterns. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: urlmatch.c,v $ - * Revision 1.6 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.5 2002/03/13 00:27:05 jongfoster - * Killing warnings - * - * Revision 1.4 2002/03/07 03:46:17 oes - * Fixed compiler warnings - * - * Revision 1.3 2002/03/03 14:51:11 oes - * Fixed CLF logging: Added ocmd member for client's request to struct http_request - * - * Revision 1.2 2002/01/21 00:14:09 jongfoster - * Correcting comment style - * Fixing an uninitialized memory bug in create_url_spec() - * - * Revision 1.1 2002/01/17 20:53:46 jongfoster - * Moving all our URL and URL pattern parsing code to the same file - it - * was scattered around in filters.c, loaders.c and parsers.c. - * - * Providing a single, simple url_match(pattern,url) function - rather than - * the 3-line match routine which was repeated all over the place. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Providing parse_http_url() so that URLs can be parsed without faking a - * HTTP request line for parse_http_request() or repeating the parsing - * code (both of which were techniques that were actually in use). - * - * Standardizing that struct http_request is used to represent a URL, and - * struct url_spec is used to represent a URL pattern. (Before, URLs were - * represented as seperate variables and a partially-filled-in url_spec). - * - * - *********************************************************************/ - - -#include "config.h" - -#ifndef _WIN32 -#include -#include -#endif - -#include -#include -#include -#include - -#if !defined(_WIN32) && !defined(__OS2__) -#include -#endif - -#include "project.h" -#include "urlmatch.h" -#include "ssplit.h" -#include "miscutil.h" -#include "errlog.h" - -const char urlmatch_h_rcs[] = URLMATCH_H_VERSION; - -/* Fix a problem with Solaris. There should be no effect on other - * platforms. - * Solaris's isspace() is a macro which uses it's argument directly - * as an array index. Therefore we need to make sure that high-bit - * characters generate +ve values, and ideally we also want to make - * the argument match the declared parameter type of "int". - * - * Why did they write a character function that can't take a simple - * "char" argument? Doh! - */ -#define ijb_isupper(__X) isupper((int)(unsigned char)(__X)) -#define ijb_tolower(__X) tolower((int)(unsigned char)(__X)) - - -/********************************************************************* - * - * Function : free_http_request - * - * Description : Freez a http_request structure - * - * Parameters : - * 1 : http = points to a http_request structure to free - * - * Returns : N/A - * - *********************************************************************/ -void free_http_request(struct http_request *http) -{ - assert(http); - - freez(http->cmd); - freez(http->ocmd); - freez(http->gpc); - freez(http->host); - freez(http->url); - freez(http->hostport); - freez(http->path); - freez(http->ver); - freez(http->host_ip_addr_str); - freez(http->dbuffer); - freez(http->dvec); - http->dcount = 0; -} - - -/********************************************************************* - * - * Function : parse_http_url - * - * Description : Parse out the host and port from the URL. Find the - * hostname & path, port (if ':'), and/or password (if '@') - * - * Parameters : - * 1 : url = URL (or is it URI?) to break down - * 2 : http = pointer to the http structure to hold elements. - * Will be zeroed before use. Note that this - * function sets the http->gpc and http->ver - * members to NULL. - * 3 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out of memory - * JB_ERR_CGI_PARAMS on malformed command/URL - * or >100 domains deep. - * - *********************************************************************/ -jb_err parse_http_url(const char * url, - struct http_request *http, - struct client_state *csp) -{ - /* - * Zero out the results structure - */ - memset(http, '\0', sizeof(*http)); - - - /* - * Save our initial URL - */ - http->url = strdup(url); - if (http->url == NULL) - { - return JB_ERR_MEMORY; - } - - - /* - * Split URL into protocol,hostport,path. - */ - { - char *buf; - char *url_noproto; - char *url_path; - - buf = strdup(url); - if (buf == NULL) - { - return JB_ERR_MEMORY; - } - - /* Find the start of the URL in our scratch space */ - url_noproto = buf; - if (strncmpic(url_noproto, "http://", 7) == 0) - { - url_noproto += 7; - http->ssl = 0; - } - else if (strncmpic(url_noproto, "https://", 8) == 0) - { - url_noproto += 8; - http->ssl = 1; - } - else - { - http->ssl = 0; - } - - url_path = strchr(url_noproto, '/'); - if (url_path != NULL) - { - /* - * Got a path. - * - * NOTE: The following line ignores the path for HTTPS URLS. - * This means that you get consistent behaviour if you type a - * https URL in and it's parsed by the function. (When the - * URL is actually retrieved, SSL hides the path part). - */ - http->path = strdup(http->ssl ? "/" : url_path); - *url_path = '\0'; - http->hostport = strdup(url_noproto); - } - else - { - /* - * Repair broken HTTP requests that don't contain a path, - * or CONNECT requests - */ - http->path = strdup("/"); - http->hostport = strdup(url_noproto); - } - - free(buf); - - if ( (http->path == NULL) - || (http->hostport == NULL)) - { - free(buf); - free_http_request(http); - return JB_ERR_MEMORY; - } - } - - - /* - * Split hostport into user/password (ignored), host, port. - */ - { - char *buf; - char *host; - char *port; - - buf = strdup(http->hostport); - if (buf == NULL) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - - /* check if url contains username and/or password */ - host = strchr(buf, '@'); - if (host != NULL) - { - /* Contains username/password, skip it and the @ sign. */ - host++; - } - else - { - /* No username or password. */ - host = buf; - } - - /* check if url contains port */ - port = strchr(host, ':'); - if (port != NULL) - { - /* Contains port */ - /* Terminate hostname and point to start of port string */ - *port++ = '\0'; - http->port = atoi(port); - } - else - { - /* No port specified. */ - http->port = (http->ssl ? 143 : 80); - } - - http->host = strdup(host); - - free(buf); - - if (http->host == NULL) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - } - - - /* - * Split domain name so we can compare it against wildcards - */ - { - char *vec[BUFFER_SIZE]; - size_t size; - char *p; - - http->dbuffer = strdup(http->host); - if (NULL == http->dbuffer) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - - /* map to lower case */ - for (p = http->dbuffer; *p ; p++) - { - *p = tolower((int)(unsigned char)*p); - } - - /* split the domain name into components */ - http->dcount = ssplit(http->dbuffer, ".", vec, SZ(vec), 1, 1); - - if (http->dcount <= 0) - { - /* - * Error: More than SZ(vec) components in domain - * or: no components in domain - */ - free_http_request(http); - return JB_ERR_PARSE; - } - - /* save a copy of the pointers in dvec */ - size = http->dcount * sizeof(*http->dvec); - - http->dvec = (char **)malloc(size); - if (NULL == http->dvec) - { - free_http_request(http); - return JB_ERR_MEMORY; - } - - memcpy(http->dvec, vec, size); - } - - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : parse_http_request - * - * Description : Parse out the host and port from the URL. Find the - * hostname & path, port (if ':'), and/or password (if '@') - * - * Parameters : - * 1 : req = HTTP request line to break down - * 2 : http = pointer to the http structure to hold elements - * 3 : csp = Current client state (buffers, headers, etc...) - * - * Returns : JB_ERR_OK on success - * JB_ERR_MEMORY on out of memory - * JB_ERR_CGI_PARAMS on malformed command/URL - * or >100 domains deep. - * - *********************************************************************/ -jb_err parse_http_request(const char *req, - struct http_request *http, - struct client_state *csp) -{ - char *buf; - char *v[10]; - int n; - jb_err err; - int is_connect = 0; - - memset(http, '\0', sizeof(*http)); - - buf = strdup(req); - if (buf == NULL) - { - return JB_ERR_MEMORY; - } - - n = ssplit(buf, " \r\n", v, SZ(v), 1, 1); - if (n != 3) - { - free(buf); - return JB_ERR_PARSE; - } - - /* this could be a CONNECT request */ - if (strcmpic(v[0], "connect") == 0) - { - /* Secure */ - is_connect = 1; - } - /* or it could be any other basic HTTP request type */ - else if ((0 == strcmpic(v[0], "get")) - || (0 == strcmpic(v[0], "head")) - || (0 == strcmpic(v[0], "post")) - || (0 == strcmpic(v[0], "put")) - || (0 == strcmpic(v[0], "delete")) - - /* or a webDAV extension (RFC2518) */ - || (0 == strcmpic(v[0], "propfind")) - || (0 == strcmpic(v[0], "proppatch")) - || (0 == strcmpic(v[0], "move")) - || (0 == strcmpic(v[0], "copy")) - || (0 == strcmpic(v[0], "mkcol")) - || (0 == strcmpic(v[0], "lock")) - || (0 == strcmpic(v[0], "unlock")) - ) - { - /* Normal */ - is_connect = 0; - } - else - { - /* Unknown HTTP method */ - free(buf); - return JB_ERR_PARSE; - } - - err = parse_http_url(v[1], http, csp); - if (err) - { - free(buf); - return err; - } - - /* - * Copy the details into the structure - */ - http->ssl = is_connect; - http->cmd = strdup(req); - http->gpc = strdup(v[0]); - http->ver = strdup(v[2]); - - if ( (http->cmd == NULL) - || (http->gpc == NULL) - || (http->ver == NULL) ) - { - free(buf); - free_http_request(http); - return JB_ERR_MEMORY; - } - - return JB_ERR_OK; -} - - -/********************************************************************* - * - * Function : simple_domaincmp - * - * Description : Domain-wise Compare fqdn's. The comparison is - * both left- and right-anchored. The individual - * domain names are compared with simplematch(). - * This is only used by domain_match. - * - * Parameters : - * 1 : pv = array of patterns to compare - * 2 : fv = array of domain components to compare - * 3 : len = length of the arrays (both arrays are the - * same length - if they weren't, it couldn't - * possibly be a match). - * - * Returns : 0 => domains are equivalent, else no match. - * - *********************************************************************/ -static int simple_domaincmp(char **pv, char **fv, int len) -{ - int n; - - for (n = 0; n < len; n++) - { - if (simplematch(pv[n], fv[n])) - { - return 1; - } - } - - return 0; - -} - - -/********************************************************************* - * - * Function : domain_match - * - * Description : Domain-wise Compare fqdn's. Governed by the bimap in - * pattern->unachored, the comparison is un-, left-, - * right-anchored, or both. - * The individual domain names are compared with - * simplematch(). - * - * Parameters : - * 1 : pattern = a domain that may contain a '*' as a wildcard. - * 2 : fqdn = domain name against which the patterns are compared. - * - * Returns : 0 => domains are equivalent, else no match. - * - *********************************************************************/ -static int domain_match(const struct url_spec *pattern, const struct http_request *fqdn) -{ - char **pv, **fv; /* vectors */ - int plen, flen; - int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT); - - plen = pattern->dcount; - flen = fqdn->dcount; - - if (flen < plen) - { - /* fqdn is too short to match this pattern */ - return 1; - } - - pv = pattern->dvec; - fv = fqdn->dvec; - - if (unanchored == ANCHOR_LEFT) - { - /* - * Right anchored. - * - * Convert this into a fully anchored pattern with - * the fqdn and pattern the same length - */ - fv += (flen - plen); /* flen - plen >= 0 due to check above */ - return simple_domaincmp(pv, fv, plen); - } - else if (unanchored == 0) - { - /* Fully anchored, check length */ - if (flen != plen) - { - return 1; - } - return simple_domaincmp(pv, fv, plen); - } - else if (unanchored == ANCHOR_RIGHT) - { - /* Left anchored, ignore all extra in fqdn */ - return simple_domaincmp(pv, fv, plen); - } - else - { - /* Unanchored */ - int n; - int maxn = flen - plen; - for (n = 0; n <= maxn; n++) - { - if (!simple_domaincmp(pv, fv, plen)) - { - return 0; - } - /* - * Doesn't match from start of fqdn - * Try skipping first part of fqdn - */ - fv++; - } - return 1; - } - -} - - -/********************************************************************* - * - * Function : create_url_spec - * - * Description : Creates a "url_spec" structure from a string. - * When finished, free with unload_url(). - * - * Parameters : - * 1 : url = Target url_spec to be filled in. Will be - * zeroed before use. - * 2 : buf = Source pattern, null terminated. NOTE: The - * contents of this buffer are destroyed by this - * function. If this function succeeds, the - * buffer is copied to url->spec. If this - * function fails, the contents of the buffer - * are lost forever. - * - * Returns : JB_ERR_OK - Success - * JB_ERR_MEMORY - Out of memory - * JB_ERR_PARSE - Cannot parse regex (Detailed message - * written to system log) - * - *********************************************************************/ -jb_err create_url_spec(struct url_spec * url, const char * buf) -{ - char *p; - - assert(url); - assert(buf); - - /* Zero memory */ - memset(url, '\0', sizeof(*url)); - - /* save a copy of the orignal specification */ - if ((url->spec = strdup(buf)) == NULL) - { - return JB_ERR_MEMORY; - } - - if ((p = strchr(buf, '/')) != NULL) - { - if (NULL == (url->path = strdup(p))) - { - freez(url->spec); - return JB_ERR_MEMORY; - } - url->pathlen = strlen(url->path); - *p = '\0'; - } - else - { - url->path = NULL; - url->pathlen = 0; - } -#ifdef REGEX - if (url->path) - { - int errcode; - char rebuf[BUFFER_SIZE]; - - if (NULL == (url->preg = zalloc(sizeof(*url->preg)))) - { - freez(url->spec); - freez(url->path); - return JB_ERR_MEMORY; - } - - sprintf(rebuf, "^(%s)", url->path); - - errcode = regcomp(url->preg, rebuf, - (REG_EXTENDED|REG_NOSUB|REG_ICASE)); - if (errcode) - { - size_t errlen = regerror(errcode, - url->preg, rebuf, sizeof(rebuf)); - - if (errlen > (sizeof(rebuf) - (size_t)1)) - { - errlen = sizeof(rebuf) - (size_t)1; - } - rebuf[errlen] = '\0'; - - log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", - url->spec, rebuf); - - freez(url->spec); - freez(url->path); - freez(url->preg); - - return JB_ERR_PARSE; - } - } -#endif - if ((p = strchr(buf, ':')) == NULL) - { - url->port = 0; - } - else - { - *p++ = '\0'; - url->port = atoi(p); - } - - if (buf[0] != '\0') - { - char *v[150]; - size_t size; - - /* Parse domain part */ - if (buf[strlen(buf) - 1] == '.') - { - url->unanchored |= ANCHOR_RIGHT; - } - if (buf[0] == '.') - { - url->unanchored |= ANCHOR_LEFT; - } - - /* split domain into components */ - - url->dbuffer = strdup(buf); - if (NULL == url->dbuffer) - { - freez(url->spec); - freez(url->path); -#ifdef REGEX - freez(url->preg); -#endif /* def REGEX */ - return JB_ERR_MEMORY; - } - - /* map to lower case */ - for (p = url->dbuffer; *p ; p++) - { - *p = tolower((int)(unsigned char)*p); - } - - /* split the domain name into components */ - url->dcount = ssplit(url->dbuffer, ".", v, SZ(v), 1, 1); - - if (url->dcount < 0) - { - freez(url->spec); - freez(url->path); -#ifdef REGEX - freez(url->preg); -#endif /* def REGEX */ - freez(url->dbuffer); - url->dcount = 0; - return JB_ERR_MEMORY; - } - else if (url->dcount != 0) - { - - /* save a copy of the pointers in dvec */ - size = url->dcount * sizeof(*url->dvec); - - url->dvec = (char **)malloc(size); - if (NULL == url->dvec) - { - freez(url->spec); - freez(url->path); -#ifdef REGEX - freez(url->preg); -#endif /* def REGEX */ - freez(url->dbuffer); - url->dcount = 0; - return JB_ERR_MEMORY; - } - - memcpy(url->dvec, v, size); - } - } - - return JB_ERR_OK; - -} - - -/********************************************************************* - * - * Function : free_url_spec - * - * Description : Called from the "unloaders". Freez the url - * structure elements. - * - * Parameters : - * 1 : url = pointer to a url_spec structure. - * - * Returns : N/A - * - *********************************************************************/ -void free_url_spec(struct url_spec *url) -{ - if (url == NULL) return; - - freez(url->spec); - freez(url->dbuffer); - freez(url->dvec); - freez(url->path); -#ifdef REGEX - if (url->preg) - { - regfree(url->preg); - freez(url->preg); - } -#endif - -} - - -/********************************************************************* - * - * Function : url_match - * - * Description : Compare a URL against a URL pattern. - * - * Parameters : - * 1 : pattern = a URL pattern - * 2 : url = URL to match - * - * Returns : 0 iff the URL matches the pattern, else nonzero. - * - *********************************************************************/ -int url_match(const struct url_spec *pattern, - const struct http_request *url) -{ - return ((pattern->port == 0) || (pattern->port == url->port)) - && ((pattern->dbuffer == NULL) || (domain_match(pattern, url) == 0)) - && ((pattern->path == NULL) || -#ifdef REGEX - (regexec(pattern->preg, url->path, 0, NULL, 0) == 0) -#else - (strncmp(pattern->path, url->path, pattern->pathlen) == 0) -#endif - ); -} - - -/* - Local Variables: - tab-width: 3 - end: -*/ diff --git a/urlmatch.h b/urlmatch.h deleted file mode 100644 index 09fa6396..00000000 --- a/urlmatch.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef URLMATCH_H_INCLUDED -#define URLMATCH_H_INCLUDED -#define URLMATCH_H_VERSION "$Id: urlmatch.h,v 1.2 2002/03/24 13:25:43 swa Exp $" -/********************************************************************* - * - * File : $Source: /cvsroot/ijbswa/current/urlmatch.h,v $ - * - * Purpose : Declares functions to match URLs against URL - * patterns. - * - * Copyright : Written by and Copyright (C) 2001 the SourceForge - * Privoxy team. http://www.privoxy.org/ - * - * Based on the Internet Junkbuster originally written - * by and Copyright (C) 1997 Anonymous Coders and - * Junkbusters Corporation. http://www.junkbusters.com - * - * This program is free software; you can redistribute it - * and/or modify it under the terms of the GNU General - * Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will - * be useful, but WITHOUT ANY WARRANTY; without even the - * implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. See the GNU General Public - * License for more details. - * - * The GNU General Public License should be included with - * this file. If not, you can view it at - * http://www.gnu.org/copyleft/gpl.html - * or write to the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Revisions : - * $Log: urlmatch.h,v $ - * Revision 1.2 2002/03/24 13:25:43 swa - * name change related issues - * - * Revision 1.1 2002/01/17 20:53:46 jongfoster - * Moving all our URL and URL pattern parsing code to the same file - it - * was scattered around in filters.c, loaders.c and parsers.c. - * - * Providing a single, simple url_match(pattern,url) function - rather than - * the 3-line match routine which was repeated all over the place. - * - * Renaming free_url to free_url_spec, since it frees a struct url_spec. - * - * Providing parse_http_url() so that URLs can be parsed without faking a - * HTTP request line for parse_http_request() or repeating the parsing - * code (both of which were techniques that were actually in use). - * - * Standardizing that struct http_request is used to represent a URL, and - * struct url_spec is used to represent a URL pattern. (Before, URLs were - * represented as seperate variables and a partially-filled-in url_spec). - * - * - *********************************************************************/ - - -#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: -*/ diff --git a/vc_privoxy.dsp b/vc_junkbuster.dsp similarity index 61% rename from vc_privoxy.dsp rename to vc_junkbuster.dsp index 1baff50e..f1400507 100644 --- a/vc_privoxy.dsp +++ b/vc_junkbuster.dsp @@ -1,29 +1,24 @@ -# Microsoft Developer Studio Project File - Name="vc_privoxy" - Package Owner=<4> +# Microsoft Developer Studio Project File - Name="vc_junkbuster" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 -CFG=vc_privoxy - Win32 Debug with Win32 threads +CFG=vc_junkbuster - Win32 Release !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE -!MESSAGE NMAKE /f "vc_privoxy.mak". +!MESSAGE NMAKE /f "vc_junkbuster.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE -!MESSAGE NMAKE /f "vc_privoxy.mak"\ - CFG="vc_privoxy - Win32 Debug with Win32 threads" +!MESSAGE NMAKE /f "vc_junkbuster.mak" CFG="vc_junkbuster - Win32 Release" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE -!MESSAGE "vc_privoxy - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "vc_privoxy - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE "vc_privoxy - Win32 Release with Win32 threads" (based on\ - "Win32 (x86) Application") -!MESSAGE "vc_privoxy - Win32 Debug with Win32 threads" (based on\ - "Win32 (x86) Application") +!MESSAGE "vc_junkbuster - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "vc_junkbuster - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project @@ -33,7 +28,7 @@ CPP=cl.exe MTL=midl.exe RSC=rc.exe -!IF "$(CFG)" == "vc_privoxy - Win32 Release" +!IF "$(CFG)" == "vc_junkbuster - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 @@ -57,9 +52,9 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# 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 +# 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 -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug" +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 @@ -73,7 +68,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x809 /d "_DEBUG" @@ -83,70 +78,14 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# 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 - -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "vc_junkb" -# PROP BASE Intermediate_Dir "vc_junkb" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "vc_release_winthr" -# PROP Intermediate_Dir "vc_release_winthr" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 -# ADD BASE RSC /l 0x809 /d "NDEBUG" -# ADD RSC /l 0x809 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /machine:I386 -# 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 - -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "vc_junk0" -# PROP BASE Intermediate_Dir "vc_junk0" -# PROP BASE Ignore_Export_Lib 0 -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "vc_debug_winthr" -# PROP Intermediate_Dir "vc_debug_winthr" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c -# ADD CPP /nologo /MTd /W4 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 -# ADD BASE RSC /l 0x809 /d "_DEBUG" -# ADD RSC /l 0x809 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # 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 !ENDIF # Begin Target -# Name "vc_privoxy - Win32 Release" -# Name "vc_privoxy - Win32 Debug" -# Name "vc_privoxy - Win32 Release with Win32 threads" -# Name "vc_privoxy - Win32 Debug with Win32 threads" +# Name "vc_junkbuster - Win32 Release" +# Name "vc_junkbuster - Win32 Debug" # Begin Group "JunkBuster" # PROP Default_Filter "" @@ -180,34 +119,10 @@ SOURCE=.\cgi.h # End Source File # Begin Source File -SOURCE=.\cgiedit.c -# End Source File -# Begin Source File - -SOURCE=.\cgiedit.h -# End Source File -# Begin Source File - -SOURCE=.\cgisimple.c -# End Source File -# Begin Source File - -SOURCE=.\cgisimple.h -# End Source File -# Begin Source File - SOURCE=.\config.h # End Source File # Begin Source File -SOURCE=.\deanimate.c -# End Source File -# Begin Source File - -SOURCE=.\deanimate.h -# End Source File -# Begin Source File - SOURCE=.\errlog.c # End Source File # Begin Source File @@ -268,16 +183,49 @@ SOURCE=.\project.h # End Source File # Begin Source File -SOURCE=.\urlmatch.c +SOURCE=.\showargs.c # End Source File # Begin Source File -SOURCE=.\urlmatch.h +SOURCE=.\showargs.h # End Source File # End Group # Begin Group "Win32" # PROP Default_Filter "" +# Begin Group "File Copy" + +# PROP Default_Filter ".win" +# Begin Source File + +SOURCE=.\config.h.win + +!IF "$(CFG)" == "vc_junkbuster - Win32 Release" + +# Begin Custom Build - Copying config.h.win +InputDir=. +InputPath=.\config.h.win + +"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) $(InputDir)\config.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "vc_junkbuster - Win32 Debug" + +# Begin Custom Build - Copying config.h.win +InputDir=. +InputPath=.\config.h.win + +"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + copy $(InputPath) $(InputDir)\config.h + +# End Custom Build + +!ENDIF + +# End Source File +# End Group # Begin Source File SOURCE=.\cygwin.h @@ -296,6 +244,14 @@ SOURCE=.\w32res.h # End Source File # Begin Source File +SOURCE=.\w32rulesdlg.c +# End Source File +# Begin Source File + +SOURCE=.\w32rulesdlg.h +# End Source File +# Begin Source File + SOURCE=.\w32taskbar.c # End Source File # Begin Source File @@ -316,6 +272,10 @@ SOURCE=.\win32.h # PROP Default_Filter "rc,ico,bmp" # Begin Source File +SOURCE=.\icons\denyrule.ico +# End Source File +# Begin Source File + SOURCE=.\icons\ico00001.ico # End Source File # Begin Source File @@ -348,11 +308,15 @@ SOURCE=.\icons\ico00008.ico # End Source File # Begin Source File +SOURCE=.\icons\icon1.ico +# End Source File +# Begin Source File + SOURCE=.\icons\idle.ico # End Source File # Begin Source File -SOURCE=.\icons\privoxy.ico +SOURCE=.\icons\junkbust.ico # End Source File # Begin Source File @@ -365,27 +329,7 @@ SOURCE=.\w32.rc # Begin Source File SOURCE=.\pcre\chartables.c - -!IF "$(CFG)" == "vc_privoxy - Win32 Release" - # PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads" - -# PROP BASE Exclude_From_Build 1 -# PROP Exclude_From_Build 1 - -!ENDIF - # End Source File # Begin Source File diff --git a/vc_privoxy.dsw b/vc_junkbuster.dsw similarity index 68% rename from vc_privoxy.dsw rename to vc_junkbuster.dsw index 3bee9279..d119bd58 100644 --- a/vc_privoxy.dsw +++ b/vc_junkbuster.dsw @@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 5.00 ############################################################################### -Project: "vc_console"=".\vc_console.dsp" - Package Owner=<4> +Project: "console_junkbuster"=".\console_junkbuster.dsp" - Package Owner=<4> Package=<5> {{{ @@ -11,9 +11,6 @@ Package=<5> Package=<4> {{{ - Begin Project Dependency - Project_Dep_Name vc_dftables - End Project Dependency }}} ############################################################################### @@ -30,7 +27,7 @@ Package=<4> ############################################################################### -Project: "vc_privoxy"=".\vc_privoxy.dsp" - Package Owner=<4> +Project: "vc_junkbuster"=".\vc_junkbuster.dsp" - Package Owner=<4> Package=<5> {{{ @@ -38,9 +35,6 @@ Package=<5> Package=<4> {{{ - Begin Project Dependency - Project_Dep_Name vc_dftables - End Project Dependency }}} ############################################################################### diff --git a/w32.rc b/w32.rc index c8c09af7..e3ae74b9 100644 --- a/w32.rc +++ b/w32.rc @@ -4,8 +4,8 @@ * * Purpose : Windows GUI resource script. * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -31,31 +31,6 @@ * * 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". * @@ -144,15 +119,15 @@ * 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 */ @@ -168,47 +143,6 @@ IDI_IDLE ICON DISCARDABLE "icons/idle.ico" #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 */ @@ -217,23 +151,25 @@ IDR_TRAYMENU MENU DISCARDABLE BEGIN POPUP "Popup" BEGIN - MENUITEM "E&xit Privoxy", ID_FILE_EXIT + MENUITEM "E&xit JunkBuster", ID_FILE_EXIT MENUITEM SEPARATOR POPUP "&Options" BEGIN - MENUITEM "&Configuration...", ID_TOOLS_EDITCONFIG + MENUITEM "&Configuration...", ID_TOOLS_EDITJUNKBUSTER MENUITEM SEPARATOR MENUITEM "&Actions...", ID_TOOLS_EDITACTIONS - MENUITEM "&Filters...", ID_TOOLS_EDITFILTERS -#ifdef FEATURE_TRUST +#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 @@ -258,27 +194,29 @@ BEGIN END POPUP "&Options" BEGIN -#ifdef FEATURE_TOGGLE - MENUITEM "&Enable", ID_TOGGLE_ENABLED, CHECKED +#ifdef TOGGLE + MENUITEM "&Enable", ID_TOGGLE_IJB, CHECKED MENUITEM SEPARATOR -#endif /* def FEATURE_TOGGLE */ - MENUITEM "&Configuration...", ID_TOOLS_EDITCONFIG +#endif + MENUITEM "&Configuration...", ID_TOOLS_EDITJUNKBUSTER MENUITEM SEPARATOR MENUITEM "&Actions...", ID_TOOLS_EDITACTIONS - MENUITEM "&Filters...", ID_TOOLS_EDITFILTERS -#ifdef FEATURE_TRUST +#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 @@ -300,4 +238,70 @@ BEGIN "C", ID_EDIT_COPY, VIRTKEY, CONTROL, NOINVERT END +#ifdef WIN_GUI_EDIT + +/* + * Icons + * + * Icon with lowest ID value placed first to ensure application icon + * remains consistent on all systems. + */ +IDI_DENYRULE ICON DISCARDABLE "icons/denyrule.ico" +IDI_ALLOWRULE ICON DISCARDABLE "icons/icon1.ico" + +/* + * Dialog + */ + +IDD_RULES DIALOG DISCARDABLE 0, 0, 239, 225 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Blockers" +FONT 8, "MS Sans Serif" +BEGIN + GROUPBOX "New Rule",IDC_STATIC,5,5,230,55 + LTEXT "For:",IDC_STATIC,10,15,13,8 + EDITTEXT IDC_NEW,10,25,220,12,ES_AUTOHSCROLL + COMBOBOX IDC_ACTION,10,40,75,37,CBS_DROPDOWNLIST | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "C&reate!",IDC_CREATE,90,40,50,14 + GROUPBOX "Rules",IDC_STATIC,5,65,230,135 + CONTROL "List1",IDC_RULES,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_EDITLABELS | WS_BORDER | + WS_TABSTOP,10,75,220,100 + PUSHBUTTON "Move &Up",IDC_MOVEUP,10,180,50,14,WS_DISABLED + PUSHBUTTON "Move &Down",IDC_MOVEDOWN,65,180,50,14,WS_DISABLED + PUSHBUTTON "&Delete",IDC_DELETE,120,180,50,14,WS_DISABLED + PUSHBUTTON "&Save",IDC_SAVE,130,205,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,185,205,50,14 +END + + +/* + * DESIGNINFO + */ + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_RULES, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 232 + TOPMARGIN, 7 + BOTTOMMARGIN, 218 + END +END +#endif /* def APSTUDIO_INVOKED */ + + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_NEW_BLOCKER "Create rule for ""%s""..." +END +#endif /* def WIN_GUI_EDIT */ + #endif /* English (U.S.) resources */ diff --git a/w32log.c b/w32log.c index 0948e4b0..97e0bf14 100644 --- a/w32log.c +++ b/w32log.c @@ -1,4 +1,4 @@ -const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster Exp $"; +const char w32log_rcs[] = "$Id: w32log.c,v 1.10 2001/05/31 21:37:11 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32log.c,v $ @@ -6,8 +6,8 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E * Purpose : Functions for creating and destroying the log window, * ouputting strings, processing messages and so on. * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -32,48 +32,6 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E * * Revisions : * $Log: w32log.c,v $ - * Revision 1.22 2002/03/24 12:48:23 jongfoster - * Fixing doc links - * - * Revision 1.21 2002/03/24 12:07:35 jongfoster - * Consistern name for filters file - * - * Revision 1.20 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.19 2002/01/17 21:04:17 jongfoster - * Replacing hard references to the URL of the config interface - * with #defines from project.h - * - * Revision 1.18 2001/11/30 23:37:24 jongfoster - * Renaming the Win32 config file to config.txt - this is almost the - * same as the corresponding UNIX name "config" - * - * Revision 1.17 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.16 2001/08/01 19:58:12 jongfoster - * Fixing documentation filenames in help menu, and making status - * option work without needing the "Junkbuster Status.URL" file. - * - * Revision 1.15 2001/07/30 22:08:36 jongfoster - * Tidying up #defines: - * - All feature #defines are now of the form FEATURE_xxx - * - Permanently turned off WIN_GUI_EDIT - * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS - * - * Revision 1.14 2001/07/29 18:47:05 jongfoster - * Adding missing #include "loadcfg.h" - * - * Revision 1.13 2001/07/19 19:15:14 haroon - * - Added a FIXME for EditFile but didn't fix :-) - * - * Revision 1.12 2001/07/13 14:04:59 oes - * Removed all #ifdef PCRS - * - * 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". * @@ -156,12 +114,12 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E #include "project.h" #include "w32log.h" #include "w32taskbar.h" +#include "w32rulesdlg.h" #include "win32.h" #include "w32res.h" #include "jcc.h" #include "miscutil.h" #include "errlog.h" -#include "loadcfg.h" const char w32res_h_rcs[] = W32RES_H_VERSION; @@ -240,10 +198,12 @@ int g_nFontSize = DEFAULT_LOG_FONT_SIZE; /* 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 */ @@ -350,14 +310,14 @@ BOOL InitLogWindow(void) g_hiconIdle = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IDLE)); for (i = 0; i < ANIM_FRAMES; i++) { - g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ANIMATED1 + i)); + g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER1 + i)); } - g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAINICON)); + g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER)); /* Create the user interface */ g_hwndLogFrame = CreateLogWindow(g_hInstance, g_nCmdShow); g_hwndTray = CreateTrayWindow(g_hInstance); - TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Privoxy"); + TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Junkbuster"); /* Create pattern matching buffers (for highlighting */ LogCreatePatternMatchingBuffers(); @@ -778,7 +738,7 @@ void LogClipBuffer(void) *********************************************************************/ HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance) { - static const char *szWndName = "PrivoxyLogOwner"; + static const char *szWndName = "JunkbusterLogLogOwner"; WNDCLASS wc; HWND hwnd; @@ -841,11 +801,12 @@ LRESULT CALLBACK LogOwnerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM *********************************************************************/ HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow) { - static const char *szWndName = "PrivoxyLogWindow"; - static const char *szWndTitle = "Privoxy"; + static const char *szWndName = "JunkbusterLogWindow"; + static const char *szWndTitle = "Junkbuster"; HWND hwnd = NULL; HWND hwndOwner = (g_bShowOnTaskBar) ? NULL : CreateHiddenLogOwnerWindow(hInstance); + HWND hwndChild = NULL; RECT rcClient; WNDCLASSEX wc; @@ -978,11 +939,9 @@ void ShowLogWindow(BOOL bShow) * 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 * @@ -1022,6 +981,9 @@ void OnLogRButtonUp(int nModifier, int x, int y) if (hMenu != NULL) { HMENU hMenuPopup = GetSubMenu(hMenu, 0); +#ifdef WIN_GUI_EDIT + char *szURL; +#endif /* def WIN_GUI_EDIT */ /* Check if there is a selection */ CHARRANGE range; @@ -1035,6 +997,40 @@ void OnLogRButtonUp(int nModifier, int x, int y) EnableMenuItem(hMenuPopup, ID_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED); } +#ifdef WIN_GUI_EDIT + /* Check if cursor is over a link */ + szURL = LogGetURLUnderCursor(); + if (szURL) + { + MENUITEMINFO item; + TCHAR szMenuItemTemplate[1000]; + char *szMenuItem; + + memset(&item, 0, sizeof(item)); + item.cbSize = sizeof(item); + item.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; + item.fType = MFT_STRING; + item.fState = MFS_ENABLED; + item.wID = ID_NEW_BLOCKER; + + /* Put the item into the menu */ + memset(szMenuItemTemplate, 0, sizeof(szMenuItemTemplate)); + LoadString(g_hInstance, IDS_NEW_BLOCKER, szMenuItemTemplate, sizeof(szMenuItemTemplate) / sizeof(szMenuItemTemplate[0])); + + szMenuItem = (char *)malloc(strlen(szMenuItemTemplate) + strlen(szURL) + 1); + sprintf(szMenuItem, szMenuItemTemplate, szURL); + + item.dwTypeData = szMenuItem; + item.cch = strlen(szMenuItem); + + InsertMenuItem(hMenuPopup, 1, TRUE, &item); + + SetDefaultRule(szURL); + + free(szURL); + } +#endif /* def WIN_GUI_EDIT */ + /* Display the popup */ TrackPopupMenu(hMenuPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, x, y, 0, g_hwndLogFrame, NULL); DestroyMenu(hMenu); @@ -1095,9 +1091,9 @@ void OnLogCommand(int nCommand) /* SaveLogSettings(); */ break; -#ifdef FEATURE_TOGGLE +#ifdef TOGGLE /* by haroon - change toggle to its opposite value */ - case ID_TOGGLE_ENABLED: + case ID_TOGGLE_IJB: g_bToggleIJB = !g_bToggleIJB; if (g_bToggleIJB) { @@ -1108,9 +1104,9 @@ void OnLogCommand(int nCommand) log_error(LOG_LEVEL_INFO, "Now toggled OFF."); } break; -#endif /* def FEATURE_TOGGLE */ +#endif - case ID_TOOLS_EDITCONFIG: + case ID_TOOLS_EDITJUNKBUSTER: EditFile(configfile); break; @@ -1118,34 +1114,42 @@ void OnLogCommand(int nCommand) 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: @@ -1173,20 +1177,22 @@ void OnLogInitMenu(HMENU hmenu) { /* Only enable editors if there is a file to edit */ EnableMenuItem(hmenu, ID_TOOLS_EDITACTIONS, MF_BYCOMMAND | (g_actions_file ? MF_ENABLED : MF_GRAYED)); - EnableMenuItem(hmenu, ID_TOOLS_EDITFILTERS, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED)); -#ifdef FEATURE_TRUST +#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 } diff --git a/w32log.h b/w32log.h index 2634a95c..f9072746 100644 --- a/w32log.h +++ b/w32log.h @@ -1,6 +1,6 @@ -#ifndef W32LOG_H_INCLUDED -#define W32LOG_H_INCLUDED -#define W32LOG_H_VERSION "$Id: w32log.h,v 1.9 2002/03/24 12:03:47 jongfoster Exp $" +#ifndef _W32LOG_H +#define _W32LOG_H +#define W32LOG_H_VERSION "$Id: w32log.h,v 1.4 2001/05/31 21:37:11 jongfoster Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32log.h,v $ @@ -8,8 +8,8 @@ * Purpose : Functions for creating and destroying the log window, * ouputting strings, processing messages and so on. * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -34,25 +34,6 @@ * * 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". * @@ -130,13 +111,16 @@ extern int g_nFontSize; /* 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); @@ -151,7 +135,7 @@ extern const char w32log_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef W32LOG_H_INCLUDED */ +#endif /* ndef _W32LOG_H */ /* diff --git a/w32res.h b/w32res.h index 62308cf2..1a31321e 100644 --- a/w32res.h +++ b/w32res.h @@ -1,14 +1,14 @@ -#ifndef W32RES_H_INCLUDED -#define W32RES_H_INCLUDED -#define W32RES_H_VERSION "$Id: w32res.h,v 1.12 2002/03/24 12:07:36 jongfoster Exp $" +#ifndef _W32RES_H +#define _W32RES_H +#define W32RES_H_VERSION "$Id: w32res.h,v 1.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 @@ -34,28 +34,6 @@ * * 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". * @@ -113,25 +91,49 @@ * *********************************************************************/ +#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 @@ -142,18 +144,21 @@ #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 in VC++. @@ -165,7 +170,7 @@ #define ID_EDIT_COPY 30000 -#endif /* ndef W32RES_H_INCLUDED */ +#endif /* ndef _W32RES_H */ /* Local Variables: diff --git a/w32rulesdlg.c b/w32rulesdlg.c new file mode 100644 index 00000000..75168620 --- /dev/null +++ b/w32rulesdlg.c @@ -0,0 +1,548 @@ +const char w32rulesdlg_rcs[] = "$Id: w32rulesdlg.c,v 1.3 2001/05/22 18:56:28 oes Exp $"; +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/w32rulesdlg.c,v $ + * + * Purpose : A dialog to allow GUI editing of the rules. + * Unfinished. + * + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net + * + * Written by and Copyright (C) 1999 Adam Lock + * + * + * 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 + * + * + *********************************************************************/ + +#include "config.h" + +#include + +#include +#include + +#include "w32res.h" +#include "w32rulesdlg.h" +#include "win32.h" + +#ifdef __MINGW32__ +#include "cygwin.h" +#endif + +const char w32rulesdlg_h_rcs[] = W32RULESDLG_H_VERSION; + + +#ifndef _WIN_CONSOLE /* entire file */ +#ifdef WIN_GUI_EDIT /* entire file */ + + +const int nSmallIconWidth = 16; +const int nSmallIconHeight = 16; + +static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +static HIMAGELIST g_hImageList = NULL; +static char *g_pszDefaultRule; +static BOOL g_bDirty = FALSE; + + + +/********************************************************************* + * + * Function : ShowRulesDialog + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndParent = (what?) + * + * Returns : (Please fill me in!) + * + *********************************************************************/ +int ShowRulesDialog(HWND hwndParent) +{ + DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_RULES), hwndParent, DialogProc); + return TRUE; + +} + + +/********************************************************************* + * + * Function : SetDefaultRule + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : pszRule = (what?) + * + * Returns : N/A + * + *********************************************************************/ +void SetDefaultRule(const char *pszRule) +{ + if (pszRule == NULL) + { + if (g_pszDefaultRule) + { + free(g_pszDefaultRule); + g_pszDefaultRule = NULL; + } + } + else + { + g_pszDefaultRule = strdup(pszRule); + } + +} + + +#define IMAGE_ALLOW 0 +#define IMAGE_DENY 1 + +/********************************************************************* + * + * Function : InsertRule + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndListView = (what?) + * 2 : pszRule = (what?) + * 3 : bAllow = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void InsertRule(HWND hwndListView, const char *pszRule, BOOL bAllow) +{ + LVITEM item; + item.mask = LVIF_TEXT | LVIF_IMAGE; + item.pszText = (char *)pszRule; + item.iItem = ListView_GetItemCount(hwndListView) + 1; + item.iSubItem = 0; + item.iImage = bAllow ? IMAGE_ALLOW : IMAGE_DENY; + ListView_InsertItem(hwndListView, &item); + /* TODO add subitem for whether the rule is always or never */ + +} + + +/********************************************************************* + * + * Function : SetDirty + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : bDirty = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void SetDirty(BOOL bDirty) +{ + g_bDirty = bDirty; + /* TODO Change some values */ + +} + + +/********************************************************************* + * + * Function : OnInitDialog + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnInitDialog(HWND hwndDlg) +{ + LVCOLUMN aCols[2]; + HWND hwndListView; + RECT rcListView; + int cx; + + if (g_hImageList == NULL) + { + /* Create image list and add icons */ + HICON hIconDeny = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_DENYRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0); + HICON hIconAllow = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ALLOWRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0); + g_hImageList = ImageList_Create(nSmallIconWidth, nSmallIconHeight, ILC_COLOR | ILC_MASK, 0, 10); + ImageList_AddIcon(g_hImageList, hIconAllow); + ImageList_AddIcon(g_hImageList, hIconDeny); + } + + /* Set the default rule value if there is one */ + if (g_pszDefaultRule) + { + SetDlgItemText(hwndDlg, IDC_NEW, g_pszDefaultRule); + SetDefaultRule(NULL); + } + + /* Initialise the list view */ + hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + ListView_SetImageList(hwndListView, g_hImageList, LVSIL_SMALL); + GetClientRect(hwndListView, &rcListView); + cx = rcListView.right - rcListView.left; + aCols[0].mask = LVCF_TEXT | LVCF_WIDTH; + aCols[0].pszText = "Rule"; + aCols[0].cx = (70 * cx) / 100; + aCols[1].mask = LVCF_TEXT | LVCF_WIDTH; + aCols[1].pszText = "Applies when"; + aCols[1].cx = cx - aCols[0].cx; + ListView_InsertColumn(hwndListView, 0, &aCols[0]); + ListView_InsertColumn(hwndListView, 1, &aCols[1]); + + /* Read and add rules to the list */ + /* TODO */ + InsertRule(hwndListView, "Test rule 1", TRUE); + InsertRule(hwndListView, "Test rule 2", TRUE); + InsertRule(hwndListView, "Test rule 3", FALSE); + InsertRule(hwndListView, "Test rule 4", FALSE); + +} + + +/********************************************************************* + * + * Function : GetFirstSelectedItem + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : (Please fill me in!) + * + *********************************************************************/ +static int GetFirstSelectedItem(HWND hwndDlg) +{ + /* Check for selected items */ + HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + int nItem = -1; + do + { + nItem = ListView_GetNextItem(hwndListView, nItem, LVNI_SELECTED); + if (nItem >= 0) + { + return nItem; + } + } while (nItem >= 0); + return -1; + +} + + +/********************************************************************* + * + * Function : OnRulesItemChanged + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnRulesItemChanged(HWND hwndDlg) +{ + int nItem = GetFirstSelectedItem(hwndDlg); + HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + int nItems = ListView_GetItemCount(hwndListView); + BOOL bHaveSelection = (nItem >= 0) ? TRUE : FALSE; + BOOL bMoveUp = (bHaveSelection && nItem > 0) ? TRUE : FALSE; + BOOL bMoveDown = (bHaveSelection && nItem < nItems - 1) ? TRUE : FALSE; + + /* Enable/disable buttons */ + EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), bHaveSelection); + EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEUP), bMoveUp); + EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEDOWN), bMoveDown); + +} + + +/********************************************************************* + * + * Function : MoveRules + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : bMoveUp = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void MoveRules(HWND hwndDlg, BOOL bMoveUp) +{ +} + + +/********************************************************************* + * + * Function : OnMoveRuleUpClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnMoveRuleUpClick(HWND hwndDlg) +{ +} + + +/********************************************************************* + * + * Function : OnMoveRuleDownClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnMoveRuleDownClick(HWND hwndDlg) +{ +} + + +/********************************************************************* + * + * Function : OnCreateRuleClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnCreateRuleClick(HWND hwndDlg) +{ +} + + +/********************************************************************* + * + * Function : OnDeleteRuleClick + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnDeleteRuleClick(HWND hwndDlg) +{ + /* Get selection and remove it */ + int nItem = GetFirstSelectedItem(hwndDlg); + if (nItem >= 0) + { + LVITEM item; + HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES); + item.mask = LVIF_PARAM; + item.iItem = nItem; + item.iSubItem = 0; + ListView_GetItem(hwndListView, &item); + /* TODO erase data stored with item */ + ListView_DeleteItem(hwndListView, nItem); + } + +} + + +/********************************************************************* + * + * Function : OnCommand + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : nCommand = (what?) + * 3 : nNotifyCode = (what?) + * 4 : hwndItem = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnCommand(HWND hwndDlg, int nCommand, int nNotifyCode, HWND hwndItem) +{ + switch (nCommand) + { + case IDCANCEL: + case IDC_SAVE: + EndDialog(hwndDlg, IDOK); + break; + case IDC_CREATE: + if (nNotifyCode == BN_CLICKED) + { + OnCreateRuleClick(hwndDlg); + } + break; + case IDC_DELETE: + if (nNotifyCode == BN_CLICKED) + { + OnDeleteRuleClick(hwndDlg); + } + break; + case IDC_MOVEUP: + if (nNotifyCode == BN_CLICKED) + { + OnMoveRuleUpClick(hwndDlg); + } + break; + case IDC_MOVEDOWN: + if (nNotifyCode == BN_CLICKED) + { + OnMoveRuleDownClick(hwndDlg); + } + break; + } + +} + + +/********************************************************************* + * + * Function : OnNotify + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : nIdCtrl = (what?) + * 3 : pnmh = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnNotify(HWND hwndDlg, int nIdCtrl, LPNMHDR pnmh) +{ + switch (nIdCtrl) + { + case IDC_RULES: + switch (pnmh->code) + { + case LVN_ITEMCHANGED: + OnRulesItemChanged(hwndDlg); + break; + } + break; + } + +} + + +/********************************************************************* + * + * Function : OnDestroy + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * + * Returns : N/A + * + *********************************************************************/ +static void OnDestroy(HWND hwndDlg) +{ + /* TODO any destruction cleanup */ + +} + + +/********************************************************************* + * + * Function : DialogProc + * + * Description : (Please fill me in!) + * + * Parameters : + * 1 : hwndDlg = (what?) + * 2 : uMsg = (what?) + * 3 : wParam = (what?) + * 4 : lParam = (what?) + * + * Returns : (Please fill me in!) + * + *********************************************************************/ +static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + OnInitDialog(hwndDlg); + return TRUE; + + case WM_DESTROY: + OnDestroy(hwndDlg); + return TRUE; + + case WM_COMMAND: + OnCommand(hwndDlg, LOWORD(wParam), HIWORD(wParam), (HWND) lParam); + break; + + case WM_NOTIFY: + OnNotify(hwndDlg, (int) wParam, (LPNMHDR) lParam); + break; + } + return FALSE; + +} + +#endif /* def WIN_GUI_EDIT - entire file */ +#endif /* ndef _WIN_CONSOLE - entire file */ + +/* + Local Variables: + tab-width: 3 + end: +*/ diff --git a/w32rulesdlg.h b/w32rulesdlg.h new file mode 100644 index 00000000..9fe945de --- /dev/null +++ b/w32rulesdlg.h @@ -0,0 +1,72 @@ +#ifndef _W32RULESDLG_H +#define _W32RULESDLG_H +#define W32RULESDLG_H_VERSION "$Id: w32rulesdlg.h,v 1.1.1.1 2001/05/15 13:59:08 oes Exp $" +/********************************************************************* + * + * File : $Source: /cvsroot/ijbswa/current/w32rulesdlg.h,v $ + * + * Purpose : A dialog to allow GUI editing of the rules. + * Unfinished. + * + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net + * + * Written by and Copyright (C) 1999 Adam Lock + * + * + * 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 + * + * + *********************************************************************/ + + +#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: +*/ diff --git a/w32taskbar.c b/w32taskbar.c index b4ff9241..63ac0d35 100644 --- a/w32taskbar.c +++ b/w32taskbar.c @@ -1,4 +1,4 @@ -const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongfoster Exp $"; +const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.2 2001/05/20 15:07:54 jongfoster Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/w32taskbar.c,v $ @@ -6,8 +6,8 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf * Purpose : Functions for creating, setting and destroying the * workspace tray icon * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -32,15 +32,6 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf * * Revisions : * $Log: w32taskbar.c,v $ - * Revision 1.5 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.4 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.3 2001/05/22 18:56:28 oes - * CRLF -> LF - * * Revision 1.2 2001/05/20 15:07:54 jongfoster * File is now ignored if _WIN_CONSOLE is defined. * @@ -77,8 +68,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar * * Function : CreateTrayWindow * - * Description : Creates and returns the invisible window responsible - * for processing tray messages. + * Description : Creates and returns the invisible window responsible for processing tray messages. * * Parameters : * 1 : hInstance = instance handle of this application @@ -89,7 +79,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar HWND CreateTrayWindow(HINSTANCE hInstance) { WNDCLASS wc; - static const char *szWndName = "PrivoxyTrayWindow"; + static const char *szWndName = "JunkbusterTrayWindow"; wc.style = 0; wc.lpfnWndProc = TrayProc; @@ -244,7 +234,7 @@ LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_TRAYMSG: { - /* UINT uID = (UINT) wParam; */ + UINT uID = (UINT) wParam; UINT uMouseMsg = (UINT) lParam; if (uMouseMsg == WM_RBUTTONDOWN) diff --git a/w32taskbar.h b/w32taskbar.h index 19450614..9ba21fbd 100644 --- a/w32taskbar.h +++ b/w32taskbar.h @@ -1,15 +1,15 @@ -#ifndef W32TASKBAR_H_INCLUDED -#define W32TASKBAR_H_INCLUDED -#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.3 2002/03/24 12:03:47 jongfoster Exp $" +#ifndef _W32TASKBAR_H +#define _W32TASKBAR_H +#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.1 2001/05/13 21:57:07 administrator Exp $" /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/w32taskbar.h,v $ + * File : $Source: /home/administrator/cvs/ijb/w32taskbar.h,v $ * * Purpose : Functions for creating, setting and destroying the * workspace tray icon * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -34,16 +34,6 @@ * * 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 - * * *********************************************************************/ @@ -65,7 +55,7 @@ extern const char w32taskbar_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef W32TASKBAR_H_INCLUDED */ +#endif /* ndef _W32TASKBAR_H */ /* diff --git a/win32.c b/win32.c index d9fcec3f..2252dc1f 100644 --- a/win32.c +++ b/win32.c @@ -1,12 +1,12 @@ -const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp $"; +const char win32_rcs[] = "$Id: win32.c,v 1.1 2001/05/13 21:57:07 administrator Exp $"; /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/win32.c,v $ + * File : $Source: /home/administrator/cvs/ijb/win32.c,v $ * * Purpose : Win32 User Interface initialization and message loop * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -31,28 +31,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp * * Revisions : * $Log: win32.c,v $ - * Revision 1.7 2002/03/24 12:03:47 jongfoster - * Name change - * - * Revision 1.6 2002/03/16 21:53:28 jongfoster - * VC++ Heap debug option - * - * Revision 1.5 2002/03/04 23:47:30 jongfoster - * - Rewritten, simpler command-line pre-parser - * - not using raise(SIGINT) any more - * - * Revision 1.4 2001/11/30 21:29:33 jongfoster - * Fixing a warning - * - * Revision 1.3 2001/11/16 00:46:31 jongfoster - * Fixing compiler warnings - * - * Revision 1.2 2001/07/29 19:32:00 jongfoster - * Renaming _main() [mingw32 only] to real_main(), for ANSI compliance. - * - * Revision 1.1.1.1 2001/05/15 13:59:08 oes - * Initial import of version 2.9.3 source tree - * * *********************************************************************/ @@ -65,7 +43,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp #include "project.h" #include "jcc.h" -#include "miscutil.h" /* Uncomment this if you want to build Win32 as a console app */ /* #define _WIN_CONSOLE */ @@ -75,26 +52,21 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp #include #include -#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) -/* Visual C++ Heap debugging */ -#include -#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */ - #include "win32.h" const char win32_h_rcs[] = WIN32_H_VERSION; const char win32_blurb[] = -"Privoxy version " VERSION " for Windows\n" -"Copyright (C) 2000-2002 by members of the Privoxy Team\n" -"Copyright (C) 1997-8 by Junkbusters Corp.\n" -"This is free software; it may be used and copied under the\n" -"GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n" +"Internet Junkbuster Proxy(TM) Version " VERSION " for Windows is Copyright (C) 1997-8\n" +"by Junkbusters Corp. This is free software; it may be used and copied under\n" +"the GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n" "This program comes with ABSOLUTELY NO WARRANTY OF ANY KIND.\n" "\n" "For information about how to to configure the proxy and your browser, see\n" -" " HOME_PAGE_URL "\n" -"\n"; +" " REDIRECT_URL "win\n" +"\n" +"The Internet Junkbuster Proxy(TM) is running and ready to serve!\n" +""; #ifdef _WIN_CONSOLE @@ -117,12 +89,12 @@ static void __cdecl UserInterfaceThread(void *); * Description : M$ Windows "main" routine: * parse the `lpCmdLine' param into main's argc and argv variables, * start the user interface thread (for the systray window), and - * call main (i.e. patch execution into normal startup). + * call main (i.e. patch execution into normal IJB startup). * * Parameters : - * 1 : hInstance = instance handle of this execution - * 2 : hPrevInstance = instance handle of previous execution - * 3 : lpCmdLine = command line string which started us + * 1 : hInstance = instance handle of this IJB execution + * 2 : hPrevInstance = instance handle of previous IJB execution + * 3 : lpCmdLine = command line string which started IJB * 4 : nCmdShow = window show value (MIN, MAX, NORMAL, etc...) * * Returns : `main' never returns, so WinMain will also never return. @@ -130,64 +102,56 @@ static void __cdecl UserInterfaceThread(void *); *********************************************************************/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + int argc = 0; int i; int res; - int argc = 1; - const char *argv[3]; + char **argv = NULL; + char *pszArgs = NULL; + char *pszLastTok; char szModule[MAX_PATH+1]; #ifndef _WIN_CONSOLE HANDLE hInitCompleteEvent = NULL; #endif + /* Split command line into arguments */ + pszArgs = (char *)malloc(strlen(lpCmdLine) + 1); + strcpy(pszArgs, lpCmdLine); -#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) -#if 0 - /* Visual C++ Heap debugging */ - - /* Get current flag*/ - int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ); - - /* Turn on leak-checking bit */ - tmpFlag |= _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF; - - /* Turn off CRT block checking bit */ - tmpFlag &= ~(_CRTDBG_CHECK_CRT_DF | _CRTDBG_DELAY_FREE_MEM_DF); - - /* Set flag to the new value */ - _CrtSetDbgFlag( tmpFlag ); -#endif -#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */ - - /* - * Cheat in parsing the command line. We only ever have at most one - * paramater, which may optionally be specified inside double quotes. - */ + GetModuleFileName(hInstance, szModule, MAX_PATH); - if (lpCmdLine != NULL) - { - /* Make writable copy */ - lpCmdLine = strdup(lpCmdLine); - } - if (lpCmdLine != NULL) + /* Count number of spaces */ + argc = 1; + if (strlen(pszArgs) > 0) { - chomp(lpCmdLine); - i = strlen(lpCmdLine); - if ((i >= 2) && (lpCmdLine[0] == '\"') && (lpCmdLine[i - 1] == '\"')) + pszLastTok = pszArgs; + do { - lpCmdLine[i - 1] = '\0'; - lpCmdLine++; - } - if (lpCmdLine[0] == '\0') - { - lpCmdLine = NULL; - } + argc++; + pszLastTok = strchr(pszLastTok+1, ' '); + } while (pszLastTok); } - GetModuleFileName(hInstance, szModule, MAX_PATH); + /* Allocate array of strings */ + argv = (char **)malloc(sizeof(char *) * argc); + + /* step through command line replacing spaces with zeros, initialise array */ argv[0] = szModule; - argv[1] = lpCmdLine; - argv[2] = NULL; - argc = ((lpCmdLine != NULL) ? 2 : 1); + i = 1; + pszLastTok = pszArgs; + do + { + argv[i] = pszLastTok; + pszLastTok = strchr(pszLastTok+1, ' '); + if (pszLastTok) + { + while (*pszLastTok != '\0' && *pszLastTok == ' ') + { + *pszLastTok = '\0'; + pszLastTok++; + } + } + i++; + } while (pszLastTok && *pszLastTok != '\0'); #ifndef _WIN_CONSOLE /* Create a user-interface thread and wait for it to initialise */ @@ -200,11 +164,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine #endif #ifdef __MINGW32__ - res = real_main( argc, argv ); + res = _main( argc, argv ); #else res = main( argc, argv ); #endif + /* Cleanup */ + free(argv); + free(pszArgs); + return res; } @@ -238,7 +206,7 @@ void InitWin32(void) if (WSAStartup(wVersionRequested, &wsaData) != 0) { #ifndef _WIN_CONSOLE - MessageBox(NULL, "Cannot initialize WinSock library", "Privoxy Error", + MessageBox(NULL, "Cannot initialize WinSock library", "Internet JunkBuster Error", MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST); #endif exit(1); @@ -262,7 +230,7 @@ void InitWin32(void) * Description : User interface thread. WinMain will wait for us to set * the hInitCompleteEvent before patching over to `main'. * This ensures the systray window is active before beginning - * operations. + * IJB operations. * * Parameters : * 1 : pData = pointer to `hInitCompleteEvent'. @@ -290,7 +258,7 @@ static void __cdecl UserInterfaceThread(void *pData) TermLogWindow(); /* Time to die... */ - exit(0); + raise(SIGINT); } diff --git a/win32.h b/win32.h index 7c699dc3..3011f478 100644 --- a/win32.h +++ b/win32.h @@ -1,14 +1,14 @@ -#ifndef WIN32_H_INCLUDED -#define WIN32_H_INCLUDED -#define WIN32_H_VERSION "$Id: win32.h,v 1.4 2002/03/24 12:03:47 jongfoster Exp $" +#ifndef _WIN32_H +#define _WIN32_H +#define WIN32_H_VERSION "$Id: win32.h,v 1.1 2001/05/13 21:57:07 administrator Exp $" /********************************************************************* * - * File : $Source: /cvsroot/ijbswa/current/win32.h,v $ + * File : $Source: /home/administrator/cvs/ijb/win32.h,v $ * * Purpose : Win32 User Interface initialization and message loop * - * Copyright : Written by and Copyright (C) 2001-2002 members of - * the Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001 the SourceForge + * IJBSWA team. http://ijbswa.sourceforge.net * * Written by and Copyright (C) 1999 Adam Lock * @@ -33,22 +33,6 @@ * * 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 - * * *********************************************************************/ @@ -78,8 +62,8 @@ extern const char win32_h_rcs[]; } /* extern "C" */ #endif -#endif /* ndef WIN32_H_INCLUDED */ - +#endif /* ndef _WIN32_H */ + /* Local Variables: tab-width: 3 -- 2.49.0